Direct3D 11 と SlimDX を使用して、次の座標で 3D 空間に描画している単純な正方形があります (レンダリングされることはわかっています)。
0,0,0.5
0,0.5,0.5
0.5,0.5,0.5
0.5,0,0.5
ビューマトリックスにマトリックス変換を適用してカメラの動きを処理するカメラ クラスがあります。たとえば、Camera.MoveForward(float x) は、カメラを x だけ前方に移動します。また、View 行列と Projection 行列も保持します。次のコードを使用してそれらをインスタンス化します。
Matrix view = Matrix.LookAtLH(
new Vector3(0f, 0f, -5f),
new Vector3(0f, 0f, 0f),
new Vector3(0f, 1f, 0f));
Matrix projection = Matrix.PerspectiveFovLH(
(float)Math.PI/2,
WINDOWWIDTH/WINDOWHEIGHT,
0.1f,
110f);
ワールド マトリックスは単位マトリックスに設定されます。
私のシェーダー コードでは、次のコードを使用して座標を変換します。
PS_IN VS(VS_IN input)
{
PS_IN output = (PS_IN)0;
output.pos = mul( input.pos, WorldViewProjection );
output.col = float4(1,1,1,1);
return output;
}
WorldViewProjection が次を使用して私のコードで設定されている場所:
Matrix worldview = Matrix.Multiply(world, camera.ViewMatrix);
Matrix worldviewprojection = Matrix.Multiply(worldview, camera.ProjectionMatrix);
カメラ クラスの変換が正常に機能する MDX アプリケーション用に記述した古いコードであるため、機能していることはわかっていますが、これを実行すると正方形が表示され、前後に移動すると問題なく動作しますが、左右に移動すると正方形が回転するように見えます移動する代わりに Y (上) 軸を中心に、上下に移動すると同様の効果があり、代わりに X (水平) 軸を中心に回転します。
参考までに、カメラの動きは次のように機能します。
public void MoveRight(float distance)
{
position.Z += (float)(Math.Sin(-angle.Y) * -distance);
position.X += (float)(Math.Cos(-angle.Y) * -distance);
updateViewMatrix();
}
public void MoveForward(float distance)
{
position.X += (float)(Math.Sin(-angle.Y) * -distance);
position.Z += (float)(Math.Cos(-angle.Y) * -distance);
updateViewMatrix();
}
public void MoveUp(float distance)
{
position.Y -= distance;
updateViewMatrix();
}
private void updateViewMatrix()
{
ViewMatrix = Matrix.Translation(position.X, position.Y, position.Z) * Matrix.RotationY(angle.Y) * Matrix.RotationX(angle.X) * Matrix.RotationZ(angle.Z);
}