如何设置平面与相机具有相同的旋转?

How can I set a flat plane to have the same rotation as the camera?

我想要一个永远面向镜头的树广告牌。

目前,我正在使用 glRotatef() 并将树的偏航角旋转到相机的偏航角:

glRotatef(camera.yaw(), 0f, 1f, 0f);

然而,不幸的是,这不起作用。

这棵树似乎在向右转,而实际上它应该向左转。

我已经尝试过反转旋转,但这不起作用。

 glRotatef(-camera.yaw(), 0f, 1f, 0f);
OR
 glRotatef(camera.yaw(), 0f, -1f, 0f);

我总是可以求助于做一个交叉的广告牌(就像我在草地上做的那样),但是放大它看起来很糟糕。我宁愿只将它用作最后的手段。

我也可以使用 3D 模型作为替代方案,但我发现这要困难得多,而且它对显卡的要求也高得多。

我已经尝试寻找 here 的答案,但不仅令人困惑,而且它也适用于 flash,而且似乎甚至没有接近告诉如何去做对于其他语言。

如果需要(无论出于何种原因),我的整个渲染代码是:

public void render(){
    Main.TerrainDemo.shader.start();
    glPushMatrix();
    glDisable(GL_LIGHTING);
    glTranslatef(location.x * TerrainDemo.scale, location.y, location.z * TerrainDemo.scale); //Scale is the size of the map: More players online = bigger map.
    TexturedModel texturedModel = TerrainDemo.textModel;
    RawModel model = texturedModel.getRawModel();
    glDisable(GL_CULL_FACE);
    GL30.glBindVertexArray(model.getVaoID());
    GL20.glEnableVertexAttribArray(0);
    GL20.glEnableVertexAttribArray(1);
    GL13.glActiveTexture(GL13.GL_TEXTURE0);
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, TerrainDemo.textModel.getTexture().getID());
    glScalef(size.x, size.y, size.z);
    glColor4f(0, 0, 0, 0.5f); //0,0,0, because of the shaders.
    glRotatef(Main.TerrainDemo.camera.yaw(), 0f, 1f, 0f);
    glDrawElements(GL_TRIANGLES, model.getVertexCount(), GL11.GL_UNSIGNED_INT, 0);

    GL20.glDisableVertexAttribArray(0);
    GL20.glDisableVertexAttribArray(1);
    GL30.glBindVertexArray(0);
    glEnable(GL_LIGHTING);
    glPopMatrix();
    Main.TerrainDemo.shader.stop();
}

camera.yaw():

 /** @return the yaw of the camera in degrees */
public float yaw() {
    return yaw;
}

偏航在360​​度和-360度之间。

 /** Processes mouse input and converts it in to camera movement. */
public void processMouse() {
    float mouseDX = Mouse.getDX() * 0.16f;
    float mouseDY = Mouse.getDY() * 0.16f;

    if (yaw + mouseDX >= 360) {
        yaw = yaw + mouseDX - 360;
    } else if (yaw + mouseDX < 0) {
        yaw = 360 - yaw + mouseDX;
    } else {
        yaw += mouseDX/50;
    }
    //Removed code relevant to pitch, since it is not relevant to this question.
}

更新: 我尝试了很多组合,但是 camera.yaw() 似乎与树木的行为没有太大关系? 不管我怎么算,怎么划分,怎么处理,好像总是错的!

您想要的是一个轴对齐的广告牌。先取局部坐标中的中心轴,暂且称它为a。其次,你需要从视角到 some 点的轴(树的底部就可以了),我们称它为 v .给定这两个向量,你想形成一个 "tripod",一条腿与中心轴和视点方向共面。

这可以通过使用 a 之间的 Gram-Schmidt process, yielding v'. The third leg of the tripod is the cross product 将向量 va 正交化来完成v' 产生 r = a × v' 。轴对齐广告牌的边缘平行于ar;但这只是另一种说法,广告牌旋转到 (a,r) 平面,这正是旋转矩阵所描述的.假设未变换的广告牌几何体位于 XY 平面,a 平行于 Y,则旋转矩阵为

[r, a, (0,0,1)]

或者以更复杂的方式编写它

| r.x , a.x , 0 |
| r.y , a.y , 0 |
| r.z , a.z , 1 |

形成完整的4×4齐次变换矩阵展开为

| r.x , a.x , 0 , t.x |
| r.y , a.y , 0 , t.y |
| r.z , a.z , 1 , t.z |
|  0  ,  0  , 0 ,  1  |

其中 t 是翻译。


请注意,如果关于矩阵和向量运算的任何内容对您来说还没有意义,您必须立即停止使用 OpenGL 进行的任何操作,并首先学习这些必不可少的基本技能。您将需要它们。