使用glm :: lookat的问题

我想旋转一个精灵,所以它总是面对一个3D相机

目的

GLfloat vertexData[] = { // XYZUV 0.0f, 0.8f, 0.0f, 0.5f, 1.0f, -0.8f,-0.8f, 0.0f, 0.0f, 0.0f, 0.8f,-0.8f, 0.0f, 1.0f, 0.0f, }; 

每帧转换

 glm::mat4 newTransform = glm::lookAt(glm::vec3(0), gCamera.position(), gCamera.up()); shaders->setUniform("camera", gCamera.matrix()); shaders->setUniform("model", newTransform); 

在顶点着色器中:

 gl_Position = camera * model * vec4(vert, 1); 

如果我向上或向下移动摄像机,该物体将跟踪摄像机,但是如果我左右移动摄像机(将摄像机绕着物体的y轴旋转),它会向另一个方向旋转,所以我最终看到它的前面两次当我围绕它旋转360时,它的背部会翻转两次。

如果我使用-gCamera.up()来代替,它会跟踪相机的左右,但是当我向上/向下移动相机时,会旋转相反的方向。

我究竟做错了什么?

我想分享一个替代的解决scheme,假设你有权访问视图matrix。 它的优点是使广告牌保持与视图vector完全垂直,而不是将广告牌朝向相机。 看到它在这里整齐地解释: https : //swiftcoder.wordpress.com/2008/11/25/constructing-a-billboard-matrix/

您不必计算任何东西,只需使用视图matrix的顶部3×3部分的转置和广告牌位置vector即可:

  V11 V21 V31 Px billboardTransform = V12 V22 V32 Py V13 V23 V33 Pz 0 0 0 1 

其中P是广告牌对象的世界位置,V是视图matrix,定义为:

 |V11 V12 V13 V14| |V21 V22 V23 V24| |V31 V32 V33 V34| |V41 V42 V43 V44| 

注意:索引是使用math符号完成的。 因此,不要忘记考虑数据的内存布局(row-major / column-major)。

glm :: lookat毕竟不是我想要的。 在这里find答案

为了完整起见,代码复制如下(我改变了翻译线vec4(位置,1),否则它不翻译):

 mat4 billboard(vec3 position, vec3 cameraPos, vec3 cameraUp) { vec3 look = normalize(cameraPos - position); vec3 right = cross(cameraUp, look); vec3 up2 = cross(look, right); mat4 transform; transform[0] = vec4(right, 0); transform[1] = vec4(up2, 0); transform[2] = vec4(look, 0); // Uncomment this line to translate the position as well // (without it, it's just a rotation) //transform[3] = vec4(position, 1); return transform; } 

我不想操纵广告牌的每个顶点的原因是因为我打算将来使用更复杂的2D几何。