У меня есть простой квадрат, который я рисую в трехмерном пространстве, используя 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);
}