Камера Arcball: как получить право, направление и вверх - PullRequest
0 голосов
/ 16 мая 2019

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

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 = центр движущегося объекта. Затем используйте gluLookAt со значениями view, eyes и up моей камеры (и lookAt, который будет eyes + view).

1 Ответ

0 голосов
/ 16 мая 2019

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

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

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

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

...