簡體   English   中英

如何檢測視圖矩陣是左撇子還是右撇子?

[英]how can I detect if a view matrix is left-handed or right-handed?

我有一個從GL程序收到的相機視圖矩陣。 知道這個矩陣是右撇子,因為這是GL的工作方式,但是我如何檢查該矩陣是右撇子還是編程左撇子呢?

對於投影矩陣,我檢查matrix [3] [4](行專業)是否為正,以查看是否為左手。 它是否正確?

謝謝。

編輯

我已經嘗試過行列式解決方案,但不幸的是,這不是真的(至少根據我的實驗):

我已經使用DX9數學函數對其進行了測試(以避免代碼中可能出現的錯誤)。 我已經運行了以下代碼:

 D3DXVECTOR3 vEye(0,0,0);
 D3DXVECTOR3 vTarget(6,3,0);
 D3DXVECTOR3 vUp(0,0,1);

 D3DXMATRIX matViewLH;
 D3DXMATRIX matViewRH;

 D3DXMatrixLookAtLH(&matViewLH, &vEye, &vTarget, &vUp);
 D3DXMatrixLookAtRH(&matViewRH, &vEye, &vTarget, &vUp);

 float fLHDet = D3DXMatrixDeterminant(&matViewLH);
 float fRHDet = D3DXMatrixDeterminant(&matViewRH);

並且兩個行列式相等(都等於0.99999994),並且顯然具有相同的符號。

關於我的問題-由於我同時獲得了視圖矩陣和投影矩陣,並且測試投影矩陣是LH還是RH相對容易-我使用此信息來標識坐標系。

您應該采用矩陣的行列式。 在其他條件相同的情況下,左手和右手矩陣的行列式應具有相反的符號。

這有點奇怪,因為“左撇子”和“右撇子”幾乎是任意約定。 但是,像鏡子一樣反映世界的矩陣具有負的行列式,因此乘以這樣的矩陣將改變行列式的符號。


編輯(參考更新的OQ):我懷疑D3DX*LH()D3DX*RH()函數之間的區別在於它們支持2種不同的約定。

如果是這樣,您應該意識到“左手”和“右手”不是每個單獨矩陣的屬性,而是由這些函數集生成的矩陣如何組合在一起的屬性。 如果您堅持使用*LH()函數,那么一切都應該正常工作; *RH()函數類似-但是,如果將它們混合使用,則可能會得到意想不到的結果。

無論如何,這些約定都不與GL有關,后者具有自己的約定集,並且與D3D都不完全兼容。 例如,GL的Z裁剪約定與D3D的約定不同。 這意味着生成相同視圖的投影矩陣在系統之間必然有所不同。

因此,對您的問題的簡短回答是“可能都不是”。

只需綁定相同的任務(僅用於檢測鏡像轉換的對象),便找到了一個簡單的解決方案,可以共享它。 如果矩陣有一個包含3個垂直軸的3x3零件,則可以使軸1和2的叉積,然后對該結果與其余的第3軸進行標量積。 檢查它是負數還是正數-您可以決定右/左慣性/是否鏡像對象。 如果我理解正確的問題...

暫無
暫無

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

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