Текущее время: Сб 11 янв 2025 3:47

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 567 ]  На страницу Пред.  1 ... 4, 5, 6, 7, 8, 9, 10 ... 19  След.
Автор Сообщение
 Сообщение Вс 12 фев 2012 23:33
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Обана! Я ФПС в TEdit выводил - значит, при переходе в полноэкранку венда всё окно уничтожает со всеми прикрученными к нему подоконниками. Неплохая услуга. :smile:
А на глаз так - тормозило?

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Пн 13 фев 2012 0:11
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Как может тормозить при > 50 к./с?

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Пн 13 фев 2012 1:43
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Я имел в виду в полноэкранном режиме, где, как ты сказал, счётчик не показывался.

Нашёл функцию по инверсироанию флоатовой 4х4 матрицы прямо на сайте самого Интела:
ftp://download.intel.com/design/pentium ... 504301.pdf

Добавлено спустя 2 минуты 32 секунды:

Там прямо код дан - функция Invert2. Жаль, не смог выпостить сюда - форум глючит. Видимо много квадратных скобок не проглатывает.

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Пн 13 фев 2012 9:51
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Кому надо, тот па ссылке перейдёт.

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Пт 17 фев 2012 21:43
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
...На сколько граблей ОпенГЛ я наступил, и в скольких багах драйверов на мутно-документированных местах я завяз, прежде чем увидел ожидаемые тени! Однако получились они ещё хуже, чем я ожидал даже от первого опыта - дрожащие, мерцающие, квадратиковые, пересекающиеся с поверхностями, от которых проецируются и т.п. В общем, не счастлив я оказался совсем - картинка с тенями стала ещё хуже, чем без них. В отчаянии пошёл шарить по инету разбирать чужие наработки. Немного вытянул качество и ускорил процесс, однако так и не остался не то что доволен, а вообще удовлетворён результатом!
Но вот нашёл то, что когда-то считал своим изобретением - называется способ "Trapezoidal Shadow Maps" и вот статья о нём:
http://www.comp.nus.edu.sg/~tants/tsm.html
Многообещающе выглядит и совпадает с моими мечтами, так что попробую разбираццо в способе реализации. :smile:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Пт 17 фев 2012 23:38
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
А я то думаю, куда ты пропал.
з.ы.: у меня тоже потихоньку продвигается...

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Вс 19 фев 2012 1:49
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Шаман писал(а):
Многообещающе выглядит и совпадает с моими мечтам
Есть ещё каскадные тени...

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Вс 19 фев 2012 19:12
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Не, это фуфло - бить сцену на куски с разной детализацией. Куча карт, а толку не намного больше. Ещё один шаг в на тупиковом пути. Трапециидальные - это 100% панацея. Но сложно, блин... :oops:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Вс 19 фев 2012 19:23
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Ты уверен что твой способ не фуфло?!!
У этого способа нет искажкния которое получается при твоём способе.

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Вс 19 фев 2012 23:54
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Блин, это не "мой" способ! Это патентованный в 2004-м метод, причём у него тыщи модификаций и способов исполнения, и есть методы коррекции, один из которых - трансформировать глубину отдельной матрицей, чтоб искажений не было. Ну как-то так, я ещё не разобрался - мозга мало. :teeth:

Кстати, случайно наткнулся на очень полезный трюк при создании карты теней, хочу с тобой поделиться.
Стандартно при создании карты тени, при рендере от светильника, принято юзать glPolygonOffset для впихивания глубины рисуемых треугов поглубже, чтобы при использовании этой карты тень не просачивалась на сам треуг, эту тень отбрасывающий. Ну так вот один гений предложил вместо этого при рендере карты тени рендерить только обратно-повёрнутые треуги, т.е. те, что сзади модели:
glCullFace(GL_FRONT);
Я проверил - очень неплохая идея! Но только если модели "замкнутые" со всех сторон - без дырок, а также нет тонких поверхностей, где задние плоскости и передние почти совпадают (как ладошки у Ястреба). Зато не нужно парится с коэффициентами glPolygonOffset. :smile:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Пн 20 фев 2012 0:44
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Шаман писал(а):
обратно-повёрнутые треуги, т.е. те, что сзади модели:
glCullFace(GL_FRONT);

Может glCullFace(GL_BACK); ?
Но это плохо что не со всеми формами работает.

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Пн 20 фев 2012 6:10
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
smt005 писал(а):
Может glCullFace(GL_BACK); ?
Эта функция выбирает, какие грани отбрасывать (не рисовать): если выберешь GL_BACK, задние грани пойдут под нож - этот режим для обычного рендера, поскольку незачем тратить ресурсы на невидимые грани. Идея в том, что модель, обычно, закрытая и выпуклая, поэтому передние и задние грани не совпадают - между ними есть некий закрытый объём, куда наблюдатель при нормальных условиях не может засунуть камеру. Поэтому чтобы избежать самозатенения, можно переключить режим рисуемых поверхностей во время составления карты теней с передних (обычный режим glCullFace(GL_BACK)) на задние (glCullFace(GL_FRONT)). В результате тень будет начинаться с задней поверхности объекта, а не с передней, поэтому самозатенением старадает лишь задняя поверхность, которая ИТАК тёмная, поэтому артефактов не видно. Теоретически. :roll: Практически же, искушённый зритель может заметить самозатенение на острых кромках модели, где передняя плоскость лезвия обращена к светильнику, а задняя затенена. :tongue:
Так что всё же лучше упихивать тень поглубже оффсетом передних полигонов, хотя для простоты и для начала очень даже сгодится вышеописанный чит. :wink:

Есть большой недостаток у трапецеидальных теней - они лучше всех только тогда, когда угол зрения наблюдателя сильно отличается от направления света, т.е. когда пирамида видимости повёрнута к светильнику боком. В противном случае - никакого выигрыша по сравнению с обычным подходом. :sad:
Обдумывание и обчитывание причины этого явления привело меня к осознанию факта, что панацеи просто не может быть - невозможно добиться того, чтобы при любых взаимоориентациях наблюдателя и светильника на каждый отдельный пиксель картинки приходился свой тексель карты теней, если таковых текстур всего одна. Выходит, каскадные тени не такое уж и фуфло, если идти на несколько текстур теней.

Добавлено спустя 1 час 48 минут 6 секунд:

Есть! Есть-таки панацея - ещё один чувак-гений нашёлся! Всё решается четырьмя картами тени:
http://hungryspoon.com/PX_web/paper/shadow%20mapping
Эх, ну почему всё идеальное настолько сложно?! :oops:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Вт 21 фев 2012 0:08
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Самое сложное в трапециидальных тенях - составить матрицу проекции. В TSM это не привычная усечённая пирамида видимости с прямоугольниками в основаниях, а... :roll: ...в лучшем случае, пирамида с трапециями в основаниях. Ну а в общем случае - это абстрактный восьмигранник, единственная особенность которого - каждая его грань - это четырёхугольник, все вершины которого лежат в одной плоскости.
Так вот, в общем каноническом случае TSM пирамида видимости разбивается на 5 пирамид, для каждой из которых составляется карта тени. Каждая из пирамид имеет основанием одну из граней пирамиды видимости: верхнюю, нижнюю, левую, правую, или переднюю. Если размер каждой карты тени соответствует размеру экрана, то гарантированно получается, что на каждый пиксель картинки приходится как минимум один тексель карты тени (одной из пяти).
Идеальный TSM требует 5 проходов рендера сцены в текстуры (в оптимизированном варианте можно обойтись 4-мя или даже 2-мя пирамидами), а также пиксельного шейдера, ибо для каждого пикселя нужно выбирать соответствующую ему карту тени. Выборка не сложная.

В общем, полдела я сделал - я загорелся идеей и понял принцип реализации. :smile: Но завяз на составлении матрицы трансформации, ибо с матрицами у меня туговато... :sad:
Молюсь Суперу, чтоб кто-то помог. :god:
Задача - найти матрицу трансформации 4х4, с помощью которой можно будет переводить координаты точек, лежащих внутри четырёхугольной пирамиды ABCDEFGH в диапазон [-1...1, -1...1, -1...1, 1].
Т.е. мне известны координаты вершин пирамиды (A,B,C,D,E,F,G,H,), и мне нужна такая матрица m, которая будет осуществлять трансформацию следующего рода:

m*A = {-1, 1, 1, 1};
m*B = { 1, 1, 1, 1};
m*C = { 1,-1, 1, 1};
m*D = {-1,-1, 1, 1};
m*E = {-1, 1,-1, 1};
m*F = { 1, 1,-1, 1};
m*G = { 1,-1,-1, 1};
m*H = {-1,-1,-1, 1};

Если включить моск, то становится ясно, что на 16 неизвестных матрицы m приходится 32 уравнения. Посему я решил использовать первые 4 (трансформации точек ближнего к источнику света основания пирамиды). Как решать системы линейных уравнений - я знаю. Я воспользовался методом обратной матрицы. Вышло, что детерминант равен нулю. Вот я и приехал. :sad:

Если кто врубается в эти матрицы (Razum, Frozen Light, Krogoth... :angel: ), подскажите - отчего решения не выходит? Это из-за того, что все 4 точки (я использовал уравнения для переднего основания пирамиды, т.е. для точек A,B,C,D) лежат в одной плоскости, да?
Мне тут подумалось, что нужно взять три точки от передней плоскости, а четвёртую заменить соответствующей ей задней - прав ли я?.. :shock:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Вт 21 фев 2012 0:26
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Шаман писал(а):
Т.е. мне известны координаты вершин пирамиды (A,B,C,D,E,F,G,H,), и мне нужна такая матрица m
А разве здесь об этом не написано?
http://www.comp.nus.edu.sg/~tants/tsm/TSM_recipe.html

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Вт 21 фев 2012 5:18
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Троллить изволишь? :wink:
Как бэ написано и даже код дан, но я только своему коду доверяю. Принцип TSM я понял, но реализовать хочу сам.

Добавлено спустя 1 час 52 минуты 6 секунд:

Подумал над задачой в поставленном выше варианте. Походу, да, нужно четыре точки, не лежащие в одной плоскости. Однако получается матрица, в которой нижняя строчка выглядит как {0,0,0,1} - т.е. никакой перспективы. И верно! Ведь в ОпенГЛ координаты вектора после транформации на модельно-видовую матрицу всегда делятся на w, и только после этого они попадают в промежуток {-1...1}. В поставленной мною задаче w-компоненты трансформированных векторов - все 1цы. Значит, я неверно сформулировал условие: вместо {-1,1,-1,1} должно быть {-w',w',-w',w'}. В таком варианте получается по 3 уравнения с 8-ю неизвестными с каждой вершины... О Боги, сколько макулатуры я сегодня создам, если не тронусь рассудком... :shock:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Вт 21 фев 2012 17:45
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Я чесно не понимаю твой велосипед, а с матрицами, как 12 лет назад было туго у меня, так и сейчас.

Добавлено спустя 1 минуту 3 секунды:

Шаман писал(а):
Как бэ написано и даже код дан, но я только своему коду доверяю.

Ах да, яж забыл про твою манию величия и увлечение изобретать велосипеды! :smile:

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Ср 22 фев 2012 6:41
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
:neutral:
Там вариант для трапеции - четырёхугольника с двумя параллельными линиями. Плюс там для направленного освещения, что не подходит для точечных источников света. Плюс там сильно упрощённый метод для конкретного случая, не общий. Плюс там рассказано лишь о составлении матрицы проекции, и подразумевается, что модельновидовую матрицу мы составишь сам. Куча операций, результатом которых будет потеря точности и опять же нерациональное использование карты тени, отчего хорошесть метода страдает.
Я же хочу решить задачу общим методом: не трудно посчитать координаты восьми точек видимого объёма, что есть исходные данные. Нужно найти матрицу, с помощью которой эта фигура трансформируется в требуемый ОпенГЛю куб видимости. Искомая матрица есть уже готовый результ перемножения матриц проекции и модельновидовой.
Всё должно быть просто - есть координаты точек до транформации, есть их координаты после. Как вектор на матрицу умножается все знают. Должна получится система линейных уравнений, решение которой даст 16 неизвестных - членов искомой матрицы трансформации. Однако что-то не так всё гладко... :roll: Восемь точек - это явно избыточные данные. Учитывая то, что грани фигур видимости плоские, то фигура может быть однозначно определена 6-ю точками - по 3 на каждую плоскость (некоторые общие). Но и этих данных, оказывается, перебор!
Прогуглил весь инет в поисках алгоритма составления таких матриц - максимум найденного - матрицы трансформации четырёхугольника в квадрат. А в 3-х измерениях, походу, не один я заблудился. :smile:
Может, можно как-то без систем уравнений задачу решить? Ну, например, как-то через плоскости граней, нормалей к ним, или ещё как-нибудь... :roll:

Вот интересный вопрос есть: если 4 точки до трансформации на некоторую матрицу лежали в одной плоскости, то гарантировано ли, что после трансформации и деления на w они так и будут лежать в одной плоскости? Матрица невырожденная, w ДО трансформации была у всех четырёх равна 1.0.

Добавлено спустя 5 часов 23 минуты 59 секунд:

Я размышлял... :roll: :teeth:
И пришёл к такому умозаключению: трапециевидные карты тени - только для направленных источников света. Составление и использование трапециевидной карты тени для точечного источника света невозможно при использовании стандартных матриц трансформации 4х4. :scientist:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Ср 22 фев 2012 10:19
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Хочу уточнить, что ты имееш в виду под "направленные" и "точечные"?

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Ср 22 фев 2012 15:10
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Направленные источники света - это бесконечно-удалённые точечные. В пределах игрового мира направленные источники света характеризуются лишь направлением распространения лучей, и лучи света параллельны. Для составления карты тени от направленного источника используется параллельная проекция (ортографическая, в обычном варианте). Солнце хорошо эмулируется направленным источником.
Точечные же - это реалистичная модель; любой источник в пределах сцены - это точечный источник. Точечные распространяют свет во все стороны, лучи света в пределах сцены везде сильно непараллельны. Расчёт света от точечного источника требует учёта положения освещаемой точки относительно положения светильника. Карта тени для точечного источника в обычном варианте - это cube map, поскольку источник излучает свет во все стороны. Пример - дорожный фонарь. Частный случай - фонарик: он тоже подпадает под классификацию точечного источника, однако не требует cube map для составления тени, поскольку разброс светового пучка меньше 180 градусов, что позволяет ограничится лишь одной картой тени.
Если принять во внимание игровой мир Механоидов - большая открытая сцена, освещаемая одним-единственным источником - солнцем, то поддержкой направленных источников света можно смело ограничиться. Точечные источники, ако плазменные снаряды, невозможно полностью эмулировать с картами теней, ибо уж слишком много их. Максимум, что им можно позволить - это освещать небольшой участок пространства вокруг, создавая блики и подсвечивая объекты, мимо которых они пролетают - именно для этого я насел на deferred shading - это позволит накладывать на картинку сколько угодно светильников.

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Чт 15 мар 2012 2:38
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Эх, как же я жалею о брошенном в своё время универе - сейчас такие вилосипеды изобретаю и открываю, что сам с себя смеюсь.
Вот на днях осознал, что физически из себя представляет матрица трансформации. Философия меня довела до такого умозаключения: это есть пачка из четырёх уравнений плоскостей - каждая СТРОКА матрицы - это уравнение плоскости стандарта "Ax+By+Cz+D=0". Т.е. первый ряд матрицы - это плоскость, перпендикуляром к которой является ось Ох, координаты которой - первые три члена этой строки; второй ряд матрицы трансформации - это плоскость, перпендикулярная оси Оу, ну и т.д. Оказалось, что направление взгляда наблюдателя можно прямо вытащить из матрицы трансформации - это первые три элемента третьей строки матрицы (что есть ось Oz).

Значит, при умножении координаты точки {x,y,z,1} на матрицу, каждая полученная компонента (x',y',z',w') являет собой расстояние от соответствующей плоскости (если оси единичной длины - иначе расстояние оказывается отмасштабированным на длину соответствующего вектора оси).

Очевидным открытием оказалось то, что оси Oz и Ow, как и соответствующие им плоскости, заданные 3-м и 4-м рядом матрицы, параллельны при перспективной проекции.
Однако играясь с четвёртой строкой матрицы, которая есть плоскость, перпендикулярная оси Ow ("гиперплоскость", ага :smile: ), можно поиметь разного рода искажения: если повернуть ось Ow на небольшой угол вокруг горизонтальной оси Oх (первые три члена второго ряда матрицы), то нижняя (или верхняя) сторона картинки "сморщивается", а противоположная - "раздувается". В этом и есть идея трапециевидных теней: при рендере от светильника (процесс составления карты тени) камера устанавливается в позицию источника света, направляется в центр пирамиды видимости игрока, и разворачивается верхушкой по направлению взгляда игрока. Если светильник над игроком, то выходит, что верх картинки - это дальний край обозреваемого игроком пространства, а у середины нижней границы карты тени находится игрок. Если представить себе подобную картину, то пирамида видимости игрока на карте тени являет собой треугольник (а с учётом нижней границы отсечения, которая очень близка к игроку - трапецию, с очень маленьким нижним основанием). Если искажений нет, то на объекты близ передней границы видимости игрока приходится несколько пикселей карты тени, в то время как на объекты вдали от игрока, у дальней плоскости отсечения разрешение то же, что и у карты тени. Чтобы увеличить разрешение карты тени вблизи игрока (низ карты тени), нужно расфлюстратить низ карты тени, укрупнив зону вблизи игрока. Это получится, если наклонить гиперплоскость ( :smile: ), приблизив игрока к ней и отдалив дальнюю точку зоны обзора игрока, соответственно. Для этого нужно слегка повернуть ось Ow вокруг оси Ox, чтобы угол между Ow и Oy уменьшился.

Это всё "на пальцах". Как считать конкретные числа - углы поворота, насколько масштабировать вектора осей, да и какую точку взять за центр - хз. В любом случае, хоть понятно стало, что из себя физически представляет матрица трансформации и как её можно геометрически построить. Это уже большой прорыв.

Как обычно, пишу для того, чтобы самому понятней стало. :teeth: Как в шутке про профессоров:
один профессор рассказывает коллеге: "ну и тупые же студенты на этот раз попались! Я им повторяю раз, второй, - уже и сам понял, - а они всё тупыми глазами на меня смотрят!"

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Чт 15 мар 2012 2:57
Профиль  
#105d99
Аватара пользователя
Сообщения: 15233
Откуда: Москва, сектор бетонных домов
Зарегистрирован: Пн 20 фев 2006 3:56
Матрицы преобразования в каноничном линале имеют столько же строк и столбцов, сколько и пространство, в котором они действуют. Однако, такие матрицы не могут осуществить перенос, и другие полезне операции, которые нужны в графике, и, чтобы унифицировать все операции, матрицы трансформации сделали четырехмерными. Не знаю точно, надо проверять, но, возможно, с точки зрения 3х-мерного пространства они уже даже не являются линейными операторами в этом пространстве. Четвертая строка/столбец в этом случае не имеет какого-то особого геометрического содержательного смысла, типа, как ты говоришь, гиперплоскости. Это даже больше похоже на комплексные числа, которые хоть и представляют собой двойки упорядоченных чисел, но имеют принципиально иную природу, чем двумерные вектора.


 Сообщение Чт 15 мар 2012 15:07
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Вот именно! Матрица 3х3 может лишь поворачивать, а чтобы ещё перенос осуществлять, нужна матрица в 4 по ширине и 3 по высоте. Ну а для эмуляции проекции добавили 4-ю строку и придумали делить на 4-ю "координату". Именно делить, поскольку только в этом случае прямые линии после трансформации не искривляются, а остаются прямыми линиями, что необходимо для рендера треугольников на аппаратуре.

Изучить матрицу трансформации меня подвигла тупиковая необходимость. Чтобы осуществить нужную мне трансформацию, мне нужно было найти соответствующую матрицу трансформации. А это - 16 неизвестных. Ну, 15 - правый нижний элемент можно смело выставить в 1, а все остальные элементы отмасштабируются соответственно. Так вот решение системы уравнений с 15-ю неизвестными методом обратной матрицы заняли мой гипермощный комп на пару минут. Я даже дебаггером пол-дня ковырял-проверял, подумав, что где-то висун вышел - неа! Потом дошло, что зависимость между рангом матрицы и количеством операций для решения системы - это факториал ранга матрицы, т.е. выходит гугл нулей операций. В общем, это не интерактивно совсем... :sad:

Вот я и решил разобраться, как матрица трансформации устроена, чтобы построить её геометрически. С большой колокольни, процесс трансформации можно описать так:
матрица трансформации представляет собой 4 уравнения плоскости, которыми являются 4 строки матрицы. Первая строка определяет плоскость Xp, вторая - Yp, третья - Zp, четвёртая строка - это плоскость Wp.
х-координата трансформированной вершины определяется как ОТНОШЕНИЕ расстояния точки до плоскости Xp к расстоянию до плоскости Wp.
y-координата трансформированной вершины определяется как ОТНОШЕНИЕ расстояния точки до плоскости Yp к расстоянию до плоскости Wp.
z-координата трансформированной вершины определяется как ОТНОШЕНИЕ расстояния точки до плоскости Zp к расстоянию до плоскости Wp.
Поскольку из уравнения плоскости формата Ax+By+Cz+D=0 можно выдернуть вектор нормали к этой плоскости ({A,B,C}), то также нужно отметить, что три первых элемента каждой СТРОКИ матрицы - это координаты векторов, являющихся координатными осями системы, в которую данная матрица трансформирует вершины.
Посему, чтобы построить матрицу трансформации, нужно просто составить 4 уравнения плоскости, зная перпендикуляры к ним (направления координатных осей) и точки, через которые плоскости проходят. Т.е. получается тупо-геометрия. Осмысленная!!! :god:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Чт 15 мар 2012 20:19
Профиль  
Техногенный
Сообщения: 8299
Зарегистрирован: Пт 29 дек 2006 17:31
Шаман писал(а):
Так вот решение системы уравнений с 15-ю неизвестными методом обратной матрицы заняли мой гипермощный комп на пару минут.

Эмм... интересно, какой порядок точности ты задал?

_________________
thrusting squares through circles


 Сообщение Чт 15 мар 2012 21:00
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
2 Шаман
Очень интересно, но нифига не понятно! :)

Так там твои шейдеры, забил уже на них ?

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Пт 16 мар 2012 10:10
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Frozen_Light писал(а):
Эмм... интересно, какой порядок точности ты задал?
Ну даблы, вообще-то... :angel: Но не в этом дело! Прикинь хоть навскидку количество операций, необходимое для вычисления детерминанта матрицы 15-го порядка.
smt005 писал(а):
Так там твои шейдеры, забил уже на них ?
Я в тенях завяз же! А встроенный функционал ОпенГЛ я уже не юзаю вапще - всё только шейдерами. Под любой плевок свой шейдер.
smt005 писал(а):
Очень интересно, но нифига не понятно!
Обана! Ну чё тут непонятного - уравнения плоскости в средней школе не проходили разве?
Имеет такой вид:
A*x+B*y+C*z+D=0;
Все точки {x,y,z}, что при подставлении в это уравнение дают требуемый ноль, лежат в плоскости, этим уравнением описываемой. Чтобы составить уравнение плоскости, нужно знать нормаль к ней (вектор n) и какую-нибудь точку, которая лежит в этой плоскости (точка p):
A = nx;
B = ny;
C = nz;
D = -nx*px - ny*py - nz*pz;
Вот так можно составить уравнение любой плоскости - нормаль определяет ориентацию плоскости в пространстве, а точка устанавливает положение.
При подставлении координат абстрактной точки в готовое уравнение плоскости получается некоторое число. Оно является расстоянием от точки до плоскости (если нормаль к плоскости имеет единичную длину). Напомню, нормаль к плоскости - это {A,B,C}.
Ну так вот матрица трансформации 4х4 представляет собой просто сборку из четырёх плоскостей: каждый ряд матрицы - это отдельное уравнение плоскости. Первый ряд (горизонтальный ряд, НЕ столбец) - это уравнение плоскости, перпендикулярной оси Ох. Второй ряд матрицы - это уравнение плоскости, перпендикулярной оси Oy. И так далее. Три первых плоскости пересекаются в некоторой точке, являющейся центром координат - это единственная точка, принадлежащая всем трём плоскостям.
Как известно, трансформация вершины с помощью матрицы происходит путём умножения строк матрицы на столбец-вектор. Выходит, что координата x' получается подставлением координат вершины в уравнение первой плоскости, координа y' - это расстояние от вершины до второй плоскости (второй ряд матрицы) и т.д. Всё ведь так очевидно, оказывается!
Ну а теперь практическая задача. Допустим, тебе нужно составить матрицу трансформации, и ты знаешь направление взгляда наблюдателя (вектор f), направление макушки (вектор u), направление "вправо" (вектор r) а также точку, где наблюдатель находится. Разумеется, все три вектора единичной длины и перпендикулярны друг другу. Знач, задача проста: составить уравнения четырёх плоскостей (трёх) и записать их в виде матрицы. Поехали!
Первая плоскость перпендикулярна оси Ох. Ось Ох - это направление "вправо". Строим уравнение этой плоскости (плоскость "1"):
A1 = rx;
B1 = ry;
C1 = rz;
D1 = -rx*px - ry*py - rz*pz;
Готово! Полученное уравнение плоскости (числа A1,B1,C1,D1) - это первый ряд матрицы.
Вторая плоскость перпендикулярна оси Оу. Ось Оу - это направление макушки наблюдателя. Строим уравнение этой плоскости (плоскость "2"):
A2 = ux;
B2 = uy;
C2 = uz;
D2 = -ux*px - uy*py - uz*pz;
Только что мы вычислили второй ряд матрицы.
С третьим рядом нужно быть осторожным - это плоскость, перпендикулярная оси Oz, и, как известно, у ОпенГЛ с этой осью путаница из-за того, что за начало координат взят левый нижний угол экрана, а не верхний, как в Директе, а ось Oz всё так же смотрит вглубь экрана. Короче говоря, направление взгляда наблюдателя нужно инверсировать:
F = {-fx,-fy,-fz}
Вот, теперь можно составить уравнение плоскости номер 3 - плоскости, перпендикулярной оси Oz:
A3 = Fx;
B3 = Fy;
C3 = Fz;
D3 = -Fx*px - Fy*py - Fz*pz;
Вот и третий ряд матрицы готов!
Четвёртый ряд - это плосксть, перпендикулярная волшебной оси Ow. Расстояние до этой плоскости (четвёртая псевдо-координата, w') используется для масштабирования расстояний до трёх других плоскостей. Благодаря этому можно получить искажения, симулирующие перспективу. В модельновидовой матрице перспективных искажений нет. Посему требуется, чтобы расстояние от этой четвёртой плоскости всегда было равно 1, вне зависимости от положения трансформируемой вершины. Это делается так:
A4 = 0;
B4 = 0;
C4 = 0;
D4 = 1;
Разумеется, это уже не плоскость, а полная липа, именуемая "гиперплоскостью". Расстояние от неё до любой точки пространства одинаково и равно 1.
В общем, это четвёртый ряд матрицы.
Если глянуть на описание функции gluLookAt, то видно полное соответствие результатов. :smile:

_________________
Сообщество креативных механоидов:
aim-fans.ru


Последний раз редактировалось Shaman Сб 17 мар 2012 9:06, всего редактировалось 2 раз(а).

 Сообщение Сб 17 мар 2012 1:06
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Шаман писал(а):
А встроенный функционал ОпенГЛ я уже не юзаю вапще - всё только шейдерами.

Ну наконец-то, а то я думал ты безнадёжен со своей универсальность типа "моя прога будет работать даже на компах 10 летней давности".

Добавлено спустя 4 минуты 29 секунд:

Шаман писал(а):
Ну чё тут непонятного - уравнения плоскости в средней школе не проходили разве?

ТЫ бы сперва спросил, помню я среднюю школу! :)
Завтра почитаю/вникну, а то сейчас уже второй час ночи...

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Сб 17 мар 2012 9:02
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Вникни, вникни. А то всю жизнь матрицы вуду-магией считать будешь. :smile:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Ср 21 мар 2012 14:34
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Немножко поэкспериментировал с гиперплоскостью, ибо вздумалось мне: "а фигли все три координаты нужно делить на одну и ту же, четвёртую? Айда ввести ещё две гиперплоскости, чтоб каждую координату делить на свою отдельную даблъю!" Т.е. попробовал матрицу 4х6, деля X на W1, Y на W2, Z на W3, при этом три гиперплоскости, разумеется, не параллельны (а то какой же интерес?). Результат: прямые линии искривляются (выходит не перспектива, а кривое зеркало). А это не допустимо, ибо грани растеризуемых треугольников могут быть только прямыми (так уж растеризация работаеть), хотя должны изгибаться. Т.е. палка должна согнуться в дугу, однако превращается в гофрированный шланг из прямых сегментов. А если гиперплоскость одна, как заведено, то палка может растянуться/сжаться/превратиться в усечённую пирамиду, но все точки, лежащие на одной лини всё равно так и останутся лежать на одной линии после трансформации. В этом идея матрицы 4х4, где все три координаты деляться на одну и ту же плоскость.

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Чт 22 мар 2012 21:23
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
На форуме есть картинка интерфейса меха из М1, не помню в какой теме. Кто вспомнит, киньте ссылку.

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Вт 27 мар 2012 23:56
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
:roll: Эм... Я честно, понятия не имею. :nipri4em:
Покажи ужо чё-нить, люди хотят по-О-кать! :yes:

_________________
Сообщество креативных механоидов:
aim-fans.ru


Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 567 ]  На страницу Пред.  1 ... 4, 5, 6, 7, 8, 9, 10 ... 19  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB