Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Проекты > Проекты C++

Ответ
 
Опции темы
Старый 20.09.2013, 22:13   #1
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 978
Написано 388 полезных сообщений
(для 631 пользователей)
raycasting

Давно пробовал делать рейкастинг как в wolf3d, ну и посмотреть, можно ли как нибудь развить эту тему, но потом как то забросил.
Решил выложить, может кому интересно будет, хотя похожих тем немало есть в инете.
В архиве демка и сурцы (ссылка ниже).
Раз это рейкастинг, то весь рендер софтварный, а sdl используется только чтобы готовое изображение вывести на экран (ну еще управление в демке через него).
Написано на С++03, писал давно - С++11 еще небыло... ну и в целом коды там кривые... Если изменить несколько параметров, можно под линух собрать.
Вобщем если кого заинтересует, можно вернуться к разработке, переписать коды нормально и т. п.

maze.zip | maze.rar (20.09.13)
maze_2.zip | maze_2.rar (22.09.13)
maze_3.zip | maze_3.rar (25.09.13, без бинарников)
maze_4.rar (28.09.13)

Последний раз редактировалось Samodelkin, 28.09.2013 в 17:31.
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо Samodelkin за это полезное сообщение:
alko (21.12.2013), Arton (20.09.2013), is.SarCasm (27.09.2013), mr.DIMAS (21.09.2013)
Старый 20.09.2013, 22:55   #2
Arton
Быдлокодер
 
Аватар для Arton
 
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,018
Написано 2,312 полезных сообщений
(для 5,349 пользователей)
Ответ: raycasting

Сообщение от Samodelkin Посмотреть сообщение
Вобщем если кого заинтересует, можно вернуться к разработке...
Уже жду
(Offline)
 
Ответить с цитированием
Старый 22.09.2013, 03:19   #3
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 978
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: raycasting

Обнова: raycasting_2

* Немного поправил код: теперь можно в сурцах задавать больше вариантов разрешения. В архиве есть ЕХЕ с 640х480 и 800х600 (окно и полный экран).
* Добавил код компенсирующий эффект fish eye, свойственный для рейкастинга.
* Немного устранил искажения aspect ratio при некоторых разрешениях, но небольшие всеравно есть. Связано это с тем, что алгоритм был основан на целых числах с фиксированным разрешением 320х240 и значения подобраны таким образом чтобы не происходили округления. Но с другими разрешениями появляются искажения, поэтому я частично перевожу на float (тем более что потом всеравно все это на gpu логично будет перенести).
* Еще всяческие изменения в коде сделал, но он пока по прежнему плохо структурирован.
* Самая медленная часть кода - софтварная выборка текстуры, там надо ускорять сильно, может быть для начала попробовать SSE, хотя я не уверен что вообще системная память хорошо умеет делать выборку как видеопамять.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Samodelkin за это полезное сообщение:
LLI.T.A.L.K.E.R. (22.09.2013), mr.DIMAS (25.09.2013)
Старый 25.09.2013, 10:57   #4
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Ответ: raycasting

Я чего-то непонимаю? Зачем с собой темплейты таскать такие длинные?
__________________

(Offline)
 
Ответить с цитированием
Старый 25.09.2013, 16:18   #5
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 978
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: raycasting

Я чего-то непонимаю? Зачем с собой темплейты таскать такие длинные?
Ты про то что шаблоны большие или сам факт записи нечитабельный? =)
Я предупреждал что код кривой.
Там по сути половина параметров шаблона вообще не нужно. Я их уже сокращаю. Даже если там останется много параметров то класс лучше инициализировать через дескриптор, тогда и читаемость кода лучше будет.
Вобщем буду править.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
mr.DIMAS (25.09.2013)
Старый 25.09.2013, 23:32   #6
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Ответ: raycasting

Ясно, а так интересный код. Просто до сих пор не удосужился поглядеть код Wolfenstein'a, а тут как раз рейкаст.
__________________

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Samodelkin (26.09.2013)
Старый 26.09.2013, 00:24   #7
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 978
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: raycasting

Обновил код - ссылка в первом посте.
Визуально ничего не изменилось, так что добавлять приложение не стал.

Я посмотрел на шаблоны классов FrameBuffer и rc2d и там небыло ни одного параметра типа. Значит классы не такие уж гибкие и шаблоны им особо не нужны. Я заменил шаблоны на дескрипторы. Также добавил кое что из с++11: конструкторы переноса для классов FrameBuffer и rc2d весьма полезны будут, местами синтаксис и формат подправил. Обернул двумерный массив maze в класс Maze, чтобы сократить число аргументов в некоторых методах.
(Offline)
 
Ответить с цитированием
Старый 26.09.2013, 09:35   #8
is.SarCasm
Бывалый
 
Аватар для is.SarCasm
 
Регистрация: 17.05.2009
Адрес: Днепропетровск
Сообщений: 672
Написано 180 полезных сообщений
(для 428 пользователей)
Ответ: raycasting

Мой винрар не распаковывает твои архивы (Неизвестный метод). У меня стоит последняя версия
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Samodelkin (26.09.2013)
Старый 26.09.2013, 15:43   #9
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 978
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: raycasting

Мой винрар не распаковывает твои архивы (Неизвестный метод). У меня стоит последняя версия
Это который 5.00 beta чтоли?

WinRAR 4.20 вроде нормально открывает.
Я паковал с помощью PeaZip в стандартном zip формате.
На всякий случай продублировал все в rar ( ссылки в первом посте ).
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
is.SarCasm (27.09.2013)
Старый 27.09.2013, 10:47   #10
is.SarCasm
Бывалый
 
Аватар для is.SarCasm
 
Регистрация: 17.05.2009
Адрес: Днепропетровск
Сообщений: 672
Написано 180 полезных сообщений
(для 428 пользователей)
Ответ: raycasting

Samodelkin, теперь всё отлично, спасибо. Буду следить)
(Offline)
 
Ответить с цитированием
Старый 28.09.2013, 17:51   #11
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 978
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: raycasting

Добавил редактор (скорей это чит) - теперь можно добавлять/удалять блоки (из которых состоят стены) прямо из игры.
Если смотреть на карту сверху:
U - верхний левый;
I - верхний;
O - верхний правый;
L - справа;
> - нижний правый;
< - нижний;
M - нижний левый;
J - слева;
Угол поворота самой камеры никак не влияет на это.

Перенес управление со стрелок на WSAD. Чуть попозже может быть добавлю мышь и стрейфы.

Карту вынес в отдельный класс (maze.hpp, maze.cpp).

Сделал каркас класса Player, но пока еще не заполнил его кодом.

Убрал переопределия целочисленных типов - они там не нужны. Теперь в коде стандартные типы из cstdint.

Добавил многопоточность. Она работает на уровне кастинга лучей (тест на пересечение с объектами) и на уровне заполнения фреймбуфера (софтварного), буфер делится на области, с каждой работает отдельный поток.
В C++11 есть удобный класс std::thread, но в mingw 4.7.2 он не работает (в mingw вообще я смотрю много проблем). Boost решил не использовать - он слишком большой для такого маленького проекта (нарушается равновесие дзен). Поэтому воспользовался WinAPI CreateThread: там всего около 20 строчек кода, которые можно макросами обвести для компиляции в другой ос, и использовать уже там например std::thread.

Ссылки все в первом посте.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
mr.DIMAS (29.09.2013)
Старый 29.09.2013, 03:44   #12
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Ответ: raycasting

Визуально ничего не изменилось. Скорость рендера возросла.

Среднее значение

maze_2 : 42

maze_4 : 63

Процессор 4 ядра по 3,2 ГГЦ

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

Код поглядел. Стал лучше.

Вообще проект у тебя интересный. Слежу.
__________________

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Samodelkin (29.09.2013)
Старый 30.09.2013, 22:35   #13
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 978
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: raycasting

Неудобно что правка первого поста ограничена 10 днями... Туда удобно было добавлять новый материал чтобы все в одном месте было.

Raycasting прогрессирует!



>>> maze_5.rar <<<

Подправил многопоточность: на моем пк +20 fps прирост.

Добавил текстуры. Вообще они там и так были, но небыло загрузчика для них. Я написал свой для bmp. Свой писал потому что мне нужен был определенный контроль при переводе из DIP в DDB формат, так как есть определенные особенности рендера. Загрузчик пока читает bmp с заголовком в 54 байта (те что стандартные из пеинта вобщем), остальные варианты если нужны будут потом добавлю. Фильтр для текстуры пока nearest, чуть позже попробую bilinear - есть вероятность что в софтваре уже не потянет.

Сделал разрешение 1280х720 и ограниение в 30 fps, чтобы фреймрейт не скакал. Для софварного рендера это очень даже неплохо имхо, тем более что дальше графика еще будет нагружаться.

Сделал чуток плавней управление.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Samodelkin за это полезное сообщение:
Arton (30.09.2013), mr.DIMAS (01.10.2013)
Старый 01.10.2013, 00:13   #14
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Ответ: raycasting

Скорость рендера стабильная, и практически не зависит от размера текстуры - я уменьшил размер текстуры в 2 раза и FPS все равно 31. Что круто.

Двигаясь вплотную по стенке вызел баг. Второй раз пошел по тому же самому месту - баг не вылез. Скрин в аттаче.
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок.JPG
Просмотров: 1018
Размер:	26.6 Кб
ID:	19735  
__________________

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Samodelkin (01.10.2013)
Старый 01.10.2013, 20:48   #15
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 978
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: raycasting

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

Кстати странная вещь - в mingw 4.7.2 неработают атрибуты:
struct A { char a; char b; ... } __attribute__( __aligned( 1 ) );
struct B { char a; char b; ... } __attribute__( __packed__ );
Эти структуры будут по прежнему выравниваться по 4 байта...
Пришлось сделать так:
#pragma pack( push, 1 )
struct C { char a; char b; ... };
#pragma pack( pop )
Хотя вроде раньше на более старых версиях mingw атрибуты вроде бы работали, я помню ими пользовался когда-то.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 06:17.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com