Перспективная проекция объекта на плоскость в 3D

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

Я хотел бы нарисовать очертание предмета на плоскости так, как его увидит человек, как если бы он рисовал на окне очертание предмета с другой стороны.

Как преобразовать объект так, чтобы его вершины правильно оказались на плоскости?

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

Я думаю, что смогу понять код, если только кто-нибудь объяснит шаги, которые мне нужно предпринять.


person Thijs Koerselman    schedule 09.07.2011    source источник


Ответы (2)


  1. Создайте трехмерную систему координат с центром в человеческом глазу. Напишите функцию для перевода точек из одной системы в другую. У вас также может быть другая система, привязанная к объекту. Помните, что создание системы — это не что иное, как запись координат начала системы и осей в какой-либо другой системе координат по умолчанию. Например: System_human_eye = {Point3f Origin (10, 0, 3), ось X (1, ​​0, 0), ось Y (0, 1, 0), ось Z (0, 0, 1)}

  2. В системе человеческого глаза найдите координаты вершин объекта и нормали к плоскости. Уравнение плоскости: p.normal=D, где D — расстояние до плоскости, p — точка плоскости, а normal — нормаль плоскости. Луч от глаза человека до вершины равен k*[x, y, z]; при изменении k вы путешествуете по лучу. Все, что вам нужно сделать сейчас, это пройти по лучу, пока он не пересечет плоскость, т.е.

    к*[х, у, г]. нормальный = Д; найдите k, восстановите точку p=k*[x, y, z] и это даст вам пересечение луча с плоскостью;

  3. Преобразуйте все пересечения из системы человеческого глаза в систему камеры;

  4. Спроецируйте эти координаты на экран с помощью openGL или трассировки лучей. Поскольку прямые линии остаются прямыми после проецирования перспективы, вы можете просто использовать их, если ваш объект состоит из линий. Так что все, что вам нужно, это спроецировать конечные точки линий и снова соединить их как линии на экране.
person Vlad    schedule 22.02.2014
comment
Прошло некоторое время, и я не знал, что этот вопрос все еще открыт. То, что вы описываете, по сути, то, как я понял это в то время. Спасибо за подробный ответ. - person Thijs Koerselman; 23.02.2014

В общем, вы хотите сделать перспективную проекцию.

Тем не менее, это включает в себя кусок теории и математики, с которыми вам нужно разобраться. Если вы хотите сделать что-то более простое, для каждой вершины вашего объекта просто вычислите линию, которая соединяет глаз с вершиной, а затем пересечь ее с плоскостью.

person brainjam    schedule 09.07.2011