簡體   English   中英

如何反轉相機矩陣中一個軸的旋轉(例如 OSG CameraViewMatrix)

[英]How to invert the Rotation of one Axis in a Camera Matrix (e.g. OSG CameraViewMatrix)

對於增強現實應用程序,我使用了一些 slam 算法來預測我手機的當前方向。

該算法 ( LSD-Slam ) 以 SE3 謊言群的形式提供當前姿勢(使用Sophus::Sim3f )。 如果我猜對了,這種類型包含一個矩陣,可以將其解釋為相機的 Viewmatrix。 初始化后,例如矩陣看起來像這樣:

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

為了可視化 3D 內容,我使用 OpenSceneGraph。 Fortunatley,在 OSG 中,您可以使用視圖矩陣直接設置相機位置:

camera->setViewMatrix(matrix);

現在,當我運行代碼時,如果我圍繞 Y(滾動)或 Z(偏航)旋轉,事情似乎可以正常工作。 但是當我圍繞 X(俯仰)旋轉時,我在 OSG 中的數碼相機似乎與它應該做的完全相反。

例如:想象一個 3D 模型直接在相機前面。 如果我然后慢慢向上傾斜相機(圍繞 X),3D 模型也會向上移動,而它實際上應該將屏幕留在底端。 我試圖用下圖說明這種行為: 軸行為

可能有一個非常簡單的解決方案,但即使經過數小時的嘗試,我也無法解決。 如果我理解正確,第一列代表圍繞某個軸的旋轉,所以我嘗試反轉單個向量,例如這樣做:

u u u 0       -u u u 0          -u -u -u 0
v v v 0   =>  -v v v 0   ...     v v v 0 
n n n 0       -n n n 0           n n n 0
0 0 0 1        0 0 0 1           0 0 0 1

雖然有些嘗試確實解決了音高問題,但他們又搞砸了另一個軸。至少似乎總是有一個軸是錯誤的。 有人知道我如何解決這個問題嗎? 我真的很感激關於這個問題的任何提示。

如果您從庫中獲得的姿勢對應於 OpenGL 視圖矩陣,則您應該能夠像您提到的那樣將其直接傳遞給 osg 相機。

但是,請記住,OSG 采用行主矩陣約定(例如參見這篇文章),因此您可能需要在矩陣中切換行/列。

如果這不起作用,我建議您確保 Sophus 使用的姿勢約定(相對於世界坐標中的哪個靜止位置旋轉)並從頭開始重新創建相同的變換是 osg。

再次檢查 Sophus 后,我發現我可以單獨獲得旋轉矩陣和平移向量。 使用這篇文章,我將旋轉矩陣轉換為歐拉角。 使用歐拉角,我能夠單獨設置每個軸的旋轉:

  rotationMatrix.makeRotate(
  osg::DegreesToRadians(-angleZ), osg::Vec3(0,1,0), // roll
  osg::DegreesToRadians(angleX), osg::Vec3(1,0,0) , // pitch
  osg::DegreesToRadians(angleY), osg::Vec3(0,0,1) ); // heading

倒轉終於成功了……

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM