forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Математика (http://forum.boolean.name/forumdisplay.php?f=85)
-   -   Перспективная (центральная) проекция (http://forum.boolean.name/showthread.php?t=16649)

unself 14.04.2012 22:17

Перспективная (центральная) проекция
 
С математикой у меня туго, но я прикладываю максимум усилий, чтобы ее понять :)

Возник вопрос по формуле перспективной проекции, а именно:

Цитата:

scrX = (objXCoord * focalLength) / objZCoord
scrY = (objYCoord * focalLength) / objZCoord
Ссылаясь на свойство подобия треугольников, авторы чудесным образом опускают все объяснения. Тогда я решил, что все тайное становится явным и начал изучать подобие треугольников из школьного курса. С доказательством признаков подобия треугольников вопросов не возникло.

Но в школьном курсе говорится о коэффициенте подобия (обозначается через K), тогда следует, что форма записи должна выглядеть следующим образом (что на мой взгляд логичнее):
Цитата:

// находим коэффициент подобия
k = focalLength / objZCoord

// умножаем каждую координату объекта на коэффициент подобия
scrX = objXCoord * k
scrY = objYCoord * k
Некоторые источники вовсе предлагают делить все на координату Z:
Цитата:

scrY / focalLength = objYCoord / objZCoord
Что в тригонометрических терминах обозначается как тангенс угла (отношение катетов). Вот именно это меня совсем запутало. Я решил, что не постесняюсь спросить, как же все-таки авторы получили ее в таком виде?

Igor 15.04.2012 00:29

Ответ: Перспективная (центральная) проекция
 
у тебя два треугольника подобны. (большой и маленький) Отношение двух сторон маленького - scrY / focalLength равно отношению соответственных сходственных двух сторон большого objYCoord / objZCoord
UPD:
scrY = y_screen
focalLength = dist
objYCoord = y_world
objZCoord = z_world

unself 15.04.2012 11:45

Ответ: Перспективная (центральная) проекция
 
Когда мы говорим о подобие треугольников, мы имеем ввиду отношение сходственных сторон, то есть:
Цитата:

scrY / objYCoord = focalLength / objZCoord
а эта запись
Цитата:

scrY / focalLength = objYCoord / objZCoord
говорит лишь о том, что тангенсы углов равны. Я понимаю, что зная тангенс (котангенс) угла можно легко вычислить длину катета, но тогда с самого начала следовало говорить об этом:)

Нашел интересную статью по этому поводу.

Igor 15.04.2012 12:16

Ответ: Перспективная (центральная) проекция
 
А тебе не кажется что прямоугольные треугольники, у которых тангенсы углов равны, подобны?
Теорема с подобием треугольников более общая, поэтому я доказал через неё.

unself 15.04.2012 12:30

Ответ: Перспективная (центральная) проекция
 
Теперь мне понятно. Это лишь два разных подхода к решению данной задачи (один через коэффициент подобия, другой через тангенс угла подобных треугольников).

Gector 18.04.2012 14:52

Ответ: Перспективная (центральная) проекция
 
Райкастинг делаешь?
Если да, то у меня есть один исходник. Правда на блице.

unself 18.04.2012 21:37

Ответ: Перспективная (центральная) проекция
 
Цитата:

Сообщение от Gector (Сообщение 225802)
Райкастинг делаешь?

В точку:) Пишу на С++ в связке с OpenGL. Остановился на отрисовке пола и потолка, никак алгоритм не придумаю. Подумал, что Mode7 мне поможет, но пока все с трудом дается. Выкладывай, будет очень кстати ;)

Igor 19.04.2012 22:46

Ответ: Перспективная (центральная) проекция
 
почитай про Wolfenstein

unself 19.04.2012 23:48

Ответ: Перспективная (центральная) проекция
 
Почитал и уже очень давно. Кстати, пол и потолок в этой игре не рендерился.

Igor 20.04.2012 01:14

Ответ: Перспективная (центральная) проекция
 
да) Я делал на мидлет паскале, можешь код посмотреть

unself 12.05.2012 22:30

Ответ: Перспективная (центральная) проекция
 
Наткнулся на очередной способ построения проекции. На этот раз формула выводится согласно теоремы Фалеса:
Цитата:

вписанный угол, опирающийся на диаметр окружности, является прямым.
А далее все та же формула:
Цитата:

scale = focalLength / focalLength + objZCoord
Найдутся такие, кто смог разобраться?:)

Igor 17.05.2012 22:40

Ответ: Перспективная (центральная) проекция
 
Это статья по немного другой теме - о том, как по готовому изображению посчитать расстояние от объекта до камеры. Приводится в пример компьютерная игра, потому что в ней параллельные линии действительно параллельны, а в жизни - не очень и камера не идеальная

unself 20.05.2012 11:27

Ответ: Перспективная (центральная) проекция
 
Да, я знаю о чем эта статья, я лишь указал источник =)
Имеенно о теореме Фалеса упоминается в некоторых англоязычных источниках как о способе построении проекции. В википедии сказано, что в зарубежной литературе часто под этой теоремой понимается частный случай вписанных треугольников, когда прямой угол лежит на радиусе окружности. Хотя, более общую теорему о секущих прямых, на мой взгляд, применить в этом случае гораздо проще.

Gector 29.05.2012 19:10

Ответ: Перспективная (центральная) проекция
 
Цитата:

Сообщение от unself (Сообщение 225858)
В точку:) Пишу на С++ в связке с OpenGL. Остановился на отрисовке пола и потолка, никак алгоритм не придумаю. Подумал, что Mode7 мне поможет, но пока все с трудом дается. Выкладывай, будет очень кстати ;)

im so slowww только сейчас заглянул.

Вот тема:
http://forum.boolean.name/showthread.php?t=16685


Часовой пояс GMT +4, время: 22:21.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot