【问题标题】:LWJGL first person camera using jBullet使用 jBullet 的 LWJGL 第一人称相机
【发布时间】:2013-07-30 12:31:52
【问题描述】:

我已经设置了一个摄像头,我可以使用 WASD 移动并使用鼠标旋转视图。但现在问题来了:我想为相机/播放器添加物理特性,以便它与我的其他 jBullet 对象“交互”。我怎么做?我考虑为相机创建一个 RigidBody 并将位置存储在那里,以便 jBullet 可以将其物理应用到相机。然后,当我需要改变一些东西(位置)时,我可以简单地在 RigidBody 中改变它。但是我没有找到任何编辑位置的方法。

你能把我推向正确的方向,或者给我一个示例源代码吗?

【问题讨论】:

    标签: java opengl camera lwjgl jbullet


    【解决方案1】:

    几天前我自己也在问同样的问题。我的解决方案正如Sierox所说。创建 BoxShape 的刚体并将其添加到 DynaicsWorld。要移动相机,请对其刚体施加力。我将线性阻尼设置为 0.999,角度阻尼设置为 1,以便在没有施加力时停止相机,即播放器停止按下按钮。

    我也使用 body.setAngularFactor(0);所以盒子不会到处翻滚。还要将质量设置得非常低,以免过多地干扰其他物体,但仍然可以跳上并撞到它们,否则会受到它们的影响。

    请记住将您的 x、y 和 z 坐标转换为笛卡尔平面,以便您沿相机方向移动。即

    protected void setCartesian(){//set xyz to a standard plane
        yrotrad = (float) (yrot / 180 * Math.PI);
        xrotrad = (float) (xrot / 180 * Math.PI);
        float pd = (float) (Math.PI/180);
        x = (float) (-Math.cos(xrot*pd)*Math.sin(yrot*pd));
        z = (float) (-Math.cos(xrot*pd)*Math.cos(yrot*pd));
        //y = (float) Math.sin(xrot*pd);
    }//..
    
    public void forward(){// move forward from position in direction of camera
        setCartesian();
        x += (Math.sin(yrotrad))*spd;
        z -= (Math.cos(yrotrad))*spd;
        //y -= (Math.sin(xrotrad))*spd;
        body.applyForce(new Vector3f(x,0,z),getThrow());
    }//..
    
    
    public Vector3f getThrow(){// get relative position of the camera
    
        float nx=x,ny=y,nz=z;
        float xrotrad, yrotrad;
        yrotrad = (float) (yrot / 180 * Math.PI);
        xrotrad = (float) (xrot / 180 * Math.PI);
        nx += (Math.sin(yrotrad))*2;
        nz -= (Math.cos(yrotrad))*2;
        ny -= (Math.sin(xrotrad))*2;
        return new Vector3f(nx,ny,nz);
    }//..
    

    跳转只需使用 body.setLinearVelocity(new Vector3f(0,jumpHt,0));并将 jumpHt 设置为您希望的任何速度。

    我使用 getThrow 为我可能在屏幕上“投掷”或携带的其他对象返回一个向量。我希望我回答了你的问题并且没有提供太多非必要的信息。我会尝试找到给我这个想法的来源。我相信是在 Bullet 论坛上。

    ------- 编辑 ------

    很抱歉遗漏了那部分

    一旦刚体正常运行,您只需获取它的坐标并将其应用到您的相机,例如:

    float mat[] = new float[16];
    
    Transform t = new Transform();
    t = body.getWorldTransform(t);
    t.origin.get(mat);
    
            x = mat[0];
            y = mat[1];
            z = mat[2];
    
       gl.glRotatef(xrot, 1, 0, 0);  //rotate our camera on teh x-axis (left and right)
       gl.glRotatef(yrot, 0, 1, 0);  //rotate our camera on the y-axis (up and down)
       gl.glTranslatef(-x, -y, -z); //translate the screen to the position of our camera
    

    在我的例子中,我将 OpenGL 用于图形。 xrot 和 yrot 代表相机的俯仰和偏航。上面的代码以矩阵的形式获取世界变换,对于相机而言,您只需拉出 x、y 和 z 坐标,然后应用变换。

    从这里,要移动相机,你可以设置刚体的线速度来移动相机或施加力。

    【讨论】:

      【解决方案2】:

      在您阅读此答案之前,我想提一下,我对答案中所述的解决方案有疑问。你可以关注my question关于这个问题,这样如果你使用这个答案,你也可以得到解决方案。

      所以。首先,您需要创建一个新的 BoxShape:

      CollisionShape cameraHolder = new BoxShape(SIZE OF CAMERAHOLDER);
      

      并将其添加到您的世界中,以便它与所有其他对象交互。现在您需要更改所有关于相机移动(不是旋转)的方法,以便这些方法移动您的cameraHolder 而不是您的相机。然后将你的Camera的位置设置为cameraHolder的位置。

      再次提醒,如果您遇到无法正常移动的问题,可以查看my question 并等待答复。您还可以找到更好的方法。

      如果您对答案有任何问题或不明白的地方,请在评论中说明。

      【讨论】:

      • 但是如何移动cameraHolder?
      • 我目前正在通过基本上增加和减少它的 XYZ 来移动它。但正如我在回答中所说,这不能正常工作,我有一个悬而未决的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多