У меня есть класс камеры, который использует DirectXMath API:
__declspec(align(16)) class Camera
{
public:
XMVECTOR Translation;
XMMATRIX Rotation;
XMVECTOR Scale;
XMMATRIX Transform;
XMFLOAT3 RotAngles;
XMMATRIX ProjectionMatrix;
float Width;
float Height;
float NearZ;
float FarZ;
float AspectRatio;
float FieldOfView;
Camera()
{
Translation = XMVectorZero();
Rotation = XMMatrixIdentity();
Scale = XMVectorSplatOne();
Transform = XMMatrixIdentity();
Width = 800;
Height = 600;
NearZ = 0.1f;
FarZ = 100.0f;
AspectRatio = 800 / 600;
FieldOfView = (XM_PIDIV4);
ProjectionMatrix = XMMatrixPerspectiveFovLH(FieldOfView, AspectRatio, NearZ, FarZ);
}
void Update()
{
Rotation = XMMatrixRotationRollPitchYaw(RotAngles.x, RotAngles.y, RotAngles.z);
XMMATRIX scaleM = XMMatrixScalingFromVector(Scale);
XMMATRIX translationM = XMMatrixTranslationFromVector(Translation);
Transform = scaleM * Rotation * translationM;
}
XMMATRIX GetViewMatrix()
{
XMVECTOR Eye;
XMVECTOR At;
XMVECTOR Up;
Eye = Translation;
At = Translation + Transform.r[2];
Up = Transform.r[1];
return(XMMatrixLookAtLH(Eye, At, Up));
}
XMMATRIX GetViewProjectionMatrix()
{
return(XMMatrixTranspose(GetViewMatrix() * ProjectionMatrix));
}
};
Когда я сохраняю результат GetViewProjectionMatrix () в XMFLOAT4X4 и обновляю его до постоянного буфера, геометрия разрывается или вообще не отображается, когда я перемещаю / поворачиваю камеру с помощью клавиатуры. Я изолировал камеру, чтобы быть проблема с деформирующей / исчезающей геометрией, но я понятия не имею, в чем проблема. Я имею в виду, что матрица проекции не может быть неправильной, это всего лишь 1 вызов функции, так что это, скорее всего, матрица вида. Может кто-нибудь сказать мне, где Проблема в том, что я пробовал разные комбинации порядков умножения / транспонирования обоих / транспонирования только одного / чего-либо. Это никогда не работает должным образом.
Если кто-нибудь снова увидит этот вопрос:
Похоже, что OP не транспонировал в матрицу ViewProjection, которую они сгенерировали. Обратите внимание, что DirectXMath работает в главном порядке строк, в то время как HLSL по умолчанию равен основным столбцам. Согласно документации на — https://msdn.microsoft.com/en-us/library/windows/desktop/bb509634(v=vs.85).aspx
Других решений пока нет …