【问题标题】:Rotating around a point with gluLookAt changing depth使用 gluLookAt 改变深度围绕一个点旋转
【发布时间】: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


【解决方案1】:

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

【讨论】:

    最近更新 更多