私は数日前に同じ質問をしていました。私の解決策は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 を使用して、画面上で「投げている」または運んでいる可能性のある他のオブジェクトのベクトルを返します。私はあなたの質問に答えて、あまり重要でない情報を投げ込まなかったことを願っています.私はこの考えを与えた情報源を見つけようとします. 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 座標を取得してから変換を適用することだけです。
ここから、カメラを動かすには、剛体の線速度を設定してカメラを動かすか、力を加えることができます。