Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


Kerbit
Цитата:
Как определить попадает ли вектор в область видимости?
Из точки стояния игрока можно провести луч - направление его взгляда. Если этот луч повернуть налево на 30 градусов и направо на 30 градусов, то получится угловой сектор в 60 градусов - область видимости. Чтобы проверить попадает ли объект в область видимости, надо проверить, что угол вектора до этого объекта лежит в этом секторе. (Чтобы избавиться от "дорогостоящей" операции арктангенса, которая требуется для определения угла, можно воспользоваться скалярным произведением векторов. Произведение вектора до объекта на левый луч, ограничивающий область видимости, должно быть отрицательно, а на правый - положительно [или наоборот, запамятовал я элементарную геометрию]).

Цитата:
Не логичнее ли будет в процессе определения пересечения лучей со стенами запоминать, какие спрайты пересек луч.
Если они у вас могут находится только вдоль сетки стен (т.е. ничем от не отличаются от обычных стен, на самом дель), то наверное огичней. Но в общем случае, вы не можете оперделить пересечение с произвольным обхектом, так как они как правило хранятся только в виде координаты и радиуса. Считать персечение луча с окружностью (тем более, что это придётся делать "количество лучей (320)" х "количество обхектов на карте") - это очень дорого.

Цитата:
Насколько я понимаю, то z-буфер строится только для спрайтов.
z-буфер строится для всего экрана. Сначала мы отрисовываем стены и в соответствии с ними первоначально заполняем z-буфер. Затем каждый раз при необходимости нарисовать (непрозрачную) точку спрайта проверяем - если расстояние до неё < расстояния в z-буфере, то рисуем и записывем в буфер расстояние до этой точки, иначе ничего не делаем.

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

Цитата:
Нужно выводить отдельно каждую вертикальную линию спрайта?
да. В принципе механизм отсечения лучей основан на том, что мы всё рисуем по вертикалям, соответствующим лучам в горизонтальной плоскости.

-------
http://ivank.ru

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:28, 17-04-2007 | #6