使用相机旋转使四边形始终显示在相机前面(c++/opengl)

Using camera rotation to make quad always appear in front of the camera (c++/opengl)

本文关键字:相机 c++ opengl 前面 显示 旋转 四边形      更新时间:2023-10-16

我试图让一个四边形始终出现在相机前面,我试图从将它与x-z平面上的相机对齐开始,并确保它始终面向相机。我用了这个代码。。。

float ry = cameraRY+PI_2;
float dis = 12;
float sz = 4;
float x = cameraX-dis*cosf(ry);
float y = cameraY;
float z = cameraZ-dis*sinf(ry)+cosf(ry)*sz;
float x2 = x + sinf(ry)*sz;
float y2 = y + sz;
float z2 = z - cosf(ry)*sz;
glVertex3f(x,y,z);
glVertex3f(x2,y,z2);
glVertex3f(x2,y2,z2);
glVertex3f(x,y2,z);

但它看起来不太对劲,似乎四边形围绕着一个不可见的点旋转,而这个点正围绕着相机正确旋转。我真的不知道如何改变它,也不知道如何去做,任何帮助都很感激!

编辑:忘了提,cameraX、cameraY、cameraZ是相机的x、y、z位置

cameraRX和cameraRY是相机的x和y旋转(Z旋转始终为零)

查看Lighthouse3D的旧教程。它描述了几种"记账"技术,我相信这正是你想要的。

让p是您的模型视图投影矩阵,c是您试图绘制的四边形的中心。你想找到一对向量u,v来确定四边形的边,

Q = [ c-u-v, c-u+v, c-u-v, c+u-v ]

这样,u在剪辑坐标中直接指向下方,而v指向右侧:

P(u) = (0, s, 0, 0)
P(v) = (s, 0, 0, 0)

其中s是所需的四边形比例。假设P是以块对角线形式写的,

    [   M   | t ]
P = [-----------]
    [ 0 0 1 | 0 ]

然后设m0,m1是M的前两行。现在考虑我们为p(u)得到的方程,代入并简化,我们得到:

              [ 0 ]
P(u) ~> M u = [ s ]
              [ 0 ]

这导致了u,v的以下解决方案:

u = s * m1 / |m1|^2
v = s * m0 / |m0|^2