0

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

我的工作流程是:

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

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


我在搅拌机中有一个相机:

(搅拌机坐标)

地点 :(0, -5, 0)

回转 :(90, 0, 0)

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


由于 Assimp 将沿 x 轴旋转所有模型-90度数,我想 Assimp 会将这个相机更改为

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

职位:(0, -5, 0)

向上 :(0, 0, 1)

看着 :(0, 1, 0)


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

移动位置:(5, 0, 0)

mUp :(0, 1, 0)

mL查看:(0, 0, 1)


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

4

1 回答 1

1

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

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

aiNode:摄像机和灯光分配给特定的节点名称 - 如果有多个具有此名称的节点,则将它们分配给每个节点。

所以在你的节点图中的某个地方有一个与你的相机同名的节点。此注释包含与您的相机坐标系相对应的齐次变换矩阵。乘积 T*v 会将齐次向量 v 从相机坐标系转换到世界坐标系。(将根坐标系表示为世界系统并假设相机的父级为根)。

mPosition 、mUpmLookAt相机坐标系的坐标给出,因此必须将它们转换为世界坐标系。区分作为空间点的 mPosition 与作为方向向量的 mUp 和 mLookAt 很重要。变换矩阵由旋转矩阵 R 和平移向量 t 组成。

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

世界坐标中的 mPosition 计算为mPositionWorld = T*mPosition,而方向向量计算为mLookAtWorld = R*mLookAtmUpWorld = 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;

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

于 2015-01-30T09:10:35.703 回答