簡體   English   中英

如何定義始終平行於相機的平面的頂點?

[英]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

問題:如何定義平面的頂點?

  1. 取一些標准化向量UpDir作為向上方向(它可以是UpDir=(0,1,0)UpDir=(0,0,1)取決於您的坐標系,或者可以以某種方式計算)
  2. 計算normalUpDir SideDir
  3. 現在您可以使用SideDirUpDir作為平面坐標系的基礎,並將矩形的四個頂點計算為point+width*SideDir+height*UpDirpoint+width*SideDir-height*UpDirpoint-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.

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