Arcball Camera: как попасть вправо, в направлении и вверх

Я пытаюсь реализовать камеру, которая следует за движущимся объектом. Я реализовал эти функции:

void Camera::espheric_yaw(float degrees, glm::vec3 center_point)
{

    float lim_yaw = glm::radians(89.0f);
    float radians = glm::radians(degrees);
    absoluteYaw += radians;

    ... clamp absoluteYaw

    float radius = 10.0f;
    float camX = cos(absoluteYaw) * cos(absoluteRoll) * radius;
    float camY = sin(absoluteRoll)* radius;
    float camZ = sin(absoluteYaw) * cos(absoluteRoll) * radius;
    eyes.x = camX;
    eyes.y = camY;
    eyes.z = camZ;
    lookAt = center_point;
    view = glm::normalize(lookAt - eyes);
    up = glm::vec3(0, 1, 0);
    right = glm::normalize(glm::cross(view, up));

}

Я хочу использовать эту функцию (и версию с шагом) для камеры, которая следует за движущейся 3D-моделью. Прямо сейчас это работает, когда center_point является (0,1,0). Я думаю, что у меня позиция правильная, но вектор вверх явно не всегда (0,1,0).

Как я могу получить вверх, обзор и правильный вектор для камеры? А затем, если я обновлю положение глаз камеры таким образом, как моя камера будет двигаться, когда другой объект (с центром в параметре center_position) перемещается?

Идея состоит в том, чтобы обновлять это каждый раз, когда я ввожу мышь с centered_value = center движущегося объекта. Затем используйте gluLookAt со значениями view, eyes и up моей камеры (и lookAt, которые будут глазами + view).


person ero.rom    schedule 15.05.2019    source источник


Ответы (1)


Следование за движущимся объектом - это вопрос наведения камеры на этот объект. Это то, что делает типичная функция lookAt. См. Математические вычисления здесь, а затем используйте glm::lookAt() .

Техника «Аркбола» предназначена для вращения с помощью мыши. См. Некоторые математические данные здесь.

Идея состоит в том, чтобы получить два вектора (первый, второй) с позиций на экране. Для каждого вектора берется X,Y в зависимости от пикселей, "пройденных" мышью, и размера окна. Z рассчитывается по математике "трекбола". С этими двумя векторами (после их нормализации) его перекрестное произведение дает ось вращения в координатах камеры, а его скалярное произведение дает угол. Теперь вы можете повернуть камеру на glm::rotate()

Если вы идете другим маршрутом (например, самостоятельно рассчитываете матрицу камеры), то направление камеры «вверх» необходимо обновлять самостоятельно. Помните, что это перпендикулярно двум другим осям камеры.

person Ripi2    schedule 15.05.2019