有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java围绕一个点旋转,观察深度的变化

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

注意,我使用θ作为x-z平面中的角度,φ作为x-z平面和向量之间的角度。这是pi/2从通常的公式转变过来的,这就是为什么x=rcos(phi)sin(θ)而不是rsin(phi)sin(θ)等等


共 (1) 个答案

  1. # 1 楼答案

    glTranslatef()不影响gluLookAt()。以下是gluLookAt()函数的参数:

     gluLookat(Camera.x,Camera.y,Camera,z,Lookat.x,Lookat.y,Lookat.z,up.X,up.Y,up.Z);
    

    对于您的情况,我认为您可以将您的注视位置固定到电路板的中心,旋转时不要触摸它。(作为一名国际象棋棋手,我大部分时间都会在这里观看比赛)。对于上方向向量,我将使用固定(0,1,0)向量