カメラが向いている方向を更新するだけで済みます。ワールド マトリックスを変更する必要はありません。openGL の "gluLookAt()" メソッドが自動的にバックグラウンドで変更を行います。
カメラクラスを設定している場合は、カメラの上方向ベクトルを設定する関数を作成するだけで、iPhone のコンパスから float/double 値 (私が想定) に基づいて計算を取得する必要があります。カメラの更新が lookAt() の位置になると、カメラが正しい位置を向くように変更されます。
これは、FPS ベースのゲームでカメラを回転させた場合と大差ありません。違いは、Y 軸ではなくX 軸に沿ってカメラを回転させることです。
キーボードを使用してカメラを左右に移動するためにカメラ クラスが回転を実行する方法を確認してから、コンパスの方向値を使用して機能するように変更します。
カメラクラスがどのように機能するかについての洞察を与えるかもしれない、私が書いたいくつかのC++コードを次に示します。
/* This reshapes the camera using the perspective projection */
void Camera::ReshapePerspectiveForPicking( void )
{
glMatrixMode(GL_PROJECTION);
// Sets the clipping volume
gluPerspective( m_FieldOfView, (float)m_width/(float)m_height, m_zNear, m_zFar );
gluLookAt( camPos.x, camPos.y, camPos.z,
camPos.x + camView.x, camPos.y + camView.y, camPos.z + camView.z,
0.0f, 1.0f, 0.0f );
glMatrixMode( GL_MODELVIEW );
}
上の行 (0.0f, 1.0f, 0.0f) に注意してください。これは UP 方向ベクトルです。カメラが下を向く必要がなかったため、私のゲームでは静的でした。コンパスの向きに新しいアップ ベクトルを作成して、このベクトルを変更するだけです。
以下のメソッドは、特別なベクトルを渡してカメラを時々更新するために必要な代替メソッドにすぎません。あなたはおそらくそれを無視することができます.私はあなたがそれから学ぶことができるようにそれを含めました.
/* This updates the camera to look at the changed camera position. This uses a passed in camPosition and camView GameMath::Vector */
void Camera::Update( GameMath::Vector camPos, GameMath::Vector camView )
{
glMatrixMode( GL_PROJECTION );
gluLookAt( camPos.x, camPos.y, camPos.z,
camPos.x + camView.x, camPos.y + camView.y, camPos.z + camView.z,
0.0f, 1.0f,0.0f );
}
Y軸に沿ってカメラを回転させる方法は次のとおりです( X軸に沿って回転させたいことを思い出してください)-この方法はちょっと面倒なので今書き直します(何年も前に書きました)が、お見せするには十分ですどのようにそれを行うことができます。
void Camera::Rotate( void )
{
if ( m_rotateCamera == true )
{
// Keep the radians within 2 pi, roughly
float minimumRadiansRotate = 0.00;
float maximumRadiansRotate = 6.2831853072;
m_YRotateAngle = GameMath::Wrap( m_YRotateAngle, minimumRadiansRotate, maximumRadiansRotate );
m_YRotateAngle += m_rotateSpeed * m_rotateDirection; // Add to the camera's current angle value
camView.x = sin( m_YRotateAngle );
camView.z = -cos( m_YRotateAngle );
}
}
カメラのクラスはおそらく私のものとは異なるため、やりたいことを実行するための特定のコードを提供するのは少し難しいですが、これにより、何を行う必要があるかを理解できるはずです.
CoreLocation フレームワークには、まだその部分をコーディングしていない場合に備えて、コンパスから値を読み取るために必要なコードが含まれています。
幸運を。