Порядок перемещения матрицы объектов DirectX11

0

У меня есть 3D-объект, и я хочу, чтобы его можно было повернуть, а затем переместить его вперед в новом направлении, но мой код до сих пор вращает куб, а затем, когда вы перемещаете его, он перемещает его по оси по умолчанию, а не по направлению к другому код для вращения и перевода, а updateWorld выглядит следующим образом

 void GameObject::SetTranslation(float x, float y, float z)
{
    XMMATRIX t = XMLoadFloat4x4(&_translate);
    XMStoreFloat4x4(&_translate, XMMatrixTranslation(x, y, z) * t);
}

    void GameObject::SetRotation(float x, float y, float z)
{
    XMFLOAT4X4  tempRot;
    XMStoreFloat4x4(&tempRot, XMMatrixRotationX(x) * XMMatrixRotationY(y) * XMMatrixRotationZ(z));

    XMMATRIX r = XMLoadFloat4x4(&_rotate);
    XMMATRIX tempRotate = XMLoadFloat4x4(&tempRot);
    XMStoreFloat4x4(&_rotate, XMMatrixMultiply(r, tempRotate));
}

    void GameObject::UpdateWorld()
{
    XMMATRIX scale = XMLoadFloat4x4(&_scale);
    XMMATRIX rotate = XMLoadFloat4x4(&_rotate);
    XMMATRIX translate = XMLoadFloat4x4(&_translate);

    XMStoreFloat4x4(&_world, scale *rotate * translate);
}

поэтому после того, как пользовательский ввод был проверен, вызывается gameobjects updateworld

я думаю, что у меня может быть заказ или что-то не хватает от умножения, но я очень смущен, почему он не движется в новом направлении

любые советы или помощь будут очень благодарны

  • 1
    Просто поменяйте местами матрицу вращения и перевода. Вы можете прочитать больше о матрицах DirectX в одном из моих постов в блоге .
  • 0
    да, я пытался поменять местами вращение и сдвиг, но затем, кажется, он вращается вокруг точки 0,0,0, а не в текущей позиции
Показать ещё 1 комментарий
Теги:
directx

1 ответ

1

Нико Шертлер - удивительные люди !!!

ха-ха, он помог мне решить мою проблему, и для других, кто борется здесь, это то, что мне сказали, и как я ее решил

я должен был применить новое преобразование к текущей мировой матрице, а затем я некоторое время сидел, задаваясь вопросом, почему он не работал, мне пришлось сбросить матрицу до нуля, чтобы внести правильное изменение в следующую новую трансформеру

мой код мирового обновления теперь добавлен в конец так, как это

    XMStoreFloat4x4(&_world, scale  * translate*rotate *world );



XMStoreFloat4x4(&_scale, XMMatrixIdentity());
XMStoreFloat4x4(&_rotate, XMMatrixIdentity());
XMStoreFloat4x4(&_translate, XMMatrixIdentity());
  • 0
    Вы можете найти использование SimpleMath в наборе инструментов DirectX, который является оболочкой C ++ поверх DirectXMath, которая обеспечивает несколько дополнительных перегрузок.

Ещё вопросы

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