使用gluLook在一个点周围旋转改变深度

时间:2015-03-15 19:21:21

标签: java opengl rotation jogl chess

我正在尝试创建一个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)等等。

1 个答案:

答案 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)向量。