Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 理解ASIMP&x27;照相机输出_Opengl_3d_Assimp - Fatal编程技术网

Opengl 理解ASIMP&x27;照相机输出

Opengl 理解ASIMP&x27;照相机输出,opengl,3d,assimp,Opengl,3d,Assimp,我正在写一个程序来显示3d场景使用的是MP3.0 我的工作流程是: Blender2.71导出fbx Assimp读取fbx文件 aiCamera中的摄影机属性很奇怪 我在搅拌机里有一个摄像头,带有: (搅拌机坐标) 位置:(0,-5,0) 旋转:(90,0,0) 这应该是一个简单的前视摄像头 因为ASIMP将沿x轴旋转所有型号-90 我想阿西姆会把这架照相机换成 (OpenGL的坐标(x:右)(y:向上)(z:屏幕外)) 职位:(0,-5,0) 向上:(0,0,1) 看:(0,1,0)

我正在写一个程序来显示3d场景使用的是MP3.0

我的工作流程是:

  • Blender2.71导出fbx
  • Assimp读取fbx文件
  • aiCamera
    中的摄影机属性很奇怪


    我在搅拌机里有一个摄像头,带有:

    (搅拌机坐标)

    位置:
    (0,-5,0)

    旋转:
    (90,0,0)

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


    因为ASIMP将沿x轴旋转所有型号
    -90
    我想阿西姆会把这架照相机换成

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

    职位:
    (0,-5,0)

    向上:
    (0,0,1)

    看:
    (0,1,0)


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

    位置:
    (5,0,0)

    mUp:
    (0,1,0)

    mLookAt:
    (0,0,1)



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

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

    aiCamera:摄影机在节点图[…]中具有表示形式。这意味着,任何值(如“注视向量”)都不是绝对值,它们是相对于由与摄影机对应的节点定义的坐标系的

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

    因此,在节点图中的某个位置,有一个节点与摄影机同名。此注释包含与相机坐标系对应的齐次变换矩阵。乘积T*v将齐次向量v从相机坐标系转换到世界坐标系。(将根坐标系表示为世界坐标系,并假定摄影机的父坐标系为根坐标系)

    mPosition、mUp和mLookAt在摄影机坐标系的坐标中给出,因此它们必须转换为世界坐标系。重要的是要区分作为空间点的位置和作为方向向量的mUp和mLookAt。变换矩阵由旋转矩阵R和平移向量t组成

           R   |  t
    T = --------------
         0 0 0 |  1
    
    世界坐标中的位置计算为
    mPositionWorld=T*mPosition
    ,而方向向量计算为
    mLookAtWorld=R*mLookAt
    mUpWorld=R*mUp

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

    剩下的计算可以使用Assimp的线性代数函数完成

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