トップページ > 記事閲覧
DrawPolygon3D で描画するオブジェクトの陰影
名前:sarrus3x3 日時: 2016/06/05 12:32

いつもお世話になっております。 また質問をさせて下さい。 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 ; // ソフトの終了 } 申し訳ありませんが、 よろしくお願いします。
メンテ

Page: 1 |

Re: DrawPolygon3D で描画するオブジェクトの陰影 ( No.1 )
名前:管理人 日時:2016/06/05 15:25

回転の際に TestSphere.m_pVertex[i].pos にのみ回転後の座標を代入されていますが、 ライティングには頂点の法線も関係していますので、TestSphere.m_pVertex[i].norm にも 回転後の法線を代入する必要があります 因みに法線は向きのみの情報なので、VTransform の代わりに VTransformSR を使用します TestSphere.m_pVertex[i].norm = VTransformSR( TestSphere.m_pRawVertexNorm[i].toVECTOR(), TmpTmpMat ); ↑このコードでは存在しないメンバー変数 m_pRawVertexNorm を使用しています、お手数で申し訳ありませんが class TextureSphere3D に Vector3D* m_pRawVertexNorm; //オリジナルの法線情報を保持する というメンバー変数を追加して、オリジナルの法線情報を代入するようにしてみてください m(_ _)m
メンテ
Re: DrawPolygon3D で描画するオブジェクトの陰影 ( No.2 )
名前:sarrus3x3(解決) 日時:2016/06/05 15:33

管理人殿、 なるほど、 頂点データを回転させるときは 法線ベクトルの修正も必要になるのですね! オブジェクトの生成時は法線ベクトルも ちゃんと生成していたのですが、 すっかり失念しておりました。 すばやいご回答ありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存