Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Direct3D 11 WorldViewProjection矩阵转换不工作_C#_Matrix_3d_Projection_Slimdx - Fatal编程技术网

C# Direct3D 11 WorldViewProjection矩阵转换不工作

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

我用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 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矩阵的。当您试图通过更新常量缓冲区来设置它时,您必须转置矩阵。