3

私はlibgdxを使用してAndroid用の基本的な3Dゲームを開発していますが、コンパスから提供される3つの回転角度(方位角-Zを中心とした回転、ロール-Yを中心とした回転、ピッチ-Xを中心とした回転)を指定すると、カメラの向きを正しく設定できません。 。次のコードで、仮想カメラを期待どおりにZ軸とX軸に適切に向けることができるという点で、わずかな成功を収めました。(角度は度[-180,180])

camera.direction.x = 0;
camera.direction.y = 0;
camera.direction.z = 1;
camera.up.x = -1;
camera.up.y = 0;
camera.up.z = 0;

camera.rotate(azimuth,0,0,1);
camera.rotate(roll,0,1,0);
camera.rotate(pitch,1,0,0);

私もこれである程度の成功を収めましたが、カメラのアップベクトルを方向付けません。(このバージョンでは、角度はラジアンに変換されています)

float x,y,z;
roll = (float) (roll + Math.PI/2.0);
x = (float) (Math.cos(azimuth) * Math.cos(roll));
y = (float) (Math.sin(azimuth) * Math.cos(roll));
z = (float) (Math.sin(roll));
Vector3 lookat = new Vector3(x,y,z);
camera.lookAt(lookat.x, lookat.y, lookat.z);

誰かがこれらの3つの角度から仮想カメラを適切に向ける方法に光を当てることができますか?

また、電話の上部が左側に、下部が右側になるように、電話を横向きモードにしようとしています。したがって、カメラのデフォルトの方向(すべての回転は0で、電話の上部は北を向いています)は、カメラが地面を向いており(正のZ)、上を東に向けています(負のX)。

4

1 に答える 1

4

しばらくの間他のものをコーディングすることによって、私は最終的に、レンダリング、シミュレーション、および入力を分離しようとしているところに到達しました。そのため、私は私のために働く次の解決策を思いついた。私はそれを厳密にテストしていませんが、それは私が望むことをしているようです(カメラロールを無視)

プログラムのAndroid部分では、向きを横向きに設定する必要がありました。

<activity android:name=".MySuperAwesomeApplication"
              android:label="@string/app_name"
              android:screenOrientation="landscape">
              >

ヨー、ピッチ、ロール、ポジションを保存するプレーヤークラスを作成しました

public class Player {
    public final Vector3 position = new Vector3(0,1.5f,0);    
    /** Angle left or right of the vertical */
    public float yaw = 0.0f;
    /** Angle above or below the horizon */
    public float pitch = 0.0f;
    /** Angle about the direction as defined by yaw and pitch */
    public float roll = 0.0f;
}

そして、入力に基づいてプレーヤーを更新するときは、次のようにします。

player.yaw = -Gdx.input.getAzimuth();
player.pitch = -Gdx.input.getRoll()-90;
player.roll = -Gdx.input.getPitch();

ピッチはinput.rollにマップされ、ロールはinput.pitchにマップされることに注意してください。理由はわかりませんが、私にとってはうまくいきます。最後にカメラを更新します。

camera.direction.x = 0;
camera.direction.y = 0;
camera.direction.z = 1;
camera.up.x = 0;
camera.up.y = 1;
camera.up.z = 0;
camera.position.x = 0;
camera.position.y = 0;
camera.position.z = 0;
camera.update();

// The world up vector is <0,1,0>
camera.rotate(player.yaw,0,1,0);
Vector3 pivot = camera.direction.cpy().crs(camera.up);
camera.rotate(player.pitch, pivot.x,pivot.y,pivot.z);
camera.rotate(player.roll, camera.direction.x, camera.direction.y, camera.direction.z);
camera.translate(player.position.x, player.position.y, player.position.z);
camera.update();

編集:コードにカメラロールを追加しました。私と私のDroid2の場合、ロールには[-90,90]の値しかないように見えます。そのため、-90または90を超えて回転すると、値は0に向かって戻り始めます。

于 2011-03-24T20:35:12.573 に答える