[英]How can I define vertices of a plane that is always parallel to the camera?
我正在嘗試繪制一個始終與相機平行的矩形(基本上是一個平面)。 我想將平面限制為一定大小(假設高度 = 2 和寬度 = 2 個單位)。 但是,我不明白如何將 position 設置為頂點,以使矩形始終與相機平行。
首先,我使用以下方法計算相機法線(方向):
glm::normalize(mPosition - mTargetPos); // normal
然后我使用點法線方程來定義平面:
normal = (A, B, C)
point = (a, b, c) // this point will serve as a center to the plane
A(x−a)+B(y−b)+C(z−c) = 0
問題:如何定義平面的頂點?
UpDir
作為向上方向(它可以是UpDir=(0,1,0)
或UpDir=(0,0,1)
取決於您的坐標系,或者可以以某種方式計算)normal
和UpDir
SideDir
SideDir
和UpDir
作為平面坐標系的基礎,並將矩形的四個頂點計算為point+width*SideDir+height*UpDir
、 point+width*SideDir-height*UpDir
、 point-width*SideDir-height*UpDir
, point-width*SideDir+height*UpDir
我建議在視圖空間中定義點。 最后通過逆視圖矩陣變換點。
在視圖空間中,如果點具有相同的 z 坐標,則它們與視圖平行。 z 坐標必須為負,並且其量必須大於到近平面的距離且小於到遠平面的距離:
near < -z < far
計算視圖矩陣 ( view_mat
) 並定義視圖空間中的點:
glm::mat4 view_mat = glm::lookAt(mPosition, mTargetPos, mUp);
float z =
glm::vec3 pt1View(x1, y1, z);
glm::vec3 pt2View(x2, y2, z);
// [...]
將點從視空間變換到世界空間:
glm::mat4 inverse_view_mat = glm::inverse(view_mat);
glm::vec3 pt1World = glm::vec3(inverse_view_mat * glm::vec4(pt1View, 1.0f));
glm::vec3 pt2World = glm::vec3(inverse_view_mat * glm::vec4(pt2View, 1.0f));
// [...]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.