Войти
ПрограммированиеФорумГрафика

Орбитальная камера на основе кватернионов

Страницы: 1 2 Следующая »
#0
14:46, 3 авг. 2016

Что можете подсказать на данную тему? Использую библиотеку GLM.
Задумка: по положению стика джойстика крутить камеру вокруг определённого объекта.
Получить состояние стика я могу: два числа в диапазоне от -1.0 до 1.0 для осей Ox и Oy.

Камера, по идее, постоянно хранит своё состояние в:
1)glm::vec3 position
2)glm::quat orientation;

Причём при передаче в шейдер кватернион конвертируется в mat4.

Так как реализовать вращение вокруг объекта?
По идее, позиция камеры всегда будет где-то на сфере, описывающей объект.
Ну а направление взгляда всегда будет идти от позиции камеры к позиции объекта...


#1
14:57, 3 авг. 2016

Ну так при виде с глаз сначала смещаешь на position потом вращаешь, а тут надо сначала повернуть, потом сместить. Кватернион просто преобразуется в матрицу вращения.

#2
15:18, 3 авг. 2016

Задача описывается двумя векторами: вектор позиции цели v1, нормализованный вектор направления на наблюдателя v2, и одной скалярной величиной s1 - расстояние между целью и наблюдателем.

Позиция наблюдателя (камеры) рассчитывается как v1 + v2 * s1, направление на цель как -v2. Ориентацию камеры считай как удобно. В простейшем случае направление "условно вправо" считаем как cross(-v2, up), направление "условно вверх": cross(-v2, cross(-v2, up)).

А там хоть в кватернион,хоть в матрицу, хоть в эйлер. Как больше нравится.

За приближение/удаление отвечает s1, за ориентацию v2. v1 - константа.

#3
15:37, 3 авг. 2016

AmaBob
> v1 + v2 * s1, направление на цель как -v2
Тобишь v1 - v2 * s1?

AmaBob
> Ориентацию камеры считай как удобно. В простейшем случае направление "условно
> вправо" считаем как cross(-v2, up), направление "условно вверх": cross(-v2,
> cross(-v2, up)).
А что значит "условно"?
И как выдрать эти направления из кватерниона? Разве нельзя как-то модифицировать текущий кватернион некоторым временным, тем самым вращая камеру по сфере?
Типа так:
camera_quat = glm::quat(glm::vec3(tmp_pitch, tmp_yaw, tmp_roll)) * camera_quat;

glm::mat4 rotate = glm::mat4_cast(camera_quat);

eye_vector = ?;
camera_pos = ?;

#4
16:14, 3 авг. 2016

Laynos
> Тобишь v1 - v2 * s1?
Нет. Так будет в случае, если v2 - направление на цель.

> А что значит "условно"?
Вправо и влево - направления относительные. В данном случае право относительно наблюдателя (камеры) в правосторонней (right handed) системе координат.

> И как выдрать эти направления из кватерниона?
Зачем выдирать? Про выдирать речи не было. Я показал пример расчета ориентации камеры, которую можно выразить в том числе как кватернион, если понадобится.

> camera_quat = glm::quat(glm::vec3(pitch, yaw, roll)) * camera_quat;
Это будет поворот камеры относительно ее центра, для орбитальной камеры неприменимо. В твоем случае сначала пересчитывается позиция камеры, а после на базе направления на цель ее ориентация.

> Причём при передаче в шейдер кватернион конвертируется в mat4.
Нафига тогда кватернион?

И вообще насколько я вижу, у тебя glm под рукой. Зачем что-то изобретать?

glm::mat4 view = glm::lookAt(-v2, v1 + v2 * s1, up);
Готовая для передачи в шейдер матрица.

#5
16:26, 3 авг. 2016

AmaBob
> Это будет поворот камеры относительно ее центра, для орбитальной камеры
> неприменимо. В твоем случае сначала пересчитывается позиция камеры, а после на
> базе направления на цель ее ориентация.
А из этого кватерниона (или матрицы поворота) нельзя выразить eye_direction, а через eye_direction - позицию камеры?
AmaBob
> Зачем что-то изобретать?
Я хочу решить задачку кватернионами =)

#6
16:32, 3 авг. 2016

Сохрани в FBX формате или в Collada:)

PS: Это панацея геймдева в 80% .

#7
16:40, 3 авг. 2016

Laynos
> А из этого кватерниона (или матрицы поворота) нельзя выразить eye_direction
Их в твоей задаче получается две штуки. Кватерниона ориентации камеры или кватерниона орбитальной ориентации? Из первого можно, решение легко гуглится. Из второго очевидно нет.

Но зачем? Если оно считается как:

eye_direction = normalize(target_position - eye_position);
Из условия задачи величины должны быть известны.

> Я хочу решить задачку кватернионами =)
Двигатель от волги на жигуль поставить? Ну удачи :)

#8
16:42, 3 авг. 2016

AmaBob
> Двигатель от волги на жигуль поставить? Ну удачи :)
Просто развиваюсь, академический интерес. Не думаю, что это что-то плохое... :)

AmaBob
> Если оно считается как:
>
> eye_direction = normalize(target_position - eye_position);
Потому что тогда я смогу получить eye_position, которого у меня нет. Просто так.

#9
18:16, 3 авг. 2016

Если отказаться от roll, то выходит так:

camera_quat = glm::quat(glm::vec3(tmp_pitch, tmp_yaw, 0)) * camera_quat;

float pitch = camera_quat.pitch();
float yaw = camera_quat.yaw();

glm::mat4 rotate = glm::mat4_cast(camera_quat);

glm::vec3 view_direction(cos(yaw) * cos(pitch), sin(pitch), -sin(yaw) * cos(pitch));
camera_position = target - view_direction * radius;

glm::mat4 translate = glm::translate(camera_position);

glm::mat4 view_matrix = rotate*translate; //это верно?

#10
14:42, 4 авг. 2016

Laynos
> glm::mat4 view_matrix = rotate*translate; //это верно?
А так?:
glm::inverse(glm::translate(0, 0, radius) * rotate * glm::translate(target));

1)Переместиться на позицию цели
2)Сделать разворот
3)Отъехать "назад"

Или надо поменять порядок умножения?
P.S. Вычитал, что если инвертировать матрицу трансформации камеры, то можно получить её видовую матрицу

#11
14:44, 4 авг. 2016
Отъехать "назад"

Мощное решение :)

PS: Лучше укради орбитальную камеру у какой нибуть игры :)

#12
15:33, 4 авг. 2016

ronniko
> Мощное решение :)
> PS: Лучше укради орбитальную камеру у какой нибуть игры :)
А что не так? Вроде вполне нормальное, без костылей.
Да и зачем воровать, если цель - опыт?

#13
6:23, 5 авг. 2016

Правильное решение - иметь радиус и два угла pitch, yaw и оперировать ими в твоей вращалке (сферические координаты), а в камеру тупо сабмитить рассчитанную по ним позицию и кватернион.

#14
11:32, 5 авг. 2016

Wraith
Тобишь glm::mat4 view_matrix = glm::inverse(glm::translate(target) * rotation_matrix * glm::translate(0, 0, radius));?

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.