Как я могу вращаться в пространстве объектов в 3D (с использованием матриц) - PullRequest
0 голосов
/ 30 марта 2012

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

// build object space rotation
sf::Vector3<float> XMatrix (MultiplyByMatrix(sf::Vector3<float> (cosz,sinz,0)));
sf::Vector3<float> YMatrix (MultiplyByMatrix(sf::Vector3<float> (-sinz,cosz,0)));
sf::Vector3<float> ZMatrix (MultiplyByMatrix(sf::Vector3<float> (0,0,1)));

// build cofactor matrix
sf::Vector3<float> InverseMatrix[3];
CoFactor(InverseMatrix);

// multiply by the transpose of the cofactor matrix(the adjoint), to bring the rotation to world space coordinates
sf::Vector3<float> RelativeXMatrix = MultiplyByTranspose(XMatrix, InverseMatrix[0], InverseMatrix[1], InverseMatrix[2]);
sf::Vector3<float> RelativeYMatrix = MultiplyByTranspose(YMatrix, InverseMatrix[0], InverseMatrix[1], InverseMatrix[2]);
sf::Vector3<float> RelativeZMatrix = MultiplyByTranspose(ZMatrix, InverseMatrix[0], InverseMatrix[1], InverseMatrix[2]);

// perform the rotation from world space
PointsPlusMatrix(RelativeXMatrix, RelativeYMatrix, RelativeZMatrix);

1 Ответ

3 голосов
/ 30 марта 2012

Разница между вращением в мировом пространстве и в пространстве объектов заключается в том, где вы применяете матрицу вращения.

Обычный способ использования компьютерной графики для отображения точек вершин:

  • из объектного пространства, (умножить на MODEL матрицу для преобразования)
  • в мировое пространство, (затем умножить на VIEW матрицу для преобразования)
  • в пространство камеры, (затем умножить на матрицу PROJECTION для преобразования)
  • в проекционный или «обрезать» - пробел

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

world_point = MODEL * model_point
camera_point = VIEW * world_point = (VIEW*MODEL) * model_point
clip_point = PROJECTION * camera_point = (PROJECTION*VIEW*MODEL) * model_point

Каждая из этих матриц преобразования сама может быть результатом нескольких матриц, умноженных последовательно.В частности, матрица MODEL часто состоит из последовательности вращений, сдвигов и масштабирования, основанной на иерархически сформулированной модели, например:

MODEL = STAGE_2_WORLD * BODY_2_STAGE *
  SHOULDER_2_BODY * UPPERARM_2_SHOULDER *
  FOREARM_2_UPPERARM * HAND_2_FOREARM

Итак, вращаетесь ли вы в пространстве моделиили мировое пространство зависит от того, с какой стороны матрицы MODEL вы применяете свою матрицу вращения.Конечно, вы можете легко сделать и то и другое:

MODEL = WORLD_ROTATION * OLD_MODEL * OBJECT_ROTATION

В этом случае WORLD_ROTATION вращается вокруг центра пространства-мира, а OBJECT_ROTATION вращается вокруг центра пространства-объекта.

...