Я вот решил освоить рендеринг этой великой игры. До этого понял весь движок Вольфенштейна 3д, но в случае с думом всё куда интереснее. И у меня несколько вопросов к думерам, разбирающимся и в технической части игры (заодно и узнаем, много ли их тут на форуме, хехе).
В инете много где пишут, что в Думе, мол, используется рейкастинг. По-моему, это не так, хотя я, может, и не прав. Раасскажите, каким образом в игре отрисовываются SEGS (и, соответственно, SIDEDEFS) , если они на карте заданы по сути только точками ? Если всё-таки используется рейкастинг, то как происходит трассировка лучей до такой линии?
P.S. исходники, конечно, смотрел, но несмотря на то что Кармак пишет вполне чисто и красиво, не понял.
Дум является 2.5D движком, но не рейкастером. А пишут про рейкастинг в думе... Да это просто так после вольф3д повелось, что 2.5Д = рейкастинг, хотя это не так. Билд тоже рейкастером называют, и сам создатель движка это опровергает.
SEGS отрисовываются достаточно просто, я даже свою недорисовалку делал.
1) Передвигаем две точки чтобы камера была в начале координат.
2) Проецируем вершины на экран, учитывая горизонтальный FOV. (ну то есть
);
3) Находим расстояния от плоскости камеры до вершин. (тут у меня мой недорендерер заглючил при рисовании стен за пределами экрана. Уверен, что дум как-то ограничивает вершины по fov)
4) Рисуем серию столбцов на экране между двумя спроецированными вершинами, линейно интерполируя все параметры, зависящие от дальности (высота столбца стены, масштаб столбца текстуры, етц).
Korshun
Смею оспорить: Кен нигде не опровергал, что Build рейкаст. Технология строится на рейкастинге, т.е. мы бросаем луч. Для того, что-бы понять что-куда, скачай с сайта Ken Silverman демку, для QBasicа, которую делал сам Кен, что-бы понять как в думе работают уровни. И еще, то, что ты описал и есть рейкаст! Просто поверь на слово
Смею оспорить: Кен нигде не опровергал, что Build рейкаст.
Опровергал на форуме jfDuke (http://www.jonof.id.au). Там очень долго сидел сам Кен. Говорил, что сам не знает, кто сказал что билд это рейкастер, и что на самом деле это не так... Буквально несколько месяцев назад форум работал, но счас его закрыли и из кеша гугла тоже пропало.
BFG2407 :
Технология строится на рейкастинге, т.е. мы бросаем луч.
Никаких лучей мы не бросаем, а заполняем стену на экране по двум концам.
BFG2407 :
Для того, что-бы понять что-куда, скачай с сайта Ken Silverman демку, для QBasicа, которую делал сам Кен, что-бы понять как в думе работают уровни.
Это же то старьё когда билд ещё был тайловым. После телефонного разговора с Кармаком Кен выкинул рейкастинг и сделал сектора как в думе.
BFG2407 :
И еще, то, что ты описал и есть рейкаст! Просто поверь на слово
А вот не поверю Рейкастинг это когда бросаются лучи (например, как в вольф3д). А в думе лучей для рендеринга не бросается
Korshun , спасибо за почти доходчивое объяснение. Правда, про проецирование на экран я не совсем понял - что представляет собой FOV? (само определение я знаю - field of view. Меня интересует именно в данном контексте - это интегер какой-то?)
p.s. А эта твоя "недорисовалка" ещё осталась где-нибудь?
Field of view это угол. Угол может задаваться в чём хочешь: в радианах, в градусах или в своих единицах (в думе угол это short, в окружности 65536 углов). Главное чтобы были соответствующие тригонометрические функции. Да и пожалуй сходу я формулу неправильную написал.
Рендерера у меня было два, более хороший удолил, более старый - глюкалово и забил давно и легче новый написать. Код грязный, текстурирование стен поломано, проекция неправильная :/
Korshun, исходников, я так понимаю, не осталось?
по теме: а как тогда отрисовывались стены, концы (VERTICES) которых не укладывались в FOV? допустим, мы смотрим на стену и видим только её середину, а края "не влезают" в поле зрения?
Ну исходники более нового и хорошего рендерера не сохранились. А старый, как я уже сказал, УГ по всем параметрам.
sidav :
а как тогда отрисовывались стены, концы (VERTICES) которых не укладывались в FOV?
А вот я сам не разобрался :/. В этом случае мой рендерер начинал неправильно рендерить стену. Уверен, что дум как-то очень просто проверяет, выходит ли вершина за fov, и если да, то ограничивает их... Сейчас очень лень лезть разбираться :/
А старый, как я уже сказал, УГ по всем параметрам.
а можешь хотя бы им поделиться?
BFG2407 :
Для того, что-бы понять что-куда, скачай с сайта Ken Silverman демку, для QBasicа, которую делал сам Кен, что-бы понять как в думе работают уровни.
что-то непонятное написал. Эта демка тайловая, с Ъ-рейкастингом. В Думе же тайлов нет вообще. Не думаю, что Кен писал не имеющий никакого отношения к Думу движок чтобы понять как работает Дум.
Скрытый текст:
он же совсем не глупый человек - глупец такой хороший движок как билд не написал бы.
BFG2407 :
И еще, то, что ты описал и есть рейкаст! Просто поверь на слово
Рейкастинг - ray casting - переводится как "бросание лучей" или "пускание слюней лучей". То есть, по определению, мы должны бросать луч из камеры к объектам, и смотреть где луч пересекает объекты сцены. Ну-ка, скажи, где в описанном коршуном примере есть трассировка луча и столкновение с объектами?
Не думаю, что Кен писал не имеющий никакого отношения к Думу движок чтобы понять как работает Дум.
Кен пытался сделать движок, имеющий схожие с думом возможности. Но до разговора с Кармаком пытался достичь их тайлами. Кстати есть и гораздо более продвинутая демка чем то QBasic-УГ, а именно - самая последнаяя тайловая версия билда, в которой были высоты, текстуры пола, освещение - вобщем, на первый взгляд отличий от секторов не заметно.
Кстати есть и гораздо более продвинутая демка чем то QBasic-УГ, а именно - самая последнаяя тайловая версия билда, в которой были высоты, текстуры пола, освещение - вобщем, на первый взгляд отличий от секторов не заметно.
Да, кстати, помню у Кена был полностью трёхмерный движок, действительно работающий на трёхмерных же тайлах. Сложно сказать, почему фичи из этого движка (а именно, трёхмерность) не были реализованы в Build. То-ли он был позже, то-ли там жёстко завязано на квадратности объектов.
Линка не нашёл но на ютубе в видео History of Build Engine показана.
ZZYZX :
Да, кстати, помню у Кена был полностью трёхмерный движок, действительно работающий на трёхмерных же тайлах. Сложно сказать, почему фичи из этого движка (а именно, трёхмерность) не были реализованы в Build. То-ли он был позже, то-ли там жёстко завязано на квадратности объектов.
Похоже, что да, квадратность. К тому же в билде есть 3д полы (без слопов) и сектора поверх секторов, так что вроде как ничего и не потеряно.
Добавлено спустя 5 часов 12 минут 11 секунд:
ZZYZX :
http://alexfru.chat.ru/r3d.html
Посмотрел клоны вольф3д и квакодума (как ещё назвать секторный движок с тру3д рендерингом, если есть даже дум порты на основе рендерера кваки? ). Жаль что там всё под дос, и непонятно, зачем там только один экзешник нормально работает, а все остальные - тормозиловка. Движки хорошие, а вот карты к ним... Но вот софтварные тру3д движки немногие пишут, в отличие от очередного воль3д. Респект. И ещё я удивляюсь, что эта фильтрация текстур такая быстрая.
Каждый воксель может иметь только один цвет. Трёхмерные текстурированные кубы вокселями не являются. И тайлы вообще могут внутри себя иметь, например, наклонную стену, тогда такой тайл даже кубом не является.
sidav :
а по поводу дума - там в коде зачем-то ищут угол наклона SEG'а. зачем?
если угол наклона стены в координатном пространстве камеры меньше нуля (при использовании функции atan2(x, y)), то мы видим обратную сторону стены, и поэтому рисовать её вообще не надо. Хотя вроде как он для чего-то ещё нужен, не помню...