Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用相机旋转使四边形始终显示在相机前面(c+;+;/opengl)_C++_Math_Opengl - Fatal编程技术网

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

C++ 使用相机旋转使四边形始终显示在相机前面(c+;+;/opengl),c++,math,opengl,C++,Math,Opengl,我试着让一个四边形始终出现在相机前面,我试着首先将它与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 =

我试着让一个四边形始终出现在相机前面,我试着首先将它与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旋转始终为零)

在Lighthouse 3D上查看此项。它描述了几种“广告牌”技术,我相信这正是你想要的

设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

如果人们看到这个问题,可能会寻找正确的答案(我实际上已经使用了该教程中的一些技术),但是在我的例子中,我实际上需要对我的对象进行3d变换。我最终解决了我的问题,在世界平移或旋转之前进行了这些转换,然后重置了矩阵(弹出它等等)。如果这不是你想要的,请随意取消接受。我不想阻止你得到正确的答案。不过,你可能想澄清你的问题。你想画些图形用户界面吗?你需要关闭深度测试的正交投影吗?也许你想切换到2d渲染模式,在相机正前方旋转四边形看起来有点奇怪,也可以在2d渲染模式下完成,而且更容易。可以在opengl中组合3d和2d模式,以便在3d场景上绘制屏幕用户界面。