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

Невозможно иметь конечную точку под мышью. Панорамирование в перспективном режиме может осуществляться двумя способами. Один - переводчик, а другой - вращающаяся камера. Перевод камеры приведет к вращению объекта для просмотра пользователем. Камера поворота для панорамирования имеет два ограничения. один не должен менять положение камеры, а другой - останавливать вращение относительно направления камеры. то есть ось вращения должна быть параллельна плоскости, образованной правым и верхним векторами камеры.