Для создания 3D движка (альтернатива устаревающему движку Xors3D) собирается команда энтузиастов.
Цели проекта:
+ Сделать движок не хуже Xors3D
+ Получить опыт в разработке
+ НЕ убийца КРИЗИСА и Unity !!!
+ Реализовать некоторые интересные идеи
Фичи проекта:
+ Платформа только РС
+ Движок в виде внешней DLL
+ Поддержка 3D Vision и Oculus Rift
+ Поддержка терраморфинга
+ Большие ландшафты
+ Наличие удобного редактора
Что есть на текущий момент:
+ Исходники на PowerBasic 10
+ Репозитрий GIT на bitbucket.org
+ Несколько демок (очень примитивных, чтобы выкладывать тут)
+ Материалы, примеры, гайды и. т.п. (как использовать lua.dll и.т.п.)
Движок (точнее его зачатки ) уже может:
+ Инициализировать DX9
+ Устанавливать видеорежим
+ Рендерить сцену
+ Реализованы некоторые примитивы: кубы, плоскости, треугольники.
+ VBO. Реализована загрузка моделей формата OBJ
+ Работа с камерой
+ Есть зачатки редактора мира на Xors3D - можно портировать на чистый DirectX
Лог разработки:
06.03.2014
- Исправлена глупая ошибка при стерео рендере - использовалась программная обработка вершин...
- Начальные эксперименты с шейдерами - загрузка, компиляция, установка.
04.03.2014
- Написан с нуля модуль для работы с HID-устройствами. Работает поиск трекера Oculus Rift на шине USB.
03.03.2014
- Портирован исходник для работы с видеокартами NVidia (nvapi.dll)
Скрины и демки:
Кто требуется в первую очередь:
- Человек, имеющий опыт в работе с шейдерами.
- Человек, имеющий опыт работы с физическими движками
а также все заинтересованные.
UPD: Нужность и целесообразность обсуждаем
тут
Пара скринов с репозитория:
Пример кода (метод загрузки модели формата OBJ, выдранный из класса):
'===============================================================================================================================
METHOD xLoadMeshFromOBJ(File AS STRING)
DIM buf AS STRING, FN AS LONG, FC AS LONG
DIM tc AS LONG, vc AS LONG, P(4) AS STRING, v() AS vertexType, vtu() AS SINGLE, vtv() AS SINGLE
DIM z(4) AS WORD, zp(4) AS STRING
IF ISFILE(File) THEN 'если файл найден
FN = FREEFILE
OPEN File FOR INPUT AS FN
WHILE NOT EOF(FN)
LINE INPUT #FN,buf
INCR FC
IF MID$(TRIM$(buf),1,1)<>"#" THEN
PARSE buf, p(), " " 'парсим строку в массив P()
SELECT CASE p(0)
CASE "mtllib": 'файл с материалами 'пока не нужно
CASE "o": 'новый подмеш (набор) subset 'если текстурный атлас - субмеши не нужны
CASE "v": 'координаты вертекса
REDIM PRESERVE v(vc)
v(vc).x=CSNG(VAL(p(1))) : v(vc).y=CSNG(VAL(p(2))) : v(vc).z=-CSNG(VAL(p(3)))
INCR vc
CASE "vt": 'координаты текстуры
REDIM PRESERVE vtu(tc), vtv(tc)
vtu(tc)=CSNG(VAL(P(1))) : vtv(tc)=1-CSNG(VAL(P(2)))
INCR tc
CASE "vn": 'нормали - пока не нужны
CASE "f": 'индексы стрипов или треугольников (делаем только треугольники!)
PARSE P(1), ZP(), "/"
Z(0)=CWRD(VAL(ZP(0))): Z(1)=CWRD(VAL(ZP(1))): Z(2)=CWRD(VAL(ZP(2))) ' (Z(0)-1) - индекс вертекса
me.AddVertex (v(Z(0)-1).x, v(Z(0)-1).y, v(Z(0)-1).z, vtu(Z(1)-1), vtv(Z(1)-1))
PARSE P(2), ZP(), "/"
Z(0)=CWRD(VAL(ZP(0))): Z(1)=CWRD(VAL(ZP(1))): Z(2)=CWRD(VAL(ZP(2))) ' (Z(0)-1) - индекс вертекса
me.AddVertex (v(Z(0)-1).x, v(Z(0)-1).y, v(Z(0)-1).z, vtu(Z(1)-1), vtv(Z(1)-1))
PARSE P(3), ZP(), "/"
Z(0)=CWRD(VAL(ZP(0))): Z(1)=CWRD(VAL(ZP(1))): Z(2)=CWRD(VAL(ZP(2))) ' (Z(0)-1) - индекс вертекса
me.AddVertex (v(Z(0)-1).x, v(Z(0)-1).y, v(Z(0)-1).z, vtu(Z(1)-1), vtv(Z(1)-1))
END SELECT
END IF
WEND
CLOSE FN
IF FC<5 THEN MSGBOX "Incorrect file - please convert it with MilkShape! (or convert from UNIX format!)"
ELSE 'файл не найден
MSGBOX "File not found: " & file
END IF
END METHOD
Как видите - очень простой пример процедуры загрузки формата OBJ...