2010-04-10 84 views
3

我正在使用CML來管理我爲工作而開發的基於OpenGL的界面項目中的3D數學運算。我需要知道在距眼點一定距離處觀看視錐體的寬度,該視點保持爲代表相機的4×4矩陣的一部分。我的目標是將gui對象沿着視口的明顯邊緣放置,但距離近剪裁平面有一段距離。距離近平面給定距離處的平截頭體的寬度

CML具有提取平截頭體的平面的功能,以Ax + By + Cz + D = 0形式給出它們。該平截頭體垂直於相機,其不一定與透視投影的z軸對齊。

我想提取x和z座標,以便在離攝像機不同距離處將圖形元素固定在屏幕兩側。什麼是最好的方式去做呢?

謝謝!

回答

2

這似乎是Finding side length of a cross-section of a pyramid frustum/truncated pyramid的副本,如果已經有一個已知寬度與頂點已知距離的橫截面。如果你沒有這個,你想自己得到答案,你可以按照這些步驟。

  1. 取兩個相鄰的平面,並找到他們的交點L1的 。您可以使用here的步驟 。真的是 你需要的是方向 該行的向量。
  2. 再取兩個飛機,其中一個與上一步相同 ,並找到 它們的交線L2。
  3. 請注意,Ax + By + Cz + D = 0形式的所有平面都會穿過原點,因此您知道L1和L2相交。
  4. 爲你自​​己畫一張L1和L2的 方向矢量圖, 尾的原點。這些形成一個 角度;稱它爲theta。使用兩個向量之間的角度 的公式來找到theta ,例如, here
  5. 繪製該角度的平分線。從 原點(這會創建一個等腰三角形,等分成兩個全等直角三角形的兩個 ),您想要的距離d垂直於等分線的垂直線012.。垂直線的長度爲 所需的平截頭體寬度w。請注意,w是 兩倍於直角三角形的基底 之一的長度。
  6. 設r爲正三角形的斜邊的 的長度。 則R COS(希塔/ 2)= d和 ř罪(希塔/ 2)= W/2,所以 黃褐色(希塔/ 2)=(W/2)/ d,這意味着 W = 2D *黃褐色(希塔/ 2)。既然你知道d 和theta,你就完成了。

請注意,我們已經找到了截頭的截面的一邊的長度。這將適用於任何截錐體的任何垂直截面。這可以擴展到適應非垂直的橫截面。

+0

我認爲這個帖子有點不同,因爲他新增了截錐體的所有維度,因爲我只是參數化的形式。我可以得到近平面的尺寸,因爲左側,右側,頂部和底部的D值在其上,但不知道如何獲得另一個橫截面。我認爲主要的問題是我不太瞭解如何處理這個參數化表單。 但是,我知道FOV角度和相機的距離,所以我最終需要的是6。 – joshfisher 2010-04-10 18:05:37