[英]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.