有 Java 编程相关的问题?

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

java gluLookAt第一人称视图

我正在尝试将我的太空入侵者游戏切换到第一人称视角,即从飞船上看世界。我有点搞不清楚我应该看哪一点。我目前正在gluLookAt中使用这些参数:

GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();
GLU.gluLookAt(ship3dPos.x, ship3dPos.y, ship3dPos.z,400.0f, 600.0f,-50.0f, 0.0f, 1.0f,-0.0f);

我不确定我应该设置参数4、5和6,以查看整个世界(窗口为800/600)


共 (2) 个答案

  1. # 1 楼答案

    如果您想要第一人称视图,则参数0 1 2将是玩家,3 4 5将是他们正在查看的位置,6 7 8将向上

    gluLookAt(eye.x,eye.y,eye.z,center.x,center.y,center.z,up.x,up.y,up.z)

    上方向向量-定义视图enter image description here

  2. # 2 楼答案

    根据您评论中的说明,您希望您所观察点的x坐标(centerx)随船舶位置而变化。因此,这可能与ship3dPos.x相同

    我们仍然需要弄清楚的一件事是飞船和外星人的z深度。我现在假设它们是相等的,在这种情况下centerz就是这个深度。如果它们不相等,那么我们需要再做一点数学运算,下面centery的答案将略有变化

    你说你想“仰望”外星人,所以你需要一个比ship3dPos.y更大的y值。记住,“注视”点可以是视线上的任何点,因此(再次假设深度相同)ship3dPos.y+1.0将起作用,或者如果你对外星人的y位置估计为500感到满意,你也可以使用它。基本上,只要深度相同,外星人的y位置大于飞船的y位置,你就可以使用任何大于ship3dPos.y的东西

    根据上述假设,您的“注视”向量(centerx、centery、centerz)将为:

    ship3dPos.x, ship3dPos.y+1.0, ship3dPos.z
    

    但是在gluLookAt()调用中还有一个组件需要注意:up向量。如果我们将up向量保留为(0,1,0),您仍然可以直接查看屏幕。我假设你真正想要的是沿着屏幕的平面(x-y平面)看,在这种情况下up应该在z方向,上方向向量是:

    0.0f, 0.0f, 1.0f
    

    试一试,看看它是否做了你认为应该做的事情