首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jBullet的LWJGL第一人称相机

使用jBullet的LWJGL第一人称相机
EN

Stack Overflow用户
提问于 2013-07-30 12:31:52
回答 2查看 630关注 0票数 1

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-08 01:20:18

几天前我也问过同样的问题。我的解决办法就像Sierox说的那样。创建RigidBody of BoxShape并将其添加到DynaicsWorld中。要移动摄像机,向它的刚体施加力。我有阻尼设置为.999线性和角停止相机时,没有力,即玩家停止按下按钮。

我还使用了body.setAngularFactor(0),这样盒子就不会乱七八糟了。也把质量设定得很低,以免对其他物体产生太大的干扰,但仍然可以跳上去撞到它们,否则就会受到它们的影响。

记住把x,y,z坐标转换成笛卡儿平面,这样你就可以朝摄像机的方向移动。即

代码语言:javascript
复制
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(新的Vector3f(0,jumpHt,0)),并将jumpHt设置为任意速度。

我使用getThrow为可能在屏幕上“抛出”或携带的其他对象返回向量。我希望我回答了你的问题,没有提供太多不必要的信息,我会尽力找出给我这个想法的来源。我相信是在子弹论坛上。

-编辑-编辑

很抱歉把那部分忘了

一旦你的刚体正常工作,你只需要得到它的坐标,并把它应用到你的相机,例如:

代码语言:javascript
复制
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坐标,然后应用变换。

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

票数 1
EN

Stack Overflow用户

发布于 2013-08-12 16:39:53

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

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

代码语言:javascript
复制
CollisionShape cameraHolder = new BoxShape(SIZE OF CAMERAHOLDER);

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

同样,如果您遇到无法正确移动的问题,可以检查my question并等待答案。你也可以找到一个更好的方法来做这件事。

如果您有问题或不理解的答案,请说明它作为一个评论。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17947123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档