Light を回転しながら描画する

自作の Rotate() 関数で Light を回転しながら描画します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. ライトの座標は、次のように設定します。
    D3DXVECTOR3 を直接回転する関数が見つからないので、手っ取り早く自前の関数を作成しました。
        D3DXVECTOR3     vLight(2,-3,2);     // ライトの座標
    
        light.Direction = vLight;
        g_pDEV->SetLight(0,&light);
        
  2. D3DXVECTOR3 を直接回転する Rotate() 関数です。
    *Vect で渡された座標を、中心座標を 0,0,0 にして rt(ラジアン角)度回転します。
    xyz には回転の中心軸を「0:x, 1:y, 2:z」で指定して下さい。
        void  Rotate(D3DXVECTOR3 *Vect,float rt,int xyz)
        {   float   px,py,pz;
    
            px= Vect->x;
            py= Vect->y;
            pz= Vect->z;
            switch(xyz)
            {   case 0: Vect->z= (float)(pz*cos(rt)-py*sin(rt));
                        Vect->y= (float)(pz*sin(rt)+py*cos(rt));
                        return;
                case 1: Vect->x= (float)(px*cos(rt)-pz*sin(rt));
                        Vect->z= (float)(px*sin(rt)+pz*cos(rt));
                        return;
                case 2: Vect->y= (float)(py*cos(rt)-px*sin(rt));
                        Vect->x= (float)(py*sin(rt)+px*cos(rt));
                        return;
            }
        }
        
    例えば、vLight(2,-3,2) をY軸を中心に 0.02f 度回転するときは、次のように書きます。
    Rotate(&vLight,0.02f,1);
  3. Draw() 関数では SetupMatrices() で光源の座標を回転しながら DrawSubset() でモデルを描画します。
        void Draw(void)
        {
            if (FpsFlag)
            {   FpsFlag = false;
                //黒で塗りつぶして消去
                g_pDEV->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
                if (SUCCEEDED(g_pDEV->BeginScene()))
                {   //描画環境の設定
                    SetupMatrices();
                    g_pMesh->DrawSubset(0);
                    g_pDEV->EndScene();
                }
                g_pDEV->Present(NULL,NULL,NULL,NULL);
            }
        }
        
  4. 光源の座標を回転する SetupMatrices() 関数です。
        void  SetupMatrices(void)
        {   RECT            rect;
            D3DXMATRIX      matWorld;
            D3DXMATRIX      matView;
            D3DXMATRIX      matProj;
    
            GetClientRect(g_hWnd,&rect);
            Rotate(&vLight,0.02f,1);        // ライトの座標を回転
            light.Direction = vLight;       // 座標の設定
            g_pDEV->SetLight(0,&light);     // ライトを設定
    
            D3DXMatrixIdentity(&matWorld);
            g_pDEV->SetTransform(D3DTS_WORLD,&matWorld);
            //View 座標の設定
            D3DXMatrixLookAtLH(&matView,&ViewForm,
                           &D3DXVECTOR3(0.0f,0.0f,0.0f),&D3DXVECTOR3(0.0f,1.0f,0.0f));
            g_pDEV->SetTransform(D3DTS_VIEW,&matView);
            //透視変換の設定
            D3DXMatrixPerspectiveFovLH(&matProj,D3DXToRadian(45.0f),(float)rect.right/(float)rect.bottom,1,50);
            g_pDEV->SetTransform(D3DTS_PROJECTION,&matProj);
        }
        

前田稔(Maeda Minoru)の超初心者のプログラム入門

超初心者のプログラム入門(DirectX9 game program)

超初心者のプログラム入門(DirectX10 game program)