1

カメラを使用して等角 (35 度) ビューを作成しようとしています。

Z軸を中心に回転する三角形を描いています。

何らかの理由で、三角形が回転の特定のポイントでカットされており、この結果が得られています

http://img442.imageshack.us/img442/8987/imagezle.jpg

このサイトを使用して、角度と z 距離からカメラの位置を計算します: http://www.easycalculation.com/trigonometry/triangle-angles.php

これは私がカメラを定義する方法です:

// isometric angle is 35.2º => for -14.1759f Y = 10 Z
Vector3 camPos = new Vector3(0, -14.1759f, 10f);
Vector3 lookAt = new Vector3(0, 0, 0);
viewMat = Matrix.CreateLookAt(camPos, lookAt, Vector3.Up);


//projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, Game.GraphicsDevice.Viewport.AspectRatio, 1, 100);
float width = GameInterface.vpMissionWindow.Width;
float height = GameInterface.vpMissionWindow.Height;
projMat = Matrix.CreateOrthographic(width, height, 1, 1000);

worldMat = Matrix.Identity;

これは、ワールド マトリックスの回転を再計算する方法です。

worldMat = Matrix.CreateRotationZ(3* visionAngle);

// keep triangle arround this Center point
worldMat *= Matrix.CreateTranslation(center);

effect.Parameters["xWorld"].SetValue(worldMat);

// updating rotation angle
visionAngle += 0.005f;

私が間違っているかもしれないことは何ですか?3D プロジェクトに取り組むのはこれが初めてです。

4

2 に答える 2

2

あなたの三角形はファープレーンによって切り取られています。

GPU が何かをレンダリングする場合、 (-1, -1, 0)から(1, 1, 1)の範囲内にあるピクセルのみをレンダリングします。つまり、ビューポートの左下と右上の間です。しかし、Z 軸上の「近い」平面と「遠い」平面の間でも同様です。(クリッピングを行うだけでなく、深度バッファがカバーする値の範囲も決定します。)

射影行列は、ワールド空間またはビュー空間にある頂点を取得し、そのラスター空間に収まるように変換します。透視投影マトリックスの視錐台の標準画像を見たことがあるかもしれません。これは、ワールド空間に変換されたときにそのラスター領域のエッジがどのように表示されるかを示しています。正投影にも同じことが存在しますが、ビュー領域のエッジは平行です。

簡単な答えは、すべてのジオメトリがラスター領域内に収まるように遠方平面までの距離を大きくすることです。の 4 番目のパラメータMatrix.CreateOrthographicです。

ニア プレーンとファー プレーンの間の距離を大きくすると、深度バッファーの精度が低下するため、必要以上に大きくしないでください。

于 2012-08-13T08:03:30.730 に答える
0

ファープレーンがそれを切り取っていると思うので、投影行列ファープレーン引数を大きくする必要があります...

 projMat = Matrix.CreateOrthographic(width, height, 1, 10000);
于 2012-08-13T07:58:08.157 に答える