球を光源で照らして View 座標を回転する

球を光源で照らして View 座標を回転しながら描画します。
ライトは DIRECT3DDEVICE9->SetLight() で、マテリアルは DIRECT3DDEVICE9->SetMaterial() で設定します。
material の設定と View 座標を回転するサンプルプログラムです。

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

プログラムの説明

material とはライティング係数やテクスチャなど、ポリゴンをどのように表示させるかという付加データのことを言います。
今回はテンキーの押し下げを検出して「赤・緑・青」の色レベルを変化させながら描画します。
マテリアルの説明は Windows Guid を参照して下さい。
4面体を回転しながら描画する では物体を配置する座標(Word 座標)を回転しましたが、今回は球の周りをカメラが周ります。
  1. プライベートライブラリを使わないで DirectX9 の標準ライブラリだけで作成します。
    必要なライブラリは #pragma でリンクしています。
    g_pD3D は Direct3D のオブジェクトです。
    g_p3DDev は Direct3D のデバイスです。
    pMeshApp はメッシュのオブジェクトです。
    ViewForm は View(カメラ)の座標です。
    COR はキーの操作で rgb の値を変える変化量です。
        #define     NAME        "Material"
        #include    <d3d9.h>
        #include    <d3dx9.h>
        #pragma once
        #pragma comment(lib,"dxguid.lib")
        #pragma comment(lib,"d3d9.lib")
        #pragma comment(lib,"d3dx9.lib")
        #pragma comment(lib,"winmm.lib")
    
        #define SAFE_DELETE(p)  { if (p) { delete (p);     (p)=NULL; } }
        #define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p)=NULL; } }
        #define EMSG(x)         MessageBox(NULL,x,"DirectX D3D",MB_OK);
    
        #define     COR         0.02f
        //Global Area
        HWND                    g_hWnd;
        LPDIRECT3D9             g_pD3D = NULL;
        LPDIRECT3DDEVICE9       g_p3DDev = NULL;
        LPD3DXMESH              pMeshApp = NULL;
        D3DMATERIAL9            material;
        D3DLIGHT9               light;
        D3DXVECTOR3             ViewForm(0.0f,0.0f,200.0f);
        
  2. InitDevices() 関数です。
    Init3DDev() はデバイスを取得する関数です。
    Back Buffer を取得して円を描画する で作成したものを使って下さい。
    D3DXCreateSphere() で球メッシュを生成します。
    D3DXCreateTorus() でトーラスメッシュを生成します。
    どちらでも好みのメッシュを表示して下さい。
    Material や Light に標準的な値 (^_^;) を設定します。
        HRESULT InitDevices(void)
        {
            if (FAILED(Init3DDev(g_hWnd,&g_pD3D,&g_p3DDev)))    return E_FAIL;
            //球メッシュの生成
            D3DXCreateSphere(g_p3DDev,50,32,32,&pMeshApp,NULL);
            //トーラスメッシュの生成
            //D3DXCreateTorus(g_p3DDev,16,40,32,32,&pMeshApp,NULL);
            //長方体メッシュの生成
            //D3DXCreateBox(g_p3DDev,5.0f,4.0f,3.0f,&pMeshApp,NULL);
            //初期マテリアルの設定
            material.Diffuse.r= material.Diffuse.g= material.Diffuse.b= 1.0f;
            material.Ambient.r= material.Ambient.g= material.Ambient.b= 0.5f;
            material.Specular.r= material.Specular.g= material.Specular.b= 0.0f;
            material.Emissive.r= material.Emissive.g= material.Emissive.b= 0.0f;
            material.Power= 0;
            //光源の作成
            ZeroMemory(&light,sizeof(D3DLIGHT9));
            light.Type = D3DLIGHT_DIRECTIONAL;
            light.Diffuse.r= light.Diffuse.g= light.Diffuse.b= 1.0f;
            light.Specular.r= light.Specular.g= light.Specular.b= 0.2f;
            light.Ambient.r= light.Ambient.g= light.Ambient.b= 0.5f;
            light.Direction = D3DXVECTOR3(1,-2,1);
            return  S_OK;
        }
        
  3. 球メッシュのパラメータの説明です。
    引数 説明
    pD3DDevice デバイスの指定
    50 球の半径
    32 Y軸回転方向の分割数
    32 Y軸方向の分割数
    &pMeshApp メッシュを受け取るポインタ
    NULL ポリゴン情報のポインタ
  4. トーラスメッシュのパラメータの説明です。
    引数 説明
    pD3DDevice デバイスの指定
    16 トーラスの太さ
    40 トーラスの半径
    32 上下方向の分割数
    32 回転方向の分割数
    &pMeshApp メッシュを受け取るポインタ
    NULL ポリゴン情報のポインタ
  5. 長方体メッシュのパラメータの説明です。
    球やトーラスに比べて小さく定義してみました。
    引数 説明
    pD3DDevice デバイスの指定
    5.0f Width(幅)
    4.0f Height(高さ)
    3.0f Depth(奥行き)
    &pMeshApp メッシュを受け取るポインタ
    NULL ポリゴン情報のポインタ
  6. メッシュを描画する関数です。
    Clear() で画面をクリアします。
    BeginScene() でシーンの開始を設定します。
    SetupMatrices() は描画環境を設定する関数です。この後で説明します。
    pMeshApp->DrawSubset(0) で球のメッシュを描画します。
    EndScene() でシーンの処理を終了します。
    Present() で作成したシーンを描画します。
        void Draw(void)
        {
            //黒で塗りつぶして消去
            g_p3DDev->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
            if (SUCCEEDED(g_p3DDev->BeginScene()))
            {   //描画環境の設定
                SetupMatrices();
                pMeshApp->DrawSubset(0);
                g_p3DDev->EndScene();
            }
            g_p3DDev->Present(NULL,NULL,NULL,NULL);
        }
        
  7. 描画環境を設定する関数です。
    GetClientRect() で Window Size を取得してアスペクト比を設定することで球(トーラス)が変形するのを防ぎます。
    Rotate() で View 座標をY軸を中心にして回転します。
    timeGetTime()/7000000.0f で回転速度が決まります。
    スペックの低いマシンで回転しないときは、この値を2桁ぐらい小さくして試してみて下さい。
    D3DXMatrixLookAtLH() で View 座標を設定します。
    D3DXMatrixPerspectiveFovLH() で透視変換の設定をします。
    光源とマテリアルを設定します。
        void  SetupMatrices(void)
        {   RECT            rect;
            D3DXMATRIX      matView;
            D3DXMATRIX      matProj;
    
            GetClientRect(g_hWnd,&rect);
            //View 座標をY軸を中心にして自動回転
            Rotate(&ViewForm,&D3DXVECTOR3(0.0f,0.0f,0.0f),float((int)(timeGetTime()/7000000.0f)%360),1);
            //View 座標の設定
            D3DXMatrixLookAtLH(&matView,&ViewForm,
                               &D3DXVECTOR3(0.0f,0.0f,0.0f),&D3DXVECTOR3(0.0f,1.0f,0.0f));
            g_p3DDev->SetTransform(D3DTS_VIEW,&matView);
            //透視変換の設定
            D3DXMatrixPerspectiveFovLH(&matProj,D3DXToRadian(45.0f),(float)rect.right/(float)rect.bottom,100,1000);
            g_p3DDev->SetTransform(D3DTS_PROJECTION,&matProj);
    
            ☆光源を設定して下さい
            ☆マテリアルを設定して下さい
        }
        
  8. Rotate() 関数の説明です。
    Rotate() は私有ライブラリに登録された3次元ベクトルの回転関数です。
    引数 説明
    &ViewForm 回転前の3次元ベクトル、回転後の値が格納される
    (0,0,0) 回転軸の中心点
    viewRot 回転角度
    1 回転軸(0:X, 1:Y, 2:Z)
  9. テンキーの押し下げを調べて「赤・緑・青」の色レベルを設定します。
    COR は #define で宣言した定数です。パソコンのスペックに合わせて設定して下さい。
    色はライトにもマテリアルにも設定出来ますが、material.Emissive(自己発色属性)に設定するのが最も良いようです。
        void KeyCheck()
        {   u_char      KeyBuffer[256];
            D3DXVECTOR3 v;
    
            // キーボードの状態を読み取る
            GetKeyboardState(KeyBuffer);
            if (KeyBuffer[VK_ESCAPE]&0xf0)          //ESC
            {   PostMessage(g_hWnd,WM_CLOSE,0,0);   //WM_CLOSE をポスト
                return;
            }
            if (KeyBuffer[VK_NUMPAD7]&0xf0)   material.Emissive.r-= COR;
            if (KeyBuffer[VK_NUMPAD4]&0xf0)   material.Emissive.g-= COR;
            if (KeyBuffer[VK_NUMPAD1]&0xf0)   material.Emissive.b-= COR;
            if (KeyBuffer[VK_NUMPAD9]&0xf0)   material.Emissive.r+= COR;
            if (KeyBuffer[VK_NUMPAD6]&0xf0)   material.Emissive.g+= COR;
            if (KeyBuffer[VK_NUMPAD3]&0xf0)   material.Emissive.b+= COR;
        }
        
  10. 操作キーの説明です。
    テンキー説明 テンキー説明
    赤を弱く 赤を強く
    緑を弱く 緑を強く
    青を弱く 青を強く
  11. オブジェクトを開放する関数です。
    取得したオブジェクトは必ず開放して下さい。
        void Cleanup(void)
        {
            SAFE_RELEASE(pMeshApp);
            SAFE_RELEASE(g_p3DDev);
            SAFE_RELEASE(g_pD3D);
        }
        

【ヒント】

光源を設定する関数は SetLight() です。
LightEnable() で Light を TRUE に設定して下さい。
D3DLIGHT9 light;

g_pDEV->SetLight(0,&light);
g_pDEV->LightEnable(0,TRUE);

マテリアルを設定する関数は SetMaterial() です。
D3DMATERIAL9 material;

g_pDEV->SetMaterial(&material);

超初心者の方のために全ソースコードを掲載します。 (^_^;)
こちらは MyD3D Object Class を使っています。
全ソースコード

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

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

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