2014-07-19 28 views
0

我在用Assimp3.0编写一个程序来显示3D场景。了解Assimp的摄像头输出

我的工作流程是:

  1. Blender2.71出口FBX。
  2. Assimp读取fbx文件。

来自aiCamera的相机属性很奇怪。


我有一个摄像头在搅拌器与:

(Blender的坐标)

位置:(0, -5, 0)

旋转:(90, 0, 0)

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


由于Assimp将旋转所有型号沿x轴 -90程度我想Assimp将这款相机切换到

(OpenGL的坐标(X:右)(Y:上)(Z:出屏幕))

现在的位置:(0, -5, 0)

起来:(0, 0, 1)

的lookAt:(0, 1, 0)


但在aiCamera结构我:

mPosition:(5, 0, 0)

MUP:(0, 1, 0)

mLookAt:(0, 0, 1)


什么是正确的方式使用aiCamera

回答

1

aiCamera存在于aiNode图中。引用的文档aiCamera和aiNode

aiCamera:相机具有节点图中的表示[...]。这意味着,诸如查看矢量之类的任何值都不是绝对的,它们相对于与相机对应的节点定义的坐标系。

aiNode:摄像机和指示灯被分配给特定的节点名称 - 如果有多个节点具有该名称,则将它们分配给它们中的每一个。

因此,在您的节点图的某个地方有一个与您的相机名称相同的节点。本笔记包含与您的相机坐标系对应的齐次变换矩阵。乘积T * v将把摄像机坐标系统中的齐次向量v转换为世界坐标系统。 (将根坐标系表示为世界系统,并假定相机的父母是根)。

mPositionMUPmLookAt在坐标系中的摄像机坐标给出,所以必须转换到世界坐标系。区分作为空间点的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的线性代数函数来完成。