在 OpenGL 中显示面向相机并跟随 3D 对象的文本
Display a text facing the camera and following a 3D object in OpenGL
我正在尝试在 OpenGL 中绘制两个对象:
- 通常受相机移动影响的 3D 对象(假设是立方体)(使用透视投影)
- 具有字符串纹理的四边形对象,必须跟随 3D 对象的位置,始终面向相机。
这是我的初始点:我可以在其顶部绘制一个立方体和一个字符串实体。
我现在想显示始终面向相机的字符串。
正如所解释的那样 here,我从我的 modelMatrix 中删除了旋转以使文本面向我。
文字确实是面向我的,但是当我移动相机时它并没有跟随立方体的位置...(注意:立方体的初始位置,文字的位置似乎是可以的).
我应该少了什么...
这是我的一些代码片段:
- 顶点着色器:
(绘制文字时uniform"isBillboarding"设置为1,绘制立方体时uniform"isBillboarding"设置为0)
uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform float isBillboarding; // 0 for no, 1 for yes
[...]
attribute vec3 attribute_Position;
[...]
void main(void)
{
mat4 modelView = viewMatrix * transformationMatrix;
if (isBillboarding > 0.5)
{
modelView[0][0] = 1;
modelView[0][1] = 0;
modelView[0][2] = 0;
modelView[1][0] = 0;
modelView[1][1] = -1;
modelView[1][2] = 0;
}
gl_Position = projectionMatrix * modelView * vec4(attribute_Position,1.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);
这对我有用
我正在尝试在 OpenGL 中绘制两个对象:
- 通常受相机移动影响的 3D 对象(假设是立方体)(使用透视投影)
- 具有字符串纹理的四边形对象,必须跟随 3D 对象的位置,始终面向相机。
这是我的初始点:我可以在其顶部绘制一个立方体和一个字符串实体。
我现在想显示始终面向相机的字符串。 正如所解释的那样 here,我从我的 modelMatrix 中删除了旋转以使文本面向我。
文字确实是面向我的,但是当我移动相机时它并没有跟随立方体的位置...(注意:立方体的初始位置,文字的位置似乎是可以的).
我应该少了什么...
这是我的一些代码片段:
- 顶点着色器:
(绘制文字时uniform"isBillboarding"设置为1,绘制立方体时uniform"isBillboarding"设置为0)
uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform float isBillboarding; // 0 for no, 1 for yes
[...]
attribute vec3 attribute_Position;
[...]
void main(void)
{
mat4 modelView = viewMatrix * transformationMatrix;
if (isBillboarding > 0.5)
{
modelView[0][0] = 1;
modelView[0][1] = 0;
modelView[0][2] = 0;
modelView[1][0] = 0;
modelView[1][1] = -1;
modelView[1][2] = 0;
}
gl_Position = projectionMatrix * modelView * vec4(attribute_Position,1.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);
这对我有用