2014-07-19 31 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的線性代數函數來完成。