簡體   English   中英

關於視圖矩陣和截錐體剔除

[英]About view matrix and frustum culling

我試圖確定 object(球體)是否在視錐體內。 我的策略是首先獲取視圖矩陣:

glm::lookAt(cameraPosition, lookAtPosition, cameraUp);

其中cameraPosition是相機的 position, lookAtPosition是通過cameraPosition + cameraDirection計算得出的,而cameraUp幾乎是不言自明的。

得到視圖矩陣后,我計算了相機視圖中截錐體的 8 個頂點,然后將視圖矩陣的倒數乘以每個點,得到它們在世界空間中的坐標。

使用世界空間中的這 8 個點,我可以使用叉積構造 6 個平面(因此它們的法線將指向內)。 然后我取 object 向量的點積(我通過減去 object position 與該平面上的任意點得到向量)與每個平面的法線向量都知道它在里面的所有平截頭體6, .

所以我的問題是:

  • 相機視圖是否始終設置在 (0,0,0) 並查看正 z 方向?
  • 視圖矩陣將世界視圖轉換為相機視圖,如果我使用它的逆矩陣將相機視圖轉換為世界視圖,是否正確?

我的截錐體與我的cameraDirection相反,這導致屏幕上什么都看不到(但它仍然在我的相機背面繪制東西)。

相機視圖是否始終設置在 (0,0,0) 並查看正 z 方向?

視圖空間是定義場景外觀的空間。
哪個部分被“看到”(投影到視口上)取決於投影矩陣。 通常(在 OpenGL 中)原點是 (0,0,0) 並且視圖空間z軸指向視口之外。 但是,投影矩陣反轉了z軸。 它從視圖空間的右手系統轉向規范化設備空間的左手系統。

它的倒數將相機視圖轉換為世界視圖

是的。

視圖矩陣從世界空間轉換到視圖空間。 投影矩陣將視圖空間的笛卡爾坐標轉換為剪輯空間的齊次坐標 通過將xyz分量除以w分量(透視除法),將剪輯空間坐標轉換為標准化設備空間。

標准化設備空間是一個立方體,最小值為 (-1, -1, -1),最大值為 (1, 1, 1)。 因此,立方體的 8 個角點是標准化設備空間中查看體積的角點。

(-1, -1, -1) ( 1,  -1, -1) ( 1,  1, -1) (-1,  1, -1) // near plane
(-1, -1,  1) ( 1,  -1,  1) ( 1,  1,  1) (-1,  1,  1) // far plane

如果要將點從標准化設備空間轉換為視圖空間,則必須:

  • 通過逆投影矩陣變換
  • 通過逆視圖矩陣變換
  • 將結果的xyz分量除以其w分量
glm::mat4 view;      // view matrix
glm::mat4 projetion; // projection matrix
glm::vec3 p_ndc;     // a point in normalized device space
glm::mat4 inv_projetion = glm::inverse( projetion );
glm::mat4 inv_view      = glm::inverse( view );

glm::vec4 pth = inv_view * inv_projetion * glm::vec4( p_ndc, 1.0f );

glm::vec3 pt_world = glm::vec3( pth ) / pth.w;

暫無
暫無

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

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