Не могу правильно создать матрицу ViewProjection

0

У меня есть класс камеры, который использует API DirectXMath:

__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 вызов функции, поэтому, скорее всего, это матрица вида. Может ли кто-нибудь сказать мне, где проблема? Я пробовал разные комбинации заказов умножения/транспонирование обоих/транспонирование только одного/ничего. Он никогда не работает должным образом.

Теги:
graphics
matrix
directxmath

1 ответ

1
Лучший ответ

Если кто-то снова увидит этот вопрос:

Похоже, что OP не транспонировала матрицу ViewProjection, которую они сгенерировали. Обратите внимание, что DirectXMath работает в строчном порядке, в то время как HLSL по умолчанию имеет значение столбца. Согласно документации на странице https://msdn.microsoft.com/en-us/library/windows/desktop/bb509634(v=vs.85).aspx

Ещё вопросы

Сообщество Overcoder
Наверх
Меню