6

私は自分の世界のモデルの周りを球形の動きでカメラを動かそうとしています。球面座標(rho、theta、phi)をデカルト座標(x、y、z)に変換するのを見てきましたが、これを設定する方法がわかりません。これが私がこれまでに試みたことですが、それはモデルを継続的に周回していません。ある時点に到達すると、回転が逆転しているように見えます。

初期化thetaしてphi

private float theta = 0.0f;
private float phi = 0.0f;

更新thetaphi各フレーム:

// This should move the camera toward the upper-right continuously, correct?
theta = (theta+1.0f)%360;
phi = (phi+1.0f)%360;

カメラのデカルト座標に変換thetaします。phi

camera.position.x = CAMERA_DISTANCE * (float)Math.sin(theta*MathHelper.PIOVER180) * (float)Math.cos(phi*MathHelper.PIOVER180);
camera.position.y = CAMERA_DISTANCE * (float)Math.sin(theta*MathHelper.PIOVER180) * (float)Math.sin(phi*MathHelper.PIOVER180);
camera.position.z = CAMERA_DISTANCE * (float)Math.cos(theta*MathHelper.PIOVER180);

次に、カメラのポイントとビューのマトリックスを更新します。

camera.lookAt(0, 0, 0);
camera.update();

注: AndroidでlibGDXフレームワークを使用してJavaを使用しており、2D画面上の仮想ジョイスティックを使用して回転を制御しようとしていますが、ジョイスティックをthetaとにマップする方法を見つける必要がありphiます。

どんな助けでも大歓迎です!

4

1 に答える 1

5

私は最近このようなことをしました。このウェブサイトは、私が何をする必要があるかを視覚化するのに大いに役立ちました。

あなたがする必要があるのは、あなたのローカルジョイスティック座標(それの中心に対して)をピッチとヨーの値に変換することです:

public float getPitch()
{
    return (position.X - center.X) * MathHelper.PIOVER180;
}

public float getYaw()
{
    return (position.Y - center.Y) * MathHelper.PIOVER180;
}

次に、クォータニオンを使用してその回転を表すことができます。

public void rotate(float pitch, float yaw, float roll)
{
    newQuat.setEulerAngles(-pitch, -yaw, roll);
    rotationQuat.mulLeft(newQuat);
}

rotate(quaternion)次に、libGDXの組み込みメソッドを使用して、クォータニオンをカメラのビューマトリックスに適用できます。

camera.view.rotate(rotationQuat);

// Remember to set the camera to "look at" your model
camera.lookAt(0, 0, 0);
于 2012-12-26T04:30:17.090 に答える