Direct3D 11 Преобразование матрицы WorldViewProjection не работает - PullRequest
2 голосов
/ 17 февраля 2011

У меня есть простой квадрат, который я рисую в трехмерном пространстве, используя Direct3D 11 и SlimDX, со следующими координатами (я знаю, что он рендерит)

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. Он также содержит матрицы просмотра и проекции. Я создаю их, используя следующий код:

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);
}

1 Ответ

2 голосов
/ 18 февраля 2011

Проблема может лежать в строке:

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

Я бы изменил output.pos на float4, а затем сделал бы:

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

Дайте мне знать, как это работает. Если это не проблема, я более подробно рассмотрю, что может происходить.

...