Понимание вывода камеры Assimp

Я пишу программу для отображения 3D-сцены с использованием Assimp3.0.

Мой рабочий процесс:

  1. Blender2.71 экспортирует fbx.
  2. Assimp читает файл fbx.

Атрибут камеры из aiCamera странный.


У меня есть камера в блендере с:

(координата блендера)

местоположение : (0, -5, 0)

вращение : (90, 0, 0)

Это должна быть простая камера переднего вида.


Поскольку Assimp будет поворачивать все модели на -90 градуса по оси X, я полагаю, что Assimp изменит эту камеру на

(координата OpenGL (x: вправо) (y: вверх) (z: за пределы экрана))

должность : (0, -5, 0)

up : (0, 0, 1)

посмотри: (0, 1, 0)


Но в структуре aiCamera я получил:

mПозиция : (5, 0, 0)

мВверх: (0, 1, 0)

mlookAt: (0, 0, 1)


Как правильно использовать aiCamera?


person user1429171    schedule 19.07.2014    source источник


Ответы (1)


aiCamera живет в графе aiNode. Чтобы процитировать документацию для aiCamera и aiNode

aiCamera: камеры представлены в графе узлов [...]. Это означает, что любые значения, такие как вектор взгляда, не являются абсолютными, они относятся к системе координат, определяемой узлом, который соответствует камере.

aiNode: камеры и источники света назначаются узлам с определенным именем. Если узлов с таким именем несколько, они назначаются каждому из них.

Итак, где-то в вашем графе узлов есть узел с тем же именем, что и у вашей камеры. Эта заметка содержит однородную матрицу преобразования, соответствующую системе координат вашей камеры. Произведение T*v будет переводить однородный вектор v из системы координат камеры в мировую систему координат. (Обозначая корневую систему координат как мировую систему и предполагая, что родитель камеры является корнем).

mPosition, mUp и mLookAt задаются в координатах системы координат камеры, поэтому их необходимо преобразовать в мировую систему координат. Важно различать mPosition, который является точкой в ​​пространстве, и mUp и mLookAt, которые являются векторами направления. Матрица преобразования состоит из матрицы поворота R и вектора переноса t.

       R   |  t
T = --------------
     0 0 0 |  1

mPosition в мировых координатах вычисляется как mPositionWorld = T*mPosition, а векторы направления рассчитываются как mLookAtWorld = R*mLookAt и mUpWorld = R*mUp

В c++ матрицу преобразования можно найти следующим образом (предположим, что aiScene 'scene' была загружена):

//find the camera's mLookAt
aiCamera** cameraList = scene->mCameras;
aiCamera* camera = cameraList[0] //Using the first camera as an    example
mVector3D camera->mLookAt;

//find the transformation matrix corresponding to the camera node
aiNode* rootNode = scene->mRootNode;
aiNode* cameraNode = rootNode->FindNode(camera->mName);
aiMatrix4x4 cameraTransformationMatrix = cameraNode->mTransformation;

Остальные вычисления затем можно выполнить с помощью функций линейной алгебры Ассимпа.

person Thorbjorn    schedule 30.01.2015