2015-11-16 30 views
2

我試圖通過SceneKit實現增強現實。如何將相機外部矩陣轉換爲SCNCamera的位置和旋轉

使用ARuco(OpenCV增強現實庫),我通過估計標記的姿勢獲得了內在相機矩陣和外部矩陣。

然後我用的projectionTransform設置了固有矩陣(fovy,aspect,zNear,zFar)的參數。

通常在OpenGL,世界座標相對於相機座標用ModelView計算,但是在SceneKit中,沒有像modelView這樣的東西。

所以我計算了外部矩陣的逆矩陣,得到相對於世界座標(標記座標)的攝像機座標

我想通過包含旋轉和平移矩陣的逆矩陣可以得到正確的相機位置。

但是我不能從相機的輪轉

你有什麼想法嗎?

回答

5

SceneKit具有與OpenGL中相同的視圖矩陣,它們只是有點隱藏,直到開始渲染着色器爲止。有點太隱藏IMO。

你似乎已經發現了大部分。投影矩陣來自相機projectionTransform,視圖矩陣來自相機矩陣SCNMatrix4Invert(cameraNode.transform)的反轉矩陣。在我的例子中,所有東西都在世界座標系中,使我的模型矩陣成爲一個簡單的單位矩陣

我結束了使用,以獲得經典的模型 - 視圖 - 投影矩陣的代碼是類似...

let projection = camera.projectionTransform() 
let view = SCNMatrix4Invert(cameraNode.transform) 
let model = SCNMatrix4Identity 

let viewProjection = SCNMatrix4Mult(view, projection) 
let modelViewProjection = SCNMatrix4Mult(model, viewProjection) 

出於某種原因,我發現了SCNMatrix4Mult(...)在參數不同的順序,比我期待(例如;與GLKMatrix4Multiply(...)相反)。

我還沒有100%在這個,所以會歡迎編輯/提示。使用這種方法我無法獲得SceneKit MVP矩陣(傳遞給着色器)以匹配上面代碼計算的矩陣......但它足夠接近我需要的。

+0

我還沒有意識到我需要的是反轉外部矩陣並將其設置爲'SCNCamera's'transform'!你的回答給了我一個提示。但是我需要旋轉外部矩陣,可能是因爲OpenCV的座標和OpenGL的座標差異。仍然我的3D模型看起來不符合真正的標記。也許內在參數問題... – akira108

+0

很高興它有一點幫助。從來沒有看過AR的東西,希望別人可以幫助你。 – lock

+0

@ akira108能否顯示相關代碼來設置相機和模型轉換? –

2

@鎖的答案看起來不錯,與一對夫婦補充:

(1)接入SCNNode worldTransform代替的情況下,變換的cameraNode是動畫或父:

let view = SCNMatrix4Invert(cameraNode.presentationNode.worldTransform) 

(2)的代碼沒有按」 t佔視圖的寬高比。例如假設透視投影,你想做的事:

perspMatrix.m11 /= viewportAR; //if using Yfov -> adjust Y` 
/* or, */ 
perspMatrix.m22 *= viewportAR; //if using Xfov -> adjust X` 

其中,viewportAR = viewport.width/viewport.height

另一種方式來做到這一點是有一個節點與場景渲染的代表,以及來自檢索SceneKit的矩陣該代表(它們作爲選項通過):

FOUNDATION_EXTERN NSString * const SCNModelTransform; 
FOUNDATION_EXTERN NSString * const SCNViewTransform; 
FOUNDATION_EXTERN NSString * const SCNProjectionTransform; 
FOUNDATION_EXTERN NSString * const SCNNormalTransform; 
FOUNDATION_EXTERN NSString * const SCNModelViewTransform; 
FOUNDATION_EXTERN NSString * const SCNModelViewProjectionTransform;