首页 文章

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

提问于
浏览
1

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

  • 通常受相机移动影响的3D对象(比如说立方体)(带有透视投影)

  • 具有字符串纹理的四边形对象,其必须遵循3D对象的位置,始终面向相机 .

这是我的初始观点:我可以在它的顶部绘制一个立方体和一个字符串实体 .

enter image description here

我现在想要显示始终面向相机的字符串 . 正如解释here,我从我的modelMatrix中删除了旋转,使文本面向我 .

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

enter image description here

enter image description here

我应该遗漏一些东西......


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

  • 顶点着色器:

(在绘制文本时,统一的“isBillboarding”设置为1,绘制立方体时,统一的“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);
    [...]
}

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);
    

    这对我来说很有用

相关问题