Модераторы: Snowy, Alexeis, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите написать алгоритм построения теней, алгоритм на Delphi 
V
    Опции темы
Tanyaata
Дата 28.2.2009, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



Все сделано


Это сообщение отредактировал(а) Tanyaata - 19.4.2009, 13:36
PM MAIL   Вверх
MetalFan
Дата 28.2.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 5
Всего: 128



теней от чего?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Чупакабро
Дата 28.2.2009, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:45
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
AntonN
Дата 1.3.2009, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 7
Всего: 18




Модератор: Сообщение скрыто.



--------------------
user posted image
PM MAIL WWW   Вверх
Чупакабро
Дата 5.3.2009, 20:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:45
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
MetalFan
Дата 5.3.2009, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 5
Всего: 128



Цитата(Чупакабро @  5.3.2009,  20:13 Найти цитируемый пост)
Где-то около 900 строк получилось.

Монстр!


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Чупакабро
Дата 6.3.2009, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:44
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Чупакабро
Дата 6.3.2009, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:43
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Чупакабро
Дата 6.3.2009, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:42
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Tanyaata
Дата 7.3.2009, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



smile Спасибо вам большое, за то что отзываетесь. очень благодарна, буду разбираться, если не пойму, то буду мучать вопросами)))))

Добавлено через 10 минут
а можно узнать где вы взяли теорию по написанию алгоритма. что за алгоритм используется и в каких книгах он написан. Программа использует только GDI-это что такое? сама еще начала разбираться с OpenGL. можно и этот код на нем, если Вам не сложно. Мне обе пригодятся. начну разбираться пока с вашим первым вариантом. Еще раз огромное спасибо

PM MAIL   Вверх
Чупакабро
Дата 7.3.2009, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:40
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Tanyaata
Дата 10.3.2009, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



мне бы точно узнать книжки. мне по мимо программы надо оформить теорию. и еще  можно ли изменить программу, чтобы она рисовала, только тень от каркаса куба. 
PM MAIL   Вверх
Чупакабро
Дата 10.3.2009, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено



Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:39
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Чупакабро
Дата 13.3.2009, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:38
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Tanyaata
Дата 14.3.2009, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



Рисование тени от каркаса мне нужно без OpenGL. Алгоритм написан в книжке  Никулина "Компьютерная графика", но там слишком все общее. мне это для диплома нужно. тема у меня Свет в компьютерной графике. Тени, я ничего подобрать не могу. литературы мало, все написано словами, нет нигде четкого алгоритма. причем нужно пользоваться только стандартным интерфейсом, без других технологий. smile 
вот такие у меня проблемы.

Добавлено через 56 секунд
Везде написано, для построения теней модифицируйте алгоритмы удаления невидимых линий и граней

Добавлено через 2 минуты и 58 секунд
Программу запустить удалось, работает.

Добавлено через 4 минуты и 59 секунд
первый ваш алгоритм напоминает описанный алгоритм z-буфера для удаления невидимых граней

PM MAIL   Вверх
Чупакабро
Дата 14.3.2009, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:36
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Чупакабро
Дата 14.3.2009, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:36
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Tanyaata
Дата 15.3.2009, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



Сначала мне надо построение тени отрезка(как на рис. 1.64), так как эта основа  построений, потом развить это на каркас:
       - построить тень от каркаса куба- на произвольной поверхности(рисуется плоскость и на ней тень), а источник света точечный и должен двигаться.
ну а на конец, я поставлю вашу первую программу, то есть построение тени от 3-мерного объекта.

Добавлено через 3 минуты и 51 секунду
а можно узнать из какого вы города?
PM MAIL   Вверх
Чупакабро
Дата 15.3.2009, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:35
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Чупакабро
Дата 15.3.2009, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:35
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Tanyaata
Дата 15.3.2009, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



Еще я почитала книгу Роджерс - алгоритмические основы комп. графики. там тоже говорится о модификации алгоритмов удаления невидимых граней для теней. там даже пример есть разобранный.

Добавлено через 49 секунд
а я не сильно Вас загружаю????
PM MAIL   Вверх
Чупакабро
Дата 15.3.2009, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:34
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Tanyaata
Дата 16.3.2009, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



Тени

Если положения наблюдателя и источника света совпадают, то теней не видно, но они появляются, когда наблюдатель перемещается в любую другую точку. Изображение с построенными тенями выглядит гораздо реалистичнее, и, кроме того, тени очень важны для моделирования. Например, особо интересующий нас участок может оказаться невидимым из-за того, что он попадает в тень. В прикладных областях — строительстве, разработке космических аппаратов и др. — тени влияют на расчет падающей солнечной энергии, обогрев и кондиционирование воздуха.

Наблюдения показывают, что тень состоит из двух частей: полутени и полной тени. Полная тень — это центральная, темная, резко очерченная часть, а полутень — окружающая ее более светлая часть. В машинной графике обычно рассматриваются точечные источники, создающие только полную тень. Распределенные источники света конечного размера создают как тень, так и полутень: в полной тени свет вообще отсутствует, а полутень освещается частью распределенного источника. Из-за больших вычислительных затрат, как правило, рассматривается только полная тень, образуемая точечным источником света. Сложность и, следовательно, стоимость вычислений зависят и от положения источника. Легче всего, когда источник находится в бесконечности, и тени определяются с помощью ортогонального проецирования. Сложнее, если источник расположен на конечном расстоянии, но вне поля зрения; здесь необходима перспективная проекция. Самый трудный случай, когда источник находится в поле зрения. Тогда надо делить пространство на секторы и искать тени отдельно для каждого сектора.

Для того чтобы построить тени, нужно по существу дважды удалить невидимые поверхности: для положения каждого источника и для положения наблюдателя или точки наблюдения, то есть это двухшаговый процесс. Рассмотрим сцену на рис. 28.1. Один источник находится в бесконечности сверху: спереди слева от параллелепипеда. Точка наблюдения лежит спереди: сверху справа от объекта. В данном случае тени образуются двояко: это собственная тень и проекционная. Собственная тень получается тогда, когда сам объект препятствует пропаданию света на некоторые его грани, например на правую грань параллелепипеда. При этом алгоритм построения теней аналогичен алгоритму удаления нелицевых граней: грани, затененные собственной тенью, являются нелицевыми, если точку наблюдения совместить с источником света.
user posted image[quote]

сли один объект препятствует попаданию света на другой, то получается проекционная тень, например тень на горизонтальной плоскости на рис. 28.1b. Чтобы найти такие тени, нужно построить проекции всех нелицевых граней на сцену. Центр проекции находится в источнике света. Точки пересечения проецируемой грани со всеми другими плоскостями образуют многоугольники, которые помечаются как теневые многоугольники и заносятся в структуру данных. Для того чтобы не вносить в нее слишком много многоугольников, можно проецировать контур каждого объекта, а не отдельные грани.

После добавления теней к структуре данных, строится вид сцены из заданной точки наблюдения. Отметим, что для создания разных видов не нужно вычислять тени заново, так как они зависят только от положения источника и не зависят от положения наблюдателя.
PM MAIL   Вверх
Чупакабро
Дата 17.3.2009, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:34
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Tanyaata
Дата 17.3.2009, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



я поняла, для построения теней необходимо 2 этапа:
 - удалить нелицевые грани, когда точку наблюдения совмещают с источником света - собственные тени.
 - для построения проекционных теней необходимо просто построить проекцию всех нелицевых граней. Центр проекции находится в источнике света.
 для удаления невидимых граней можно использовать Алгоритм Роджерса, он более понятный. чем все остальные

Добавлено через 2 минуты и 1 секунду
Пример. Рассмотрим параллелепипед на рис. 28.1a. Он задан точками P1(1, 0, 3.5), P2(2, 0, 3.5), P3(2, 0, 5), P4(1, 0, 5), P5(1, 3, 3.5), P6(2, 3, 3.5), P7(2, 3, 5), P8(1, 3, 5). Параллелепипед стоит на плоскости, заданной точками B1(0, 0, 0), B2(6, 0, 0), B3(6, 0, 6), B4(0, 0, 6). Источник света расположен в бесконечности на прямой, проходящей через P2 и P8. Точка наблюдения находится в бесконечности на положительной полуоси z после поворота сцены сначала на -45o вокруг оси y и затем на 35o вокруг оси x.

Для того чтобы найти собственные тени, необходимо определить нелицевые грани относительно положения источника. Составим матрицу объема параллелепипеда, где R, L, B, T, H, Y обозначают правую, левую, нижнюю, верхнюю, ближнюю и дальнюю грани, если смотреть на преобразованный объект из бесконечности с положительной полуоси z.

Вектор от источника к объекту в однородных координатах:
[E] = P2 - P8 = [1, -3, -1.5, 0].

Скалярное произведение вектора направления к источнику и нелицевых плоскостей дает:

Знак минус означает, что при наблюдении из положения источника правая, нижняя и дальняя грани являются нелицевыми и, следовательно, находятся в в собственной тени.

Существует несколько способов нахождения проекционных теней. Один из них заключается в том, чтобы перенести и повернуть параллелепипед вместе с плоскостью его основания до совмещения вектора направления на источник с осью z. Источник находится в бесконечности, поэтому ортогональная проекция видимых граней на преобразованную плоскостьоснования дает проекционную грань. Значение z получается подстановкой x- и y-координат вершин преобразованного параллелепипеда в уравнение преобразованной плоскости основания. Затем координаты проекционных теней проводятся к первоначальной ориентации.

Для совмещения вектора падающего из бесконечности вдоль прямой P8P2 света с осью x необходимо:

    * перенести P2 в начало координат;
    * выполнить поворот на 33.69o вокруг оси y, чтобы P4 совпала с осью z;
    * выполнить поворот на 59.04o вокруг оси y, чтобы P8 совпала с осью z.

Объединенное преобразование:

Преобразуя плоскость основания и параллелепипед, получим

Уравнение npeoбразованной плоскости основания найдем методом Ньюэлла:
z = -0.6 y.

Подставляя x- и y-координаты вершин преобразованного параллелепипеда в уравнение плоскости, определим z, что дает проекцию тени на плоскость основания:

Штрих обозначает вершину проекционной тени.

Из положения источника видны только передняя, левая и верхняя грани; они и порождают проекционные тени:
передняя: P3P4P8P7 - P3'P4'P8'P7'
левая: P1P4P8P5 - P1'P4'P8'P5'
верхняя: P7P8P5P6 - P7'P8'P5'P6'

Отметим, что ни одна видимая грань не содержит точку P2; поэтому ее проекция P2' не входит в видимые проекционные тени. Обратным преобразованием, то есть [T]-1, построенные проекционные тени переводятся в исходную ориентацию:

Проекциями теней на плоскость основания будут S3S4S8S7, S1S4S8S5, S7S8S5S6, S4S8S7, S1S4S8S5, S7S8S5S6, а общим контуром — S1S5S6S7S3S4.

Добавлено через 4 минуты и 59 секунд
пример - тут пример

Добавлено через 8 минут и 10 секунд
Спасибо Вам  большое, что не оставили меня в беде, что советуете и помогаете.
PM MAIL   Вверх
Чупакабро
Дата 17.3.2009, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:33
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Tanyaata
Дата 21.3.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



Моему руководителю важно, чтобы все было по алгоритму, но с программой можете не торопиться, думаю к апрелю можно и написать. А четкого плана она не дает, говорит все сами пишите.
PM MAIL   Вверх
Чупакабро
Дата 21.3.2009, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:33
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Tanyaata
Дата 22.3.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



а какой Вы алгоритм используете для удаления невидимых граней

PM MAIL   Вверх
Чупакабро
Дата 22.3.2009, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:32
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Dimonka2
Дата 23.3.2009, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 19.3.2009

Репутация: нет
Всего: нет



Читаю-читаю и не понимаю, в чём возникает проблема при рисовании теней? В проекции или в создании "мягких" границ?

Проекция считается относительно легко.  Берётся точка источника света, точка на плоскости и нормаль плоскости. И через функцию MakeShadowMatrix() из юнита VectorGeometry проекта GLScene получаем матрицу проекции света. Далее каждый полигон проецируется на плоскость с помощью этой матрицы. Можно даже перемножить матрицу на матрицу проекции на экран и проецировать тень прямо в экранные координаты.

С мягкими тенями всё чуть сложнее. Они рисуются обычно либо в несколько проходов, либо для каждого полигона в отдельности.
PM MAIL   Вверх
Чупакабро
Дата 23.3.2009, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:30
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Dimonka2
Дата 23.3.2009, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 19.3.2009

Репутация: нет
Всего: нет



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

На языке Delphi написать проблем вообще нет, если можешь объяснить алгоритм по-русски )).

Меня больше интересуют мягкие тени и способы их быстрого рисования. Может есть какие идеи по этому поводу?
PM MAIL   Вверх
Tanyaata
Дата 23.3.2009, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



А в алгоритме не нужны мягкие тени. и еще вопрос, а какое затенение вы используете на самом объекте?
PM MAIL   Вверх
Чупакабро
Дата 23.3.2009, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



[/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:29
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Dimonka2
Дата 24.3.2009, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 19.3.2009

Репутация: нет
Всего: нет



Цитата(Чупакабро @  23.3.2009,  22:41 Найти цитируемый пост)
Нужно учитывать время на вылавливание ошибок. У меня на это уходит бОльшая часть времени, см. мою подпись))

у меня больше времени уходит на придумку алгоритма


Цитата(Чупакабро @  23.3.2009,  22:41 Найти цитируемый пост)
То есть использовать что-то вроде буфера трафарета? Это нельзя по условию задачи.

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


А насчёт мягких теней идей нет или здесь только проекционные тени обсуждаются?
PM MAIL   Вверх
Чупакабро
Дата 24.3.2009, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:29
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Dimonka2
Дата 25.3.2009, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 19.3.2009

Репутация: нет
Всего: нет



Вот пример теней по описанному мной выше алгоритму (присоединён)

Код показать не могу, его слишком много и он большей частью к тени не относится. Проблема кода #1 нет самозатенения кроме как освещённости по фонгу, #2 алгоритм относительно медленный.

Присоединённый файл ( Кол-во скачиваний: 17 )
Присоединённый файл  shadow.jpg 56,94 Kb
PM MAIL   Вверх
Tanyaata
Дата 26.3.2009, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



Цитата

В смысле? Как одни грани объекта затеняют другие грани того же объекта?


нет, как вы закрашиваете(затеняете) видимые границы куба. у них же тоже цвет меняется в зависимости от источника света? есть плоское затенение, затенение по Фону и затенение по Гуро

Добавлено через 26 секунд
мягких теней мне не надо. в программе

Добавлено через 10 минут и 24 секунды
все-таки вы используете OpenGL???

Добавлено через 12 минут и 54 секунды
Цитата

Там я понаделал кнопок для тестирования разных геометрических алгоритмов. CTRL+левая кнопка мыши - ввод отрезков, SHIFT+левая кнопка мыши - ввод многоугольников


я не заметила этого, не получается, когда нажимаю и кнопок не увидела
PM MAIL   Вверх
Чупакабро
Дата 26.3.2009, 22:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:28
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Dimonka2
Дата 27.3.2009, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 19.3.2009

Репутация: нет
Всего: нет



Я понял, что мы говорим о совершенно разных вещах. Я говорю о тени, а вы говорите об освещении.


Чупакабро
Твою загогулину можно и по фонгу в реальном времени осветить, ничего сильно не ляжет, главное сделать правильный цикл закраски по строкам.


Tanyaata
Всё рисуется без всякого ускорения, никакого OpenGL/Direct3D не используется

Если нужно просто освещение, то примеров тысячи. Нужно просто нормаль стороны перемножить на направление источника света и взять из результата длину по Z. всё это делается с нуля за 10 минут
PM MAIL   Вверх
Tanyaata
Дата 28.3.2009, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



Ой, простите, открыла первую вашу программу. поэтому и ничего не увидела. А можно узнать какие параграфы вы читаете в Никулине, чтобы начать в теории разбираться

Добавлено через 51 секунду
Цитата

Я понял, что мы говорим о совершенно разных вещах. Я говорю о тени, а вы говорите об освещении.



Мы говорим и о тени и об освещении

PM MAIL   Вверх
Чупакабро
Дата 28.3.2009, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:27
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Tanyaata
Дата 28.3.2009, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



начала я его читать, да уж, своеобразный человек и автор. Факты так изложил, что обычные вещи кажутся непонятными и сложными
PM MAIL   Вверх
Tanyaata
Дата 4.4.2009, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



А куда все пропали?
PM MAIL   Вверх
Чупакабро
Дата 5.4.2009, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:27
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Чупакабро
Дата 5.4.2009, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:26
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Tanyaata
Дата 5.4.2009, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



Спасибо за это большое, думаю я разберусь в программе, конечно с вашей помощью

Добавлено через 2 минуты и 45 секунд
Что т пока не понятно мне все...все красное и никуда не движется, и нет источника освещения
PM MAIL   Вверх
Чупакабро
Дата 5.4.2009, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:26
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Чупакабро
Дата 6.4.2009, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:25
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Чупакабро
Дата 6.4.2009, 19:19 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:25
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
pasha08
Дата 6.4.2009, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 11.8.2008
Где: Тула

Репутация: нет
Всего: нет



шутник  smile 
PM MAIL ICQ Skype   Вверх
Tanyaata
Дата 7.4.2009, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



Цитата(Чупакабро @ 6.4.2009,  19:19)
Управление: wasd + мышь (тьфу, это в project origin, а не в project1)

я это не поняла.
И на данной стадии рисуется пока квадрат, а не куб

А так давайте разбираться. Думаю я пойму все

Добавлено через 57 секунд
По крайней мере очень надеюсь на это smile 
PM MAIL   Вверх
Чупакабро
Дата 7.4.2009, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:24

Присоединённый файл ( Кол-во скачиваний: 20 )
Присоединённый файл  allright.JPG 29,34 Kb
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Tanyaata
Дата 7.4.2009, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



вот поэтому и думала, что квадрат.)))
PM MAIL   Вверх
Dimonka2
Дата 8.4.2009, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 19.3.2009

Репутация: нет
Всего: нет



Цитата(Чупакабро @ 7.4.2009,  20:51)
Сегодня не успел толком ничего сделать, работал до 18:00, так что обновленный результат выложу завтра (8 апреля).
Но куб и тень от него рисуются уже сейчас. Может вы опять не ту программу запустили?
Завтра надеюсь решить проблему с определением принадлежности отрезка полигону - процедура не всегда работае правильно, поэтому тень при некоторых положениях куба и источника света исчезает.
Кстати, крутить куб на кнопки q и e.

Смотрел на результат и плакал. Не понимаю почему у тебя всё так сложно?

Алгоритм должен быть примерно таким:

1. задаёшь источник и плоскость приёмник (это у тебя сделано)
2. Делаешь матрицу проекции источника на плоскость (примеров полно)
3. здесь два варианта либо проецируешь тень прямо на экран, либо создаёшь буфер тени по размеру плоскости
4. Каждый элемент куба проецируешь с помощи матрицы тени на плоскость приёмник, (а затем, в случае проекции на экран, проецируешь на экран)
5. При отрисовке в буфер лишнее само отвалится, при отрисовке на экран можно сделать маску поверхности приёмника и ограничивать тень по экрану и по маске.

Код уж сам допишешь. Думаю, что никакого осбенного клипирования и пересечения делать не нужно.

Ну а сам код - каша.
PM MAIL   Вверх
Чупакабро
Дата 8.4.2009, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:23
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Tanyaata
Дата 8.4.2009, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



Цитата(Dimonka2 @ 8.4.2009,  12:12)
Алгоритм должен быть примерно таким:

1. задаёшь источник и плоскость приёмник (это у тебя сделано)
2. Делаешь матрицу проекции источника на плоскость (примеров полно)
3. здесь два варианта либо проецируешь тень прямо на экран, либо создаёшь буфер тени по размеру плоскости
4. Каждый элемент куба проецируешь с помощи матрицы тени на плоскость приёмник, (а затем, в случае проекции на экран, проецируешь на экран)
5. При отрисовке в буфер лишнее само отвалится, при отрисовке на экран можно сделать маску поверхности приёмника и ограничивать тень по экрану и по маске.

Откуда вы взяли этот алгоритм?

Добавлено через 3 минуты и 47 секунд
Чупакабро, а вы не читали другие книги по удалению невидимых граней и проецированию? Может там доступнее написано. Рекомендую Роджерс, Адамс "алгоритмические основы комп. графики". Может эта книга вам поможет.
PM MAIL   Вверх
Чупакабро
Дата 8.4.2009, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



/удалено

Это сообщение отредактировал(а) Чупакабро - 31.5.2009, 21:22
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Dimonka2
Дата 9.4.2009, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 19.3.2009

Репутация: нет
Всего: нет



Цитата(Чупакабро @  8.4.2009,  16:39 Найти цитируемый пост)
Dimonka, мне просто лень пересказывать краткое содержание этой темы. Но суть дела вот в чем: есть одна книжка, где приведен алгоритм. Этот алгоритм не подразумевает вообще ни каких операций с пикселями. Ни каких. Вообще. 

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

Все алгоритмы, которые я видел в конечном итоге отталкиваются от конечного разрешения экрана/приёмника тени/детализации буфера тени. 
PM MAIL   Вверх
Tanyaata
Дата 9.4.2009, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



Конечно, не все равно как. мне нужна теория, по которой написан алгоритм, в каких-то книгах. Просто у Никулина все написано по шагам. а у остальных слова, но более понятным языком))))
PM MAIL   Вверх
Tanyaata
Дата 10.4.2009, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



по Роджерсу конечно все намного понятнее, может реализовать алгоритм из него(Алгоритм Робертса и алгоритм Z- буфера). Хотя Ваша первая программа тоже тени правильно рисует, может описать алгоритм Z-буфера и алгоритм Робертса. и сравнить Ваш первый алгоритм с Z-буфером(получим модификацию этого алгоритма).И, кстати, алгоритм Z-буфера определяет только невидимые грани, а потом нужно еще и их проекцию строить. А если время останется и Никулина можно доделать. Хотя может это уже и перебор будет...Я конечно дико извиняюсь, что не сказала, что мне не принципиально  Никулин, просто я вам его книгу предложила и книгу Роджерса.

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

Добавлено через 4 минуты и 55 секунд
да и в книге роджерса, есть раздел, который называется Тени
PM MAIL   Вверх
Tanyaata
Дата 12.4.2009, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 28.2.2009

Репутация: нет
Всего: нет



Ну что проще сделать?

Добавлено через 9 минут и 10 секунд
почитала, на все ответила))))
PM MAIL   Вверх
Dimonka2
Дата 15.4.2009, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 19.3.2009

Репутация: нет
Всего: нет



Цитата(Чупакабро @ 10.4.2009,  08:04)
В жизни вообще тени пишутся не на Delphi и не на С, а на HLSL или чем-нибудь подобном (если я ничего не путаю).

На чём только не пишут. 3D Max, Maya и C4D явно на C++ написаны. А Блендер уж тем более на нём.

Цитата
Dimonka2, а как такой алгогритм:
для каждой точки буфера кадра известны координаты x,y,z
проводим отрезок от точки к источнику света и смотрим его пересечение со всеми треугольниками сцены
если пересечение есть, точка затеняется

такой алгоритм я уже реализовал, просто нужно найти под него теорию от извесных авторов))

Это обратная трассировка лучей, а можно делать прямую трассировку:

Для каждого экранного пикселя определять какие полигоны на нём расположены и для тех полигонов в точке пересечения рассчитывать их освещённость. Причём если у тебя нет антиалейзинга (а у тебя его нет), то тебе достаточно сделать буфер полигонов для простоты (в каждой точке экрана записывать номер полигона).

Но всё равно это не наш метод. smile Надо придумать как это сделать очень быстро и с антиалейзингом.
PM MAIL   Вверх
Hooch
Дата 24.5.2009, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.3.2006
Где: г. Омск

Репутация: нет
Всего: нет



Что-то я не могу разобраться самостоятельно -- может быть, вы поможете?
Работаю с GLScene. Есть произвольный объект -- GLFreeForm, есть точка -- источник света. Есть плоскость -- совпадает с плоскостью XZ (т.е. ее позиция по Y равна нулю и нормаль смотрит вверх). Объект всегда находится полностью над плоскостью. Необходимо просчитать и нарисовать тень. В идеале, конечно -- мягкую. Но пусть для начала будет четкая.

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

Я перебираю все вершины GLFreeForm, вычисляю проекцию каждой вершины на плоскость (исходя из положения источника света), добавляю получившееся значение в полигон -- и такая фигня, знаете, получается smile Вместо цельной тени получается этакая полосатая зебра. Вероятно, это зависит от очередности вершин. Так или иначе, этот момент сложноват для моего понимания. Я так понял, что в идеале необходимо добавлять в полигон только те точки, которые образуют контур тени -- но как отобрать только эти точки, да еще потом и соединить их в правильном порядке?

Буду очень благодарен, если вы подскажете мне хотя бы чуть-чуть. Может быть, есть другой вариант решения задачи, помимо использования полигона для тени. Тоже буду рад, если подскажете. Но изначальная задача такова, что тень должна рисоваться и при отсутствии аппаратного ускорения на машине (т.е. всякие шейдерные тени отпадают).
PM MAIL ICQ   Вверх
Чупакабро
Дата 31.5.2009, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: 2
Всего: 4



я не видел программы, но зебра может получаться из-за включенного z-буфера. если это так, то надо выключить его, нарисовать плоскость, нарисовать тень, включить z-буфер
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.1899 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.