簡體   English   中英

使用jBullet的LWJGL第一人稱攝影機

[英]LWJGL first person camera using jBullet

我已經設置了一個攝像頭,並且可以使用WASD移動並使用鼠標旋轉視圖。 但是現在出現了問題:我想向攝像機/播放器添加物理效果,以使其與其他jBullet對象“交互”。 我怎么做? 我考慮過為相機創建一個RigidBody並將其位置存儲在其中,以便jBullet可以將其物理原理應用於相機。 然后,當我需要更改某些東西(位置)時,只需在RigidBody中進行更改即可。 但是我沒有找到任何編輯位置的方法。

您可以按正確的方向推動我,還是可以舉一個示例源代碼?

在您閱讀此答案之前,我想提及一下我在答案中指出的解決方案有問題。 您可以關注關於該問題的問題,以便在使用此答案時也能找到解決方案。

所以。 首先,您需要創建一個新的BoxShape:

CollisionShape cameraHolder = new BoxShape(SIZE OF CAMERAHOLDER);

並將其添加到您的世界,以便它與所有其他對象進行交互。 現在,您需要更改所有有關攝像機移動 (而不是旋轉)的方法,以便這些方法移動您的cameraHolder而不是您的攝像機。 然后將Camera的位置設置為cameraHolder的位置。

同樣,如果遇到無法正常移動的問題,則可以檢查我的問題並等待答案。 您也可以找到一種更好的方法。

如果您有問題或對答案不了解,請在評論中注明。

幾天前我在問同樣的問題。 我的解決方案正如Sierox所說。 創建BoxShape的RigidBody並將其添加到DynaicsWorld。 要移動攝像機框架,請對其剛體施加力。 在沒有施加力的情況下(即播放器停止按下按鈕),我將線性阻尼設置為.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返回其他對象的矢量,這些對象可能是我“扔”在屏幕上或隨身攜帶的。 希望我回答了您的問題,不要遺漏太多不必要的信息。我會盡力找到使我產生這種想法的來源。 我相信這是在子彈論壇上。

-------編輯------

很抱歉遺漏了那部分

一旦剛體正常工作,您只需要獲取它的坐標並將其應用於您的相機即可,例如:

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坐標,然后應用該變換即可。

從這里開始,移動攝像機,您可以設置剛體的線速度來移動攝像機或施加力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM