sidav Recruit
| 2 |
Doom Rate: 2
|
Отправлено: 03.01.13 12:07:54 | |
| Я вот решил освоить рендеринг этой великой игры. До этого понял весь движок Вольфенштейна 3д, но в случае с думом всё куда интереснее. И у меня несколько вопросов к думерам, разбирающимся и в технической части игры (заодно и узнаем, много ли их тут на форуме, хехе).
В инете много где пишут, что в Думе, мол, используется рейкастинг. По-моему, это не так, хотя я, может, и не прав. Раасскажите, каким образом в игре отрисовываются SEGS (и, соответственно, SIDEDEFS) , если они на карте заданы по сути только точками ? Если всё-таки используется рейкастинг, то как происходит трассировка лучей до такой линии?
P.S. исходники, конечно, смотрел, но несмотря на то что Кармак пишет вполне чисто и красиво, не понял. | |
|
Korshun - Corporal -
| 168 |
Doom Rate: 3.43
|
Отправлено: 10.01.13 21:11:19 | |
| Дум является 2.5D движком, но не рейкастером. А пишут про рейкастинг в думе... Да это просто так после вольф3д повелось, что 2.5Д = рейкастинг, хотя это не так. Билд тоже рейкастером называют, и сам создатель движка это опровергает.
SEGS отрисовываются достаточно просто, я даже свою недорисовалку делал.
1) Передвигаем две точки чтобы камера была в начале координат.
2) Проецируем вершины на экран, учитывая горизонтальный FOV. (ну то есть screen_x = 0.5 * screen_width * (1 + atan2(x, y) / (0.5 * fov)) );
3) Находим расстояния от плоскости камеры до вершин. (тут у меня мой недорендерер заглючил при рисовании стен за пределами экрана. Уверен, что дум как-то ограничивает вершины по fov)
4) Рисуем серию столбцов на экране между двумя спроецированными вершинами, линейно интерполируя все параметры, зависящие от дальности (высота столбца стены, масштаб столбца текстуры, етц).
И если ещё не читал, то обязательно читать:
http://doomwiki.org/wiki/Doom_rendering_engine
и
http://fabiensanglard.net/doomIphone/doomClassicRenderer.php
Хотя я сам там многого не понял в деталях. Особенно то, как правильно рисовать виспланы поверх остального. :/
EDIT: формулу проекции написал неправильную. | |
|