我正在编写一个使用Assimp3.0显示3D场景的程序。
我的工作流程是:
来自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
的正确方法是什么?
答案 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*mLookAt
和mUpWorld = 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的线性代数函数完成其余的计算。