【发布时间】:2015-01-04 12:05:13
【问题描述】:
我想要一棵树的广告牌,始终面向相机。
目前,我只是使用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() 似乎与树木在做什么并没有关系? 不管我时间或划分或似乎用它做什么,它似乎总是错的!
【问题讨论】:
-
原始问题是针对哪个 API 提出的,数学原理始终相同。我承认一开始围绕矩阵数学思考可能会令人困惑。我认为您的心理“障碍”源于您使用
glRotate及其兄弟姐妹的事实;这些函数不仅对任何严重的事情几乎毫无用处,而且它们也已被弃用,并已从现代 OpenGL 中完全删除。一旦您知道如何使用矩阵,OTOH 就很容易。对于广告牌,您想要做的是摆脱相对于相机的任何旋转。 -
通过设置模型视图矩阵的一部分,最容易摆脱旋转,这将旋转到身份(乘以比例因子)。现在,在您的特定情况下,您实际上想要一个轴对齐的广告牌;这些设置起来有点棘手。
-
还有一条建议:Billboard 已经过了一个世纪。除了蒸汽轨迹、光束和光晕或覆盖在场景上的 HUD 信息之类的东西之外,现代图形中没有它们的位置。使用真实几何。
-
@datenwolf 他们是这么过去的世纪吗?可以同时吸引超过 100,000 人参与的多个游戏仍然使用这种技术。你对我应该改用什么有更好的建议吗?
-
某事告诉我,您只需稍微修改角度即可使其工作:您希望广告牌垂直于 XZ 平面中的相机前向矢量,这意味着它应该是相同的角度 + 90°。你试过用这种方式抵消那个旋转角度吗?