所以,我有一个简单的项目。在中心只是一个简单的模型,你可以绕着它飞行,光跟随你。我只有一个小问题......灯似乎随着相机旋转。如果你不直视对象,它就不会亮起来。这是我的渲染代码:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//RENDER MODE
glPolygonMode(GL_FRONT_AND_BACK, GL_POLYGON);
int delta = getDelta();
glEnable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
glEnable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
glLoadIdentity();
glRotatef(rotation.x, 1, 0, 0);
glRotatef(rotation.y, 0, 1, 0);
glRotatef(rotation.z, 0, 0, 1);
glTranslatef(position.x, position.y, position.z);
int objectDisplayList = glGenLists(1);
glNewList(objectDisplayList, GL_COMPILE);
{
//Drawing Model
glColor3f(0.54f,0.27f,0.17f);
glBegin(GL_TRIANGLES);
for(Face face : m.faces){
Vector3f n1 = m.normals.get((int) face.normal.x - 1);
glNormal3f(n1.x, n1.y, n1.z);
Vector3f v1 = m.vertices.get((int) face.vertex.x - 1);
glVertex3f(v1.x, v1.y, v1.z);
Vector3f n2 = m.normals.get((int) face.normal.y - 1);
glNormal3f(n2.x, n2.y, n2.z);
Vector3f v2 = m.vertices.get((int) face.vertex.y - 1);
glVertex3f(v2.x, v2.y, v2.z);
Vector3f n3 = m.normals.get((int) face.normal.z - 1);
glNormal3f(n3.x, n3.y, n3.z);
Vector3f v3 = m.vertices.get((int) face.vertex.z - 1);
glVertex3f(v3.x, v3.y, v3.z);
}
glEnd();
}
glEndList();
glCallList(objectDisplayList);
glRotatef(rotation.x, -1, 0, 0);
glRotatef(rotation.y, 0, -1, 0);
glRotatef(rotation.z, 0, 0, -1);
glTranslatef(-position.x, -position.y, -position.z);
lightPosition = new float[]{position.x, position.y, position.z, 1};
glLight(GL_LIGHT0, GL_POSITION, asFloatBuffer(lightPosition));
另外,asFloatBuffer方法是:
private static FloatBuffer asFloatBuffer(float[] values) {
FloatBuffer buffer = BufferUtils.createFloatBuffer(values.length);
buffer.put(values);
buffer.flip();
return buffer;
}
我肯定知道光被放在正确的位置,因为我在控制台输出了播放器和灯光的位置,它们总是一样的。发生了什么事?
编辑:即使灯光没有移动,它仍然会这样做。
编辑:编辑代码,我刚刚更新的代码不会让灯光随着相机旋转,但光线不会移动,如果我把光源放在灯光代码周围,它会再次旋转:/答案 0 :(得分:0)
如果灯光随着相机一起旋转,则glRotate
是问题原因。可能你在错误的地方调用它,因为我不知道你的完整代码,我不能帮助你,但尝试做类似的事情:
doYourRotation()
draw()
undoYourRotation()
drawLight()
要撤消旋转,请将旋转角度传递为negative
,如:
doYourRotation -> glRotate(1.0D...)
undoYourRotation -> glRotate(-1.0D...)