2

我有一个简单的正方形,我正在使用 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);
}
4

1 回答 1

2

问题可能在于:

output.pos = mul( input.pos, WorldViewProjection );

我会将 output.pos 更改为 float4 ,然后执行以下操作:

output.pos = mul( float4(input.pos, 1), WorldViewProjection );

让我知道这是怎么回事。如果这不是问题,我将更深入地了解可能发生的情况。

于 2011-02-17T22:28:26.953 回答