2016-09-01 57 views
1

我已經實現了一個簡單的弧形球照相機,它運行良好 - 當我使用鼠標時,我通過滾動,俯仰和打哈欠來更新視圖矩陣。如何從視圖矩陣中獲取當前相機的位置?

但是,爲了正確計算鏡面反射,我需要當前相機在世界空間中的位置,這是在應用旋轉時不會更新的。

你們知道如何從視圖矩陣中檢索當前位置嗎?或者有另一種方式來更新這個?

+1

這是模型查看矩陣?如果是,請參閱https://www.opengl.org/discussion_boards/showthread.php/178484-Extracting-camera-position-from-a-ModelView-Matrix –

+0

不確定您的模型視圖矩陣意味着什麼:P通過視圖矩陣我的意思是DirectX :: XMMatrixLookAtLH(位置,目標,上)的結果 –

+0

我已經添加了一些調試打印,它不加起來。這裏的位置: 'BaseCamera :: updateVewMatrix():position 6.000000,6.000000-10.000000 0.000000' 這裏是視圖矩陣:'[[-0.000000] [0.000000] [1.000000] [0.000000]]''[0.000000] [1.000000] [0.000000] [0.000000]]''[-1.000000] [0.000000] [ - 0.000000] [0.000000]]''[[0.000000] [0.000000] [19.999998] [1.000000]] –

回答

3

你有一些簡單的選擇:

  1. 逆視圖矩陣通過調用XMMatrixInverse或D3DXMatrixInverse讓您得到「CameraWorld」矩陣。那麼它的(_41,_42,_43)元素就是位置向量。

  2. 反轉視圖矩陣(例如上次),而不是讀出子線,使用XMMatrixDecompose或D3DXMatrixDecompose獲取攝像機位置和方向。

一個偉大的想法是同時擁有查看和InvView矩陣在程序存儲器中,以便快速訪問這些信息:矩陣求逆的計算成本高昂。

  • 視圖矩陣就是相機的世界矩陣的逆變換(只是忘記了系統的左手或右手)。
+0

謝謝,第一種方法完全有效!然而,我將我的視圖矩陣存儲爲XMFLOAT4x4,所以爲了獲得數據,我必須將其轉換爲XMMATRIX,反轉,將其轉換回XMFLOAT4x4,然後獲取我的數據...您知道如何做得更好嗎?此外,此InvView矩陣用於其他事情,而不僅僅是獲取相機位置? –

+1

矩陣將被存儲爲XMMATRIX,以便讓編譯器將其存儲爲高速CPU浮點寄存器(請參見[SSE](https://en.wikipedia.org/wiki/Streaming_SIMD_Extensions),[3DNow!](https: //en.wikipedia.org/wiki/3DNow!),[NEON](https://en.wikipedia.org/wiki/ARM_architecture#NEON)等)。您可以使用XMStoreFloat4x4將XMMATRIX轉換爲XMFLOAT4X4(反之亦然,使用XMLoadStoreFloat4x4) –

+0

因此,您是說當存儲XMMATRIX並根據需要轉換爲XMFLOAT4x4時,我需要做一些計算? –

相關問題