Построение мировой матрицы - PullRequest
0 голосов
/ 02 января 2011

При построении матрицы проекции мира из масштаба, вращения, перевода матриц, тогда матрица перевода должна быть последней в процессе, верно? В противном случае вы будете масштабировать или вращать свои переводы. Нужно ли масштабировать и поворачивать в определенном порядке?

Прямо сейчас у меня есть

std::for_each(objects.begin(), objects.end(), [&, this](D3D93DObject* ptr) {
    D3DXMATRIX WVP;
    D3DXMATRIX translation, rotationX, rotationY, rotationZ, scale;
    D3DXMatrixTranslation(&translation, ptr->position.x, ptr->position.y, ptr->position.z);
    D3DXMatrixRotationX(&rotationX, ptr->rotation.x);
    D3DXMatrixRotationY(&rotationY, ptr->rotation.y);
    D3DXMatrixRotationZ(&rotationZ, ptr->rotation.z);
    D3DXMatrixScaling(&translation, ptr->scale.x, ptr->scale.y, ptr->scale.z);
    WVP = rotationX * rotationY * rotationZ * scale * translation * ViewProjectionMatrix;
});

1 Ответ

2 голосов
/ 02 января 2011

Вы правы, считая, что порядок имеет значение. Умножение матриц не является коммутативным.

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

С другой стороны, масштабирование может быть результатом какого-то другого взаимодействия. Персонаж застрял под движущимся потолком, и это давило его. В этом случае персонаж должен быть повернут в положение, а затем уменьшен.

В конечном итоге это означает, что вам нужно применять преобразования в том порядке, в котором они происходят. масштабируйте объект до нужной формы, затем сделайте необходимые преобразования, чтобы поместить их в мир по мере необходимости. Добавьте любые дополнительные шаги в середине в соответствии с вашими потребностями.

...