Переход от интерфейса хрустального шара к камере в стиле FPS?

В настоящее время у меня есть настройка камеры с интерфейсом хрустального шара, где камера всегда смотрит на начало координат и, нажимая влево, вправо, вверх, вниз, просто перемещается вокруг объекта.

Я хочу изменить это, чтобы камера могла свободно перемещаться по 3D-окружению.

В настоящее время у меня есть две функции, ВЛЕВО и ВВЕРХ, которые были реализованы как CB-интерфейс, о котором я упоминал.

Я хочу, чтобы левая и правая клавиши перемещались влево/вправо, а вверх/вниз поднимали и опускали камеру. Как именно мне его изменить?

Кроме того... как правильно двигать камеру вперед и назад? Я подумал, может быть, перетаскивание мыши можно приравнять к движению вперед/назад?

void Transform::left(float degrees, vec3& eye, vec3& up) {
eye = eye*rotate(degrees, up);
}


void Transform::up(float degrees, vec3& eye, vec3& up) {
vec3 ortho_axis = glm::cross(eye, up);
ortho_axis = glm::normalize(ortho_axis);

eye = eye*rotate(degrees, ortho_axis);
up = up*rotate(degrees, ortho_axis);
}

person Community    schedule 16.10.2012    source источник


Ответы (2)


По сути, выбросьте весь код и начните сначала. Камера в вашей сцене ведет себя как любой другой объект и, таким образом, имеет положение и ориентацию. (Или одну матрицу преобразования.) Все, что вам нужно сделать, это применить противоположное преобразование камеры.

glTransformf(-camera.x, -camera.y, -camera.z);
glRotatef(-camera.angle, camera.axis.x, camera.axis.y, camera.axis.z);

Вы поняли идею.

Что я делаю в своем коде, так это то, что, поскольку у меня есть кватернионы для вращения, а преобразование их в матрицу или ось и угол обходится дорого, я вычисляю векторы вперед и вверх для камеры и передаю их в gluLookAt.

Vector3f f = transform(camera.orientation, Vector3f(1, 0, 0));
Vector3f u = transform(camera.orientation, Vector3f(0, 0, 1));
Vector3f p = camera.position;
Vector3f c = p + f;
gluLookAt(p.x, p.y, p.z, c.x, c.y, c.z, u.x, u.y. u.z);
person rioki    schedule 17.10.2012
comment
Итак, в коде, который вы разместили здесь, камера, на которую вы ссылаетесь, сама по себе является объектом? - person ; 18.10.2012
comment
Да, общий случай для камеры — это камера, которая может свободно перемещаться в пространстве, как и любой другой объект. Я бы даже зашел так далеко, что это часть вашей структуры управления сценой (например, граф сцены). Чтобы сделать это FPS, вам просто нужно прикрепить его к своему аватару игрока. Настройка рендеринга одинакова для любого поведения камеры, будь то летающая камера, шаровая камера или что-то еще; все, что вы делаете, это перемещаете камеру по-разному в пространстве. Я никогда не понимаю, почему в большинстве руководств показаны специальные настройки случая... - person rioki; 18.10.2012

Обычная настройка для элементов управления FPS заключается в том, чтобы движение было привязано к клавишам (стрейф влево/вправо, движение вперед/назад), а просмотр вокруг был привязан к мыши (ось x: поворот влево/вправо, ось y: шаг вверх/вниз). .

ХТН

person luser droog    schedule 17.10.2012