【问题标题】:Understanding Assimp's camera output了解 Assimp 的相机输出
【发布时间】:2014-09-10 10:03:45
【问题描述】:

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

我的工作流程是:

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

aiCamera 的相机属性很奇怪。


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

(搅拌机坐标)

位置:(0, -5, 0)

旋转:(90, 0, 0)

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


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

(OpenGL 的坐标 (x : right) (y : up) (z : out of screen))

职位:(0, -5, 0)

向上:(0, 0, 1)

看:(0, 1, 0)


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

mPosition : (5, 0, 0)

mUp:(0, 1, 0)

mLookAt:(0, 0, 1)


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

【问题讨论】:

    标签: opengl 3d assimp


    【解决方案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 '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 的线性代数函数完成其余的计算。

    【讨论】:

      猜你喜欢
      • 2018-05-10
      • 2014-06-10
      • 2019-02-13
      • 2012-10-21
      • 2018-09-22
      • 2019-02-18
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多