Вам просто нужно обновить направление, в котором смотрит ваша камера. Вам не нужно менять мировую матрицу, метод openGL «gluLookAt()» сделает это за вас автоматически за кулисами.
Если у вас есть настройка класса камеры, просто создайте функцию для установки вектора направления камеры вверх, который вам нужно будет вычислить на основе значения float/double (я полагаю) из компаса 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 содержит биты кода, которые вам понадобятся для чтения значений из компаса, если вы еще не закодировали эту часть.
Удачи.
person
Brock Woolf
schedule
13.07.2009