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