好的,所以我得到了gluLookAt的代码:
lookAt = new Vector3f(-player.pos.x, -player.pos.y, -player.pos.z);
lookAt.x += (float)Math.cos(Math.toRadians(player.yaw)) * Math.cos(Math.toRadians(player.pitch));
lookAt.y += (float)Math.sin(Math.toRadians(player.pitch));
lookAt.z += (float) Math.sin(Math.toRadians(player.yaw)) * Math.cos(Math.toRadians(player.pitch));
GLU.gluLookAt(-player.pos.x, -player.pos.y, -player.pos.z,
lookAt.x, lookAt.y, lookAt.z,
0, 1, 0);
当我尝试绘制旋转的立方体时,它无法正常旋转。
GL11.glPushMatrix();
GL11.glLoadIdentity();
GL11.glTranslatef(-cube.pos.x, -cube.pos.y, -cube.pos.z);
GL11.glRotatef(cube.yaw, 0, 1, 0);
GL11.glTranslatef(cube.pos.x, cube.pos.y, cube.pos.z);
/*draw the cube normally*/
GL11.glPopMatrix();
所以我的问题是我是否正确处理glulookat完成的矩阵变更?或者我做错了什么?我正在寻找的结果是将立方体返回到0,0,0并旋转它,然后将其放回原处。
答案 0 :(得分:2)
问题在这里:
GL11.glTranslatef(-cube.pos.x, -cube.pos.y, -cube.pos.z);
GL11.glRotatef(cube.yaw, 0, 1, 0);
GL11.glTranslatef(cube.pos.x, cube.pos.y, cube.pos.z);
立方体已经在'0,0,0'。这是因为Medel矩阵是身份(就像你所说的glLoadIdentity())。
所以你应该这样做:
GL11.glRotatef(cube.yaw, 0, 1, 0);
GL11.glTranslatef(cube.pos.x, cube.pos.y, cube.pos.z);
应具有所需的效果。如果没有,请尝试使用固定的相机,看看你在glulookat()之前添加的代码是否导致外观目标距离0,0,0(你的立方体所在的位置)太远了
答案 1 :(得分:1)
在绘制多维数据集之前调用glLoadIdentity将清除视图矩阵中gluLookAt设置的内容,我认为它不应该存在。