Разработка PaintCAD 4Windows - 3D редактор Hippo
В меню Экстра есть несколько заблокированных заготовок на будущее. Одна из них - 3D редактор Hippo.
Сначала для этого редактора писался софтверный 3d движок, рисующий в трехмерном пространстве точки, линии, треугольники, с каркасным отображением а ля wireframe. Классно, конечно, но в Windows есть встроенные движки OpenGL и DirectX для отрисовки 3D, с освещением, текстурами и т.д.
Почитав старые сайты про OpenGL 1.0 (без шейдеров) в Delphi 7 удалось прикрутить к паинткаду встроенный в Delphi 7 модуль opengl без каких-либо сторонних движков. Переписав софтверный движок 3D редактора в управление этим старым OpenGL удалось заставить его работать +)
Тестовая отдельная прога (для проверки как работает этот самый дельфийский opengl 1.0) с текстурированием кубика картинкой из файла нормально так его рисует:
Интерфейс программирования Hippo скопирован с встроенного в PaintCAD 4Windows звукового редактора Qmpot (даже кнопка Ввод нот осталась, позже трансформируется в одну из функций). В 3D редакторе Hippo будет как в Qmpot модуль для программирования 3D моделей с самого низшего уровня - от точек и треугольников до объектов.
Будет примерно что-то типа такого как в коде ниже:
- создаем новую сцену (командой N),
- красим фон (BC),
- создаем камеру (C) и устанавливаем ее активной (SC),
- ставим в сцене до 8 источников света (здесь 4 источника света) через L - позиция источника света c регулируемым w-параметром (направленный свет из бесконечности w = 0, свет вблизи (точечный) w=1 или что-то промежуточное), цвета источника света фоновый (LCA), диффузного рассеяния (LCD) и цвет бликов (LCS),
- включаем источники света через команду LS,
- а дальше создаем объекты - в этом примере это восемь точек-углов кубика по команде D номер точки, x, y, z (от слова dot - точка), из них собираем 12 треугольников по команде T номер треугольника, точка1, точка2, точка3 (от слова triangle - треугольник, по 2 треугольника на сторону кубика), а из треугольников собираем объект через команду 0 номер объекта, все номера треугольников через запятую (от слова object - объект). Можно собрать и что-то другое, засунув, таким образом, все треугольники этого чего-то в объект.
Код кубика с 4 источниками света вокруг него:
//введите сюда HIP-команды
N
BC 48,111,160
C 1,0,0,5,0,0,0,0,0
SC 1
L 1,-5,0,-5,0
LCA 1,0,0,0,255
LCD 1,255,0,0,255
LCS 1,255,255,255,255
L 2,-5,0,5,0
LCA 2,0,0,0,255
LCD 2,0,255,0,255
LCS 2,255,255,255,255
L 3,5,0,5,0
LCA 3,0,0,0,255
LCD 3,0,0,255,255
LCS 3,255,255,255,255
L 4,5,0,-5,0
LCA 4,0,0,0,255
LCD 4,128,128,0,255
LCS 4,255,255,255,255
LS 1,1
LS 2,1
LS 3,1
LS 4,1
D 1,-1,-1,1
D 2,-1,-1,-1
D 3,-1,1,-1
D 4,-1,1,1
D 5,1,-1,1
D 6,1,-1,-1
D 7,1,1,-1
D 8,1,1,1
T 1,1,2,3
T 2,1,3,4
T 3,4,3,7
T 4,4,7,8
T 5,8,7,6
T 6,8,6,5
T 7,5,6,2
T 8,5,2,1
T 9,6,7,3
T 10,6,3,2
T 11,8,5,1
T 12,8,1,4
O 1,1,2,3,4,5,6,7,8,9,10,11,12
X
Код рисует вот такой кубик (вообще-то камера смотрит на кубик спереди из точки x=0,y=0,z=5 в точку x=0,y=0,z=0, был после построения скриптом докручен мышкой до ракурса с видом с угла):
Будет масса и других команд на автоматизированное создание более сложных объектов - параллелепипеды, сферы, цилиндры, плоскости и т.д. и управление их точками, установкой опорной точки, раскрашивание цветами и/или текстурирование из внешних файлов с изображениями, копирование объектов, расположение объекта в 3D-пространстве, поворот, масштабирование и различные трансформации объекта относительно опорной точки, управление пространственным курсором (как конкретное "установить курсор в точку x,y,z", так и относительное "сдвинуть курсор на x,y,z относительно текущего положения"), помещение объекта в место расположения курсора, экспорт рисунка из paintcad в скрипт для 3D редактора Hippo, рисующий этот самый рисунок вокселями в 3D-пространстве), загрузка объектов из внешних файлов моделей, сохранение получившейся сцены в модель (как минимум в obj-формате, описывающим как раз точки (вершины), треугольники, нормали, расположения координат текстур на вершинах), рендер нескольких кадров для создания 3D-анимации. Как в Qmpot сделан вызов подпрограмм (через команды CALL имя_строки и RET).
Также планируется реализовать рисование подобно пиксельному как в паинткаде, но оно будет уже воксельное 3D-курсором и в 3D-пространстве. Получится такой мини-3D-паинткад.
Самое простое применение - отрендеренную сцену можно командой в скрипте или просто мышкой покрутить для нужного ракурса и экспортировать в паинткад в виде картинки, получится настоящее рисование в 3D (с дорисовкой в паинткаде если нужно). Посложней применение - создание 3D-моделек и сцен.
В перспективе таким редактором можно будет рисовать модели для MMORPG Basis (
viewtopic.php?t=616)или для других 3D-игр вместо сторонних редакторов =)
Продолжение следует...