Ty by prostě muset aktualizovat směr, ve kterém je kamera dívá. Nemusíte měnit svět matice, OpenGL „gluLookAt ()“ metoda udělá za vás automaticky zákulisí.
Pokud máte nastavení třídu fotoaparát, jednoduše vytvořit funkci nastavit směr vektoru kamery, které budete potřebovat získat vypočítat na základě float / dvojnásobku (předpokládám) z iPhone kompas. Když vaše aktualizace fotoaparát je to lookAt pozice (), že by se měl změnit na kameru podívat na správném místě.
To není tak příliš neliší od toho, co děláte, když otočíte fotoaparát do FPS založená hra s. Rozdíl je v tom, že chcete otočit kameru po ose X namísto podél osy y.
Podívejte se, jak třída fotoaparát schopen rotace pro pohyb kamery doleva nebo doprava pomocí klávesnice a potom jej upravit pro práci s své hodnoty kompasu.
Zde jsou některé C ++ kód, který jsem napsal, která vám může poskytnout náhled na to, jak vaše třída fotoaparát by měl být práci:
/* 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 );
}
Vezměte na vědomí, na řádek výše (0.0f, 1.0f, 0.0f). To je směr nahoru vektor. Bylo to statické pro mou hru, protože fotoaparát nikdy nepotřeboval dívat dolů. Ty by prostě muset změnit tento vektor by vytvořil nový up vektoru na orientaci kompasu.
Níže uvedená metoda byla prostě alternativní metodou jsme potřebovali občas aktualizovat kameru průchodem speciální vektor. Můžete pravděpodobně ignorovat, prostě jsem to zahrnuty, takže si mohl se z ní poučit.
/* 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 );
}
Zde je moje metoda pro otáčení fotoaparátu podél osy Y (Nezapomeňte, že chcete otočit kolem osy X ) --I by přepsat tuto metodu nyní, protože je to docela dodgey (napsal jsem to před lety), ale je to dost, aby vám ukázat, jak se to dá udělat.
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 );
}
}
Je to trochu obtížné, aby vám s určitou část kódu dělat, co chcete dělat, protože vaše třída fotoaparát je pravděpodobně odlišná od dolu, i když to by měl dostat, abyste pochopili, co je třeba udělat.
Rámec CoreLocation obsahuje kousky kódu, budete muset číst hodnoty z kompasu zapouzdřit jste kódované že část dosud.
Hodně štěstí.