在OpenGL中显示面向摄影机并跟随3D对象的文本

在OpenGL中显示面向摄影机并跟随3D对象的文本,opengl,3d,camera,shader,perspective,Opengl,3d,Camera,Shader,Perspective,我试图在OpenGL中绘制两个对象: 通常受摄影机移动(带有透视投影)影响的3D对象(比如立方体) 具有字符串纹理的四元对象,必须跟随3D对象的位置,始终面向摄影机 这是我的初衷:我可以在立方体的顶部绘制一个立方体和一个字符串实体 现在,我希望显示始终面向摄影机的字符串。 如前所述,我从modelMatrix中删除了旋转,使文本面向我 文本确实面向我,但当我移动相机时,它没有跟随立方体的位置。。。(注意:对于立方体的初始位置,文本的位置似乎是确定的) 我应该错过一些东西 以下是我的一

我试图在OpenGL中绘制两个对象:

  • 通常受摄影机移动(带有透视投影)影响的3D对象(比如立方体)
  • 具有字符串纹理的四元对象,必须跟随3D对象的位置,始终面向摄影机
这是我的初衷:我可以在立方体的顶部绘制一个立方体和一个字符串实体

现在,我希望显示始终面向摄影机的字符串。 如前所述,我从modelMatrix中删除了旋转,使文本面向我

文本确实面向我,但当我移动相机时,它没有跟随立方体的位置。。。(注意:对于立方体的初始位置,文本的位置似乎是确定的)

我应该错过一些东西


以下是我的一些代码片段:

  • 顶点着色器:
(绘制文本时,统一的“isBillboarding”设置为1,绘制立方体时,统一的“isBillboarding”设置为0)

我解决了我的问题:

其思想是计算一个模型-视图转换矩阵,它是视图矩阵和模型矩阵之间的组合,模型矩阵重置视图矩阵的旋转(考虑到平移)

我为我的文本对象构建了一个专用着色器:

void main(void)
{
    gl_Position = projectionMatrix * modelViewMatrix * vec4(attribute_Position.xy, 0.0, 1.0);

    pass_textureCoords = attribute_TextureCoords;
    varying_Color = attribute_Color;
}
我将modelViewMatrix设置为:

Matrix4f viewMatrix = TransformationMatrix.createViewMatrix(renderer.camera); // or how ever you want to do it
Matrix4f modelMatrix = new Matrix4f();
modelMatrix.setIdentity();
// set the translation
modelMatrix.m30 = entityTranslation.x;
modelMatrix.m31 = entityTranslation.y;
modelMatrix.m32 = entityTranslation.z;
// reset the rotation
modelMatrix.m00 = viewMatrix.m00;
modelMatrix.m01 = viewMatrix.m10;
modelMatrix.m02 = viewMatrix.m20;
modelMatrix.m10 = viewMatrix.m01;
modelMatrix.m11 = viewMatrix.m11;
modelMatrix.m12 = viewMatrix.m21;
modelMatrix.m20 = viewMatrix.m02;
modelMatrix.m21 = viewMatrix.m12;
modelMatrix.m22 = viewMatrix.m22;
// compute modelViewMatrix
Matrix4f modelViewMatrix = modelMatrix;
modelViewMatrix.mul(viewMatrix);

shaderProgram.loadModelViewMatrix(modelViewMatrix);

这对我来说是个诀窍

在切断前用左上角的3x3矩阵变换
modelView
的第四列。我不明白。。。我必须做什么?类似于
mv[3]。xyz=mat3(mv)*mv[3]。xyz
。不过,对GLSL语法没有任何保证。然后你可以覆盖矩阵。嗯。。。它似乎更好一些,但还远远不够完美:对于居中的立方体,滚动效果很好,但对于俯仰效果仍然不好(文本在上下移动,左右位置相同)。当尝试使用不居中的立方体时,音高看起来是相同的,当尝试滚动时,文本保持在相同的位置(尽管立方体正在旋转)。好的,我可能忽略了一些东西。无论如何,获取要附加文本的屏幕空间位置并在着色器中使用它可能更容易。这只是一个具有逆模型视图投影矩阵的变换。
Matrix4f viewMatrix = TransformationMatrix.createViewMatrix(renderer.camera); // or how ever you want to do it
Matrix4f modelMatrix = new Matrix4f();
modelMatrix.setIdentity();
// set the translation
modelMatrix.m30 = entityTranslation.x;
modelMatrix.m31 = entityTranslation.y;
modelMatrix.m32 = entityTranslation.z;
// reset the rotation
modelMatrix.m00 = viewMatrix.m00;
modelMatrix.m01 = viewMatrix.m10;
modelMatrix.m02 = viewMatrix.m20;
modelMatrix.m10 = viewMatrix.m01;
modelMatrix.m11 = viewMatrix.m11;
modelMatrix.m12 = viewMatrix.m21;
modelMatrix.m20 = viewMatrix.m02;
modelMatrix.m21 = viewMatrix.m12;
modelMatrix.m22 = viewMatrix.m22;
// compute modelViewMatrix
Matrix4f modelViewMatrix = modelMatrix;
modelViewMatrix.mul(viewMatrix);

shaderProgram.loadModelViewMatrix(modelViewMatrix);