Это то, что я хочу:
Что я делаю не так со следующим кодом. Вывод трансляции для вращения орбиты никогда не происходит, он просто заканчивается вращением всех на исходной оси.
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 ) );
}
но это, кажется, не работает .. это просто заканчивается вращением в той же точке.
Матричное умножение является не коммутативный, изменение порядка следования операндов.
Как правило, вы хотите рассчитать все ваши матрасы, а затем умножить вместе. Попробуйте этот заказ сначала:
result = scale * selfRotation * translation * orbitRotation
Если это не то, что вы хотите, просто переместите матрицы, чтобы найти правильный порядок.
Обратите внимание, XMMath также имеют XMMatrixRotationRollPitchYaw()
функция для получения матриц вращения за один вызов.
Других решений пока нет …