我正在尝试创建一个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)等等。
答案 0 :(得分:0)
glTranslatef()
不会影响gluLookAt()
。以下是gluLookAt()函数的参数:
gluLookat(Camera.x,Camera.y,Camera,z,Lookat.x,Lookat.y,Lookat.z,up.X,up.Y,up.Z);
对于您的情况,我认为您可以修复您的Lookat位置到电路板的中心,而不是在旋转时触摸它。 (作为一名国际象棋选手,这是我在大部分时间身体上看的地方)。对于向上矢量,我会使用固定(0,1,0)向量。