繁体   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