【发布时间】:2024-01-07 12:18:02
【问题描述】:
我正在尝试创建一个用户可以从不同角度查看的 3D 棋盘。我正在使用带有转换球坐标的 gluLookAt 来处理相机,但由于某种原因,这会改变对象的表观深度。我认为这与我将板生成为一系列立方体的事实有关,并且我不了解 gluLookAt 和 glTranslate 如何相互作用,但据我所知它应该可以工作。显示方法如下:
glu.gluLookAt(
r * cos(phi) * sin(theta) - .5, r * sin(phi) - .5, r * cos(phi) * cos(theta) - .5,
board.getSize()[0] / 2.0 - .5, board.getSize()[1] / 2.0 - .5, board.getSize()[2] / 2.0 - .5, //glutSolidCube centeres the cube at the origin so I have to shift back 1/2 the lengh of the cube
sin(phi) * sin(theta), abs(cos(phi)), sin(phi) * cos(theta));
for(int i=0;i<board.getSize()[2];i++){
for(int j=0;j<board.getSize()[1];j++){
for(int k=0;k<board.getSize()[0];k++){
glut.glutSolidCube(1f);
gl.glTranslatef(1f, 0f, 0f);
}
gl.glTranslatef(-1 * board.getSize()[0], 1f, 0f);
}
gl.glTranslatef(0f,-1 * board.getSize()[1], 1f);
}
请注意,我使用 theta 作为 x-z 平面中的角度,使用 phi 作为 x-z 平面和向量之间的角度。这是 pi/2 从通常的公式转移,这就是为什么 x=rcos(phi)sin(theta) 而不是 rsin(phi)sin(theta) 等等。
【问题讨论】:
-
你应该避免使用旧版 OpenGL
标签: java opengl rotation jogl chess