您只需更新相机的观察方向即可。您不必更改世界矩阵,openGL "gluLookAt()" 方法会在幕后自动为您完成。
如果您有相机类设置,只需创建一个函数来设置相机的向上方向矢量,您需要根据 iPhone 指南针的浮点/双精度值(我假设)获得计算。当您的相机更新时,它是 lookAt() 位置,它应该更改相机以查看正确的位置。
这与在基于 FPS 的游戏中旋转相机时所做的没有太大区别。不同之处在于您希望沿 X 轴 而不是沿 Y 轴旋转相机。
查看相机类如何执行旋转以使用键盘向左或向右移动相机,然后修改它以使用您的指南针方向值工作。
这是我编写的一些 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)。这是向上方向矢量。
我的游戏是静态的,因为相机从不需要向下看。
您只需要通过在指南针方向上创建一个新的向上矢量来更改此矢量。
下面的方法只是我们有时需要通过传递一个特殊向量来更新相机的一种替代方法。您可以忽略它,我只是将其包含在内,以便您从中学习。
/* 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 框架包含您需要从指南针读取值的代码位,以防您尚未对该部分进行编码。
祝你好运。