1

カメラをセットアップしました。WASD で移動し、マウスでビューを回転できます。しかし、ここで問題が発生します。カメラ/プレーヤーに物理を追加して、他の jBullet オブジェクトと「相互作用」させたいのです。それ、どうやったら出来るの?カメラの RigidBody を作成し、そこに位置を保存して、jBullet がその物理をカメラに適用できるようにすることを考えました。次に、何か (位置) を変更する必要がある場合は、RigidBody で簡単に変更できます。しかし、位置を編集する方法が見つかりませんでした。

正しい方向に私をプッシュしてもらえますか、それともソースコードの例を教えてもらえますか?

4

2 に答える 2

1

私は数日前に同じ質問をしていました。私の解決策は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 座標を取得してから変換を適用することだけです。

ここから、カメラを動かすには、剛体の線速度を設定してカメラを動かすか、力を加えることができます。

于 2014-01-08T01:20:18.193 に答える