[英]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, .
所以我的問題是:
我的截錐體與我的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
如果要將點從標准化設備空間轉換為視圖空間,則必須:
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.