Моя матрица умножения не работает, как я ожидаю

Это то, что я хочу:

введите описание изображения здесь

Что я делаю не так со следующим кодом. Вывод трансляции для вращения орбиты никогда не происходит, он просто заканчивается вращением всех на исходной оси.

void Renderer::UpdateAsteroid( Placement^ asteroidRotation, Placement^ sceneOrientation )
{
XMMATRIX selfRotation;

// Rotate the asteroid
selfRotation = XMMatrixRotationX( asteroidRotation->GetRotX() );
selfRotation = XMMatrixMultiply( selfRotation, XMMatrixRotationY( asteroidRotation->GetRotY() ) );
selfRotation = XMMatrixMultiply( selfRotation, XMMatrixRotationZ( asteroidRotation->GetRotZ() ) );

XMMATRIX translation;

// Move the asteroid to new location
translation = XMMatrixTranslation( sceneOrientation->GetPosX(), sceneOrientation->GetPosY(), sceneOrientation->GetPosZ() );

XMMATRIX orbitRotation;

// Rotate from moved origin
orbitRotation = XMMatrixRotationZ( sceneOrientation->GetRotZ() );

XMMATRIX outputMatrix = selfRotation * translation * orbitRotation;

// Store
XMStoreFloat4x4( &m_constantBufferData.model, XMMatrixTranspose( outputMatrix ) );
}

но это, кажется, не работает .. это просто заканчивается вращением в той же точке.

1

Решение

Матричное умножение является не коммутативный, изменение порядка следования операндов.
Как правило, вы хотите рассчитать все ваши матрасы, а затем умножить вместе. Попробуйте этот заказ сначала:

result = scale * selfRotation * translation * orbitRotation

Если это не то, что вы хотите, просто переместите матрицы, чтобы найти правильный порядок.

Обратите внимание, XMMath также имеют XMMatrixRotationRollPitchYaw() функция для получения матриц вращения за один вызов.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]