Java で独自のソフトウェア ラスタライザーを作成していますが、問題が発生しました...サンプル画像を見てください。
このサンプルは、単純な正方形のグリッドを平面上に描画するだけです。いくつかのポイントが背後に移動するのに十分なほどカメラを近づけるまで、すべてが正常に機能します。その後、ご覧のとおり、それらは正しく投影されなくなります (垂直線 - カメラの後ろにあるはずの点が画面の上に投影されます)。
私の変換行列とベクトルは、DirectX が使用しているものと同じです (投影には PerspectiveFovLH、カメラには LookAtLH)。
次の変換方法を使用して、3D ポイントを投影しています。
- 変換する 3D ベクトルが作成されます。
- ベクトルに ViewProjection 行列を掛けます。
その後、次のメソッドを使用してポイントをスクリーンに変換します。
// 'vector' is input vector in projection space // projection to screen double vX = vector.x / vector.z; double vY = vector.y / vector.z; //translate //surfaceW is width and surfaceH is height of the rendering window. vX = (( vX + 1.0f) / 2.0f) * surfaceW; vY = ((-vY + 1.0f) / 2.0f) * surfaceH; return new Vector3(vX, vY, vector.z);
先に言ったように、ポイントがカメラの後ろに移動するまでは問題なく動作します。実際には、ポイントがカメラの後ろにあるときを把握できます (最終的な変換後に Z 値をテストすることにより) が、線やその他の線ベースのオブジェクトを描画しているため、そのポイントをスキップすることはできません。
次に、MSDNの The Direct3D Transformation Pipeline の記事に従って、変換パイプラインを設定してみました。
残念ながら、私もそれで運が良かったわけではありません(同じ結果)。
ありがとうございました。
よろしく、アレックス