私の問題は、DirectX 9の深度テストに集中しています。ゲーム内の静的なポイントで1つのオブジェクトをレンダリングし、DirectInputからの入力に基づいて変更できるポイントで別のオブジェクトをレンダリングしようとしています。オブジェクトの1つは、ほぼ500ユニット離れて描画されます。最初にシーンを描画すると、2つのオブジェクトは正しくレンダリングされますが、2番目のオブジェクトの位置が変わると(カメラも移動して)、深度テストが有効になっていて、遠方平面の値。この問題により、私はフォーラム(これも含まれます)を調べて、運が悪かった答えを見つけました。誰かが助けることができればそれは大いにありがたいです。
編集:
多分私は少し不明確でした。位置を変更する前にオブジェクトは正しく描画されますが、カメラの方向は自由に変更でき、悪影響はありません。位置が変更されると、オブジェクトは正しくレンダリングされません。
更新:
@ paul-jan:コードを投稿しますが、いくつかのクラスに散在しています...デプスバッファは、D3DPRESENT_PARAMETERSで宣言されたD3DFMT_D16自動バッファです。MSDNのドキュメントによると、自動的に有効になり、書き込みが有効になり、関数はD3DCMP_LESSEQUALです。また、モデルはXファイルから読み込まれ、DirectXビューアーで正常に表示されます。
@vines:興味深い仮説。変換は異なりますが、ワールドマトリックスのみです。私の直感は、それがビューマトリックスにあるということです。私は、フランクD.ルナの著書「DirectX9.0cを使用した3Dゲームプログラミングの概要」で説明されている実装に取り組んでいます。この実装は、目的に合わせて変更しました。つまり、3軸回転です。しかし、私はそれに私の実装を台無しにしたかもしれません。
ここにいくつかのコードがあります...
void BuildViewMatrix()
{
D3DXVec3Normalize(&f,&f);
D3DXVec3Cross(&u,&f,&r);
D3DXVec3Normalize(&u,&u);
D3DXVec3Cross(&r,&u,&f);
D3DXVec3Normalize(&r,&r);
w(0,0)=r.x;
w(0,1)=r.y;
w(0,2)=r.z;
w(0,3)=p.x;
w(1,0)=u.x;
w(1,1)=u.y;
w(1,2)=u.z;
w(1,3)=p.y;
w(2,0)=f.x;
w(2,1)=f.y;
w(2,2)=f.z;
w(2,3)=p.z;
w(3,0)=0.0f;
w(3,1)=0.0f;
w(3,2)=0.0f;
w(3,3)=1.0f;
D3DXMatrixInverse(&view,0,&w);
w=l*w;
}
r =右ベクトル、u =上ベクトル、f =順ベクトル、p =位置、w =世界行列、l =ローカル空間オフセット変換(世界変換の少し前に物事を変換するための私自身のアイデア)。
全体のアイデアは、サードパーソンスターファイター戦闘ゲーム用のカメラに基づいています。カメラと船は1つのオブジェクトとして「結合」され(したがって、ローカルスペース変換)、ビューマトリックスは船のワールドマトリックスの逆になります。ただし、これがそれを実装するための最良の方法であるかどうかはわかりません。
何か案は?