C# Direct3D 11 WorldViewProjection矩阵转换不工作
我用Direct3D 11和SlimDX在3D空间中绘制了一个简单的正方形,带有以下坐标(我知道它会渲染) 我有一个camera类,它通过对viewmatrix应用矩阵变换来处理相机移动。e、 g.摄像头。向前移动(浮动x)将摄像头向前移动x。它还保存视图和投影矩阵。我使用以下代码实例化它们:C# Direct3D 11 WorldViewProjection矩阵转换不工作,c#,matrix,3d,projection,slimdx,C#,Matrix,3d,Projection,Slimdx,我用Direct3D 11和SlimDX在3D空间中绘制了一个简单的正方形,带有以下坐标(我知道它会渲染) 我有一个camera类,它通过对viewmatrix应用矩阵变换来处理相机移动。e、 g.摄像头。向前移动(浮动x)将摄像头向前移动x。它还保存视图和投影矩阵。我使用以下代码实例化它们: Matrix view = Matrix.LookAtLH( new Vector3(0f, 0f, -5f), new Vector3(0f, 0f, 0f), new Vect
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;
}
世界矩阵设置为单位矩阵
在着色器代码中,我使用以下代码变换坐标:
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);
我知道camera类的转换工作正常,因为它是我为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);
}
问题可能在于:
output.pos = mul( input.pos, WorldViewProjection );
我会将output.pos更改为float4,然后执行以下操作:
output.pos = mul( float4(input.pos, 1), WorldViewProjection );
让我知道这是怎么回事。如果这不是问题,我将更深入地了解可能发生的情况。是否从效果文件中获取WorldViewProjection并进行相应设置?是的,当我更改视图矩阵时,3D显示会更新,这意味着值必须正确传递到着色器,它只是更新不正确。input.pos是float3还是float4?float3,如果它应该是一个float4,那么应该在第四列中放什么(假设(x,y,z,w)float4结构,什么应该是w?)1通常是在这种情况下为w放的。这是可行的,但我还必须在将WorldViewProjection矩阵发送到我的着色器之前转置(使用Matrix.transpose)WorldViewProjection矩阵。显然,HLSL和C#在内存中表示矩阵的方式不同。是的,我能够验证这一点。显然,我没有遇到这个问题,因为我是通过EffectMatrixVariable设置WVP矩阵的。当您试图通过更新常量缓冲区来设置它时,您必须转置矩阵。