3D-панорама панорамирования в перспективной проекции (OpenGL)
Я разработал класс С++, который абстрагирует пользователя от поворота, масштабирования и панорамирования трекбола. У меня есть поворот (с использованием трекбола) и масштабирование, как и ожидалось. Однако панорамирование не ведет себя так, как ожидалось. Когда я выбираю точку и перетаскиваю, я ожидаю, что при завершении перетаскивания выбранная точка остается под мышкой. Мое понимание панорамирования в перспективной проекции выглядит следующим образом. Цель и положение камеры, на которые будет влиять операция панорамирования. Целевая точка камеры и положение камеры (глаза) должны быть переведены пропорционально сопротивлению. Соразмерность (может быть не постоянна) должна основываться на глубине z.
Панорамирование прямо в орфографической проекции, но представляет собой проблему в перспективе. Это будет полезно, если можно объяснить математику и деталь реализации OpenGL.
Ответы
Ответ 1
Я не знаю о специфике OpenGL, но если я правильно понимаю ваш вопрос, я могу помочь в математике:
Я предполагаю, что вы уже выбрали объект, нажав на объект и, таким образом, "посылая" луч через сцену, который поражает ваш объект в anchorpoint р.
Чтобы понять следующее:
![Panning with perspective projection]()
Теперь вы перетаскиваете мышь вдоль вектора t. Используя теорему перехвата, вы можете легко вычислить вектор s, по которому p нужно перевести, чтобы "держать его под курсором":
| р |/| q | = | s |/| t |
| s | = (| p |/| q |) * | t |
s параллельна t, поэтому t нормирована умноженной на | s |:
s = t/| t | * | s |
s = t/| t | * (| p |/| q |) * | t |
s = t * (| p |/| q |)
Если вы выполняете панорамирование, вы делаете то же самое, просто вы не перекладываете p на s, но вам нужно перевести всю сцену на -s.
Ответ 2
Невозможно иметь конечную точку под мышью. Панорамирование в перспективном режиме может осуществляться двумя способами. Один - переводчик, а другой - вращающаяся камера. Перевод камеры приведет к вращению объекта для просмотра пользователем. Камера поворота для панорамирования имеет два ограничения. один не должен менять положение камеры, а другой - останавливать вращение относительно направления камеры. то есть ось вращения должна быть параллельна плоскости, образованной правым и верхним векторами камеры.