いつもお世話になっております。
また質問をさせて下さい。
DrawPolygon3D を使って、
自作したオブジェクトを描画させているのですが、
回転行列で VERTEX3D を回転させると、
オブジェクトの陰影まで一緒に回転してしまうようです。
回転前と回転後のスクショを貼り付けます。
・回転前
ttp://livedoor.blogimg.jp/sarrus3x3/imgs/b/f/bfbf7826.jpg
・回転後
ttp://livedoor.blogimg.jp/sarrus3x3/imgs/a/7/a7ea6b16.jpg
回転後は、ライト方向を画面左側方向に設定しているにも
関わらず、それとは違う方向に影が描画されてしまっています。
初期描画で、テクスチャー自体に照明の陰影が
記憶されてしまっている動作をしているように見えます。
オブジェクトを回転させても、
ライト方向から光があたってるように
描画して欲しいのですが、どうすればよいでしょうか。
問題のソースの抜粋を貼り付けます。
// 自作の3次元オブジェクトクラス
class TextureSphere3D
{
public:
int m_iPolygonNum; // ポリゴン数
VERTEX3D* m_pVertex; // ポリゴン集合を保持
Vector3D* m_pRawVertexPos; //オリジナルの頂点位置情報を保持する
/* 省略 */
}
/* 省略 */
// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //Windowモード
SetDrawScreen( DX_SCREEN_BACK ); //裏画面に設定
SetUseZBuffer3D( TRUE ); // ZバッファON
SetWriteZBuffer3D( TRUE );
SetCameraNearFar( 1.0f, 1500.0f ) ; // カメラの 手前クリップ距離と 奥クリップ距離を設定
// ★ 球クラスをインスタンス化
// コンストラクタ内で、m_pVertex、m_pRawVertexPos を生成
TextureSphere3D TestSphere();
/* 省略 */
// ################## メインループの開始 #######################
while(!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()){
/* 省略 */
SetLightDirection( VGet( 1.0, 0.0, 0.0 ) ); // 照明方向の設定
// ★ 問題の処理
// 回転行列を生成
static double TmpAng=0;
TmpAng += ROTATE_SPEED*0.5;
MATRIX TmpTmpMat = MGetRotY( TmpAng );
// 回転行列を作用させ、VERTEX3Dリストを更新
int VectexNum = TestSphere.m_iPolygonNum * 3;
for( int i=0; i<VectexNum; i++ )
{
TestSphere.m_pVertex[i].pos =
VTransform( TestSphere.m_pRawVertexPos[i].toVECTOR(), TmpTmpMat );
}
// 描画
DrawPolygon3D(
TestSphere.m_pVertex,
TestSphere.m_iPolygonNum,
DX_NONE_GRAPH ,
FALSE ) ;
/* 省略 */
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
申し訳ありませんが、
よろしくお願いします。