DirectXにおける2Dと3Dの座標の違い
DirectXを使ったプログラミングの初心者で、Softbank Creativeの「シューティングゲームプログラミング」を使って勉強しています。
ライブラリの内容も関わってくるので少し分かりづらい質問ですが、2Dと3Dとで座標の指定の仕方が違うのがよく分かりません。
3Dでは、
D3DXMATRIX mat_view;
D3DXVECTOR3 vec_from=D3DXVECTOR3(0, 100, 0); D3DXVECTOR3 vec_lookat=D3DXVECTOR3(0, 0, 0); D3DXVECTOR3 vec_up=D3DXVECTOR3(0, 0, 1); D3DXMatrixLookAtLH(&mat_view, &vec_from, &vec_lookat, &vec_up);
device->SetTransform(D3DTS_VIEW, &mat_view);
D3DXMatrixOrthoLH(&mat_proj, 120, 90, 1, 1000);
device->SetTransform(D3DTS_PROJECTION, &mat_proj);
Graphics->SetLight(0, D3DLIGHT_DIRECTIONAL, -1.0f, -1.0f, -1.0f, 1000);
このあたりでカメラを設定し、画面端のx座標が±0.6になる……といったことを決めていましたが、
2Dでは
VERTEX vertex[4]={
{x, y, z, 1, diffuse, u, v},
{x, y+dy, z, 1, diffuse, u, v+dv},
{x+dx, y, z, 1, diffuse, u+du, v},
{x+dx, y+dy, z, 1, diffuse, u+du, v+dv}
};
device->SetFVF(D3DFVF_VERTEX);
device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, vertex, sizeof(VERTEX));
例えば四角形ポリゴンを描くときにこんな風に記述して、
このx,yにはウィンドウの座標が入っています。
SETFVFでD3DFVF_XYZRHWを設定することで直接2Dに持ってこれる、というようなことが調べて分かったのですが、
三角形ポリゴンにテクスチャを貼り付けて2Dのような表現をする場合、必ずこのようにウィンドウに合わせた座標になる(する?)のでしょうか?
つまり、3Dの時のように左端がx=-0.6……というような座標系で表現できないのでしょうか?
書籍には3Dから2Dに変換する式などがありましたが、このような変換をいちいち行わなくても最初から3Dの座標に2Dのものを表示できないのでしょうか?
なにぶん初心者で見当外れのことを言っているかも知れませんが、ご教授をお願いいたします。
お礼
お返事ありがとうございます。 >回転後も、現座標の床から離れることなく主人公の向きを下向きにしたい という文章ですが、これは私の説明が下手糞でした。 下向きというのは、プレイヤーの回転の”下向き”ことで、 プレイヤーは戦車や車ではなくマリオのような人間型キャラであるため、 ○ ......\/ ...../ ↑人間キャラにこんな風には立ってほしくない。 ......○ ........|./ ..../ ↑こういう風に立ってほしかったという意味のつもりだったのですが。 これについては、INTLINSIDE様の文章と、 いつも世話になってる某知人の意見を参考に、実際のプログラムの動作をいろいろ試してした結果。 PlayerMatrixにModelRotをかける処理は、かける順序にもよるみたいですが、そうする事によりプレイヤーの表示が、地形についていく形で一緒に軸に対して回転してしまうため、上記に説明した「スマブラのメトロイドのコースみたいな……」という、処理の「回転中も、主人公の座標は地形に基本、ついていかない」という動きはなしえないので、そうしたいのならPlayerMatrixにModelRotをかけてはならないという意見は正しく、 反対に、回転する惑星の上に乗せた主人公を、惑星の表面に張り付いている状態で、惑星と一緒に回転させたい場合は、 PlayerMatrixに、先に主人公を任意の角度に傾けるための”原点中心の回転移動”。 すなわち、回転後も、現座標の床から離れることなく主人公の向きを下向きにしたいと、言って説明したつもりになっていた所……)の行列を、平行移動成分をPlayerMatrixにかける 前に かけてから、 ○ ......\/........× ...../ ......○ ........|./ ..../................○ かけると、○の処理のように主人公が傾くマトリックス。 これを、平行移動マトリックスをかける前に、計算上では軸に対してかけてやり、その後、平行移動マトリックスをかけることにより、解決しました! (ここの所が、頭のいい某知人の意見……) また、matpush(状態の保存)とmatpop(状態の復元)という関数についてですが……。 こんな関数がこの世に存在することを、今の今まで知りませんでした。 大変参考になりました。 私も最終的には人に物を教えられるほどのプログラマーになりたいものです。 ありがとうございました。