Показать сообщение отдельно
Старый 25.02.2014, 06:36   #1
bugway
ПроЭктировщик
 
Аватар для bugway
 
Регистрация: 19.03.2012
Адрес: Забайкальский край
Сообщений: 112
Написано 15 полезных сообщений
(для 23 пользователей)
Пишем 3D движок - замену Xors3D

Для создания 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)



Скрины и демки:




Одна из первых демок:

FirstDemo.rar



Кто требуется в первую очередь:

- Человек, имеющий опыт в работе с шейдерами.
- Человек, имеющий опыт работы с физическими движками

а также все заинтересованные.

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...

Последний раз редактировалось bugway, 05.03.2014 в 19:46.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо bugway за это полезное сообщение:
DStalk (25.02.2014), L.D.M.T. (25.02.2014), Randomize (25.02.2014)