了解Assimp的相机输出

时间:2014-07-19 09:52:14

标签: opengl 3d assimp

我正在编写一个使用Assimp3.0显示3D场景的程序。

我的工作流程是:

  1. Blender2.71 export fbx。
  2. Assimp阅读fbx文件。
  3. 来自aiCamera的相机属性很奇怪。


    我在搅拌机里有一台相机:

    (blender' s坐标)

    位置:(0, -5, 0)

    轮换:(90, 0, 0)

    这应该是一个简单的前视摄像头。


    由于Assimp将沿x轴旋转所有模型-90度 我想Assimp会把这台相机换成

    (OpenGL' s坐标(x:右)(y:上)(z:屏幕外))

    postion:(0, -5, 0)

    up:(0, 0, 1)

    lookAt:(0, 1, 0)


    但是在我得到的aiCamera结构中:

    mPosition:(5, 0, 0)

    mUp:(0, 1, 0)

    mLookAt:(0, 0, 1)


    使用aiCamera的正确方法是什么?

1 个答案:

答案 0 :(得分: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*mLookAtmUpWorld = R*mUp

在c ++中,变换矩阵可以通过以下方式找到(假设 aiScene '场景'已加载):

//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;

然后可以使用Assimp的线性代数函数完成其余的计算。