Atomic Destruction Group - RFront Help

RFRONT - motion editor for DarkBasic

(C) Дмитрий Корабельников 2004

Этот help недостаточно полный (как и сам редактор) но позволяет работать. Пытаясь разобраться в 3D, я подумал о том странном кошмаре, который творился в конце 80х с 2D графикой. (Он и сейчас такой) Вспомните Microsoft Basic (gwbasic, Quick Basic) с его "графическими режимами" SCREEN 1, SCREEN 2,... В Quick Basic был только 1 256цветный режим (320*200), остальные - CGA и EGA режимы, но кого сейчас обрадуют 16 цветов? Ни двойной буферизации, ни возможности сохранить или загрузить картинку, ни спрайтов, ничего. Те, кто владел 2D графикой, были в большом почете. Тогда и квесты были такими интересными ... Теперь существует множество стандартных форматов 2D картинок, множество библиотек для вывода их на экран (Осталось только их найти. Совет 1: См документацию Microsoft по 2D графике.) И тут я вдруг подумал: что если нынешняя "сверхсовременная" 3D графика - всего лишь наспех созданная система, далекая от настоящего 3D так же, как CGA был далек от современных true color дисплеев ? Может быть, формат .X - это тот же кривой, наспех созданный, занимающий много места (неупакованные байты) формат BMP, но только для 3D ? (Совет 2: См документацию по .BMP. См документацию по .X Что-то очень похожее, не правда ли? По уровню глупости) И тут я вдруг многое понял про 3D.

Предупреждение: Предлагаемый исходный код DBA работает только в DarkBasic Classic 1.13 (с поддержкой memblock и DLL) DarkBasic Pro имеет другой внутренний формат mesh. Команда CHANGE MESH в DBPro возможно работает с ошибками (например, исчезает текстура на объекте после CHANGE MESH) Пожалуйста, проверьте работу последних версий компилятора DBPro. Тем не менее, X файлы, созданные в RFront, грузятся в DBPro.

1] Выберите модель для анимации при помощи мыши. Не выбирайте *_m1.x ... *_m4.x файлы. Эти файлы создаются редактором при работе и не могут редактироваться повторно. Нажмите Enter или F5 для загрузки модели.

2] Появляется примерно такая картинка. Можно вращать камеру вокруг модели при помощи Del, End. Три прозрачные голубые плоскости можно двигать стрелками и PgUp, PgDn. Плоскости используются для определения координат в 3D. Первые 3 числа слева вверху - координата точки пересечения плоскостей.

3] Нажмите F7 для входа в режим настройки. Теперь можно настроить скелет модели. Выберите мышкой зеленые кубики и установите их при помощи клавиш 1-6. Если Вы не уверены, что куб стоит в правильном положении, просто разверните камеру, используя Del, End.

4] Так примерно выглядит скелет модели.

5] Используя стрелки поднимите горизонтальную плоскость слегка под уровень рук и зафиксируйте координату, нажав F2. Теперь поднимите плоскость чуть выше рук и нажмите F3. Сохраните законченный скелет клавишей F1. Вернитесь обратно в режим анимации, нажав F7.

6] Теперь выберите мышью любую точку вращения модели. Например, плечо. Вращайте клавишами 1-6.

7] Выберите другую точку вращения. Таким образом, можно создать любую форму. Но не крутите слишком сильно. Если выбрать центральную точку (живот), то удерживая клавишу Shift, можно вращать модель целиком. Можно также двигать модель вверх и вниз клавишами Q,W. Если Вы ошиблись, перезагрузите модель, нажав F5.

8] Предположим, Вы получили желаемую позу. Теперь можно созранить позу в 1 из 4 файлов по клавишам F1-F4. Например, для модели jenny.x сохраняются файлы jenny_m1.x, jenny_m2.x, jenny_m3.x, jenny_m4.x
Внимание! Файлы переписываются без предупреждения. Не забывайте переименовывать и сохранять в отдельном каталоге рабочие файлы, используя Total Commander. Теперь можно начать редактировать новую позу той же модели по F5 или загрузить другую модель по F6.

9] Смотрите пример twoants.dba чтобы понять, как можно из поз сделать анимацию. Сначала в код нужно включить некоторые функции:

Универсальный загрузчик (См _system.dba). Основной целью загрузчика является выдача сообщения об ошибке КАКОЙ ИМЕННО ФАЙЛ НЕ НАЙДЕН, если "file not found". Вы можете запретить эту проверку в финальной версии своей программы, например для компиляции в режиме "make final mode", используя переменную check.
function ld(fi$,n,m$)
f$=rootdir$(0)+fi$
check=(m$>"a")
t$=lower$(m$)
if check
if file exist(f$)=0 then ink 255,0:print f$;" - no file":sync:wait key:end
endif
if t$="i" then load image f$,n
if t$="m" then load music f$,n
if t$="s" then load sound f$,n
if t$="b" then load bitmap f$,n
if t$="x" then load object f$,n
if t$="e" then load mesh f$,n:
endfunction

Создать сглаженную анимацию из поз. Эта функция использует линейное приближение, поэтому не пытайтесь с помощью одного вызова разворачивать руку модели на 90 градусов. Используйте больше поз(не 2) для сложных анимаций. (См _flip.dba)
` Создать плавный набор анимаций mesh
` from_start,from_end - начальная и конечная фазы анимации (входные данные)
` new_start - начало нового набора (номер первой новой mesh)
` parts - число кадров анимации (число создаваемых mesh)
` Мемблоки 1-3 используются в процессе работы
function makeanim(from_start,from_end,new_start,parts)
make memblock from mesh 1,from_start
make memblock from mesh 2,from_start
make memblock from mesh 3,from_end
vert=memblock dword(1,0)
pvert=memblock dword(1,4)
norm=memblock dword(1,8)
pnorm=memblock dword(1,12)
m=new_start
for n=1 to parts
copy memblock 2,1,0,0,get memblock size(2)
p=pvert
for i=1 to vert*3
d#=(memblock float(3,p)-memblock float(2,p))/parts
write memblock float 1,p,memblock float(2,p)+(n*d#):p=p+4
next i
p=pnorm
for i=1 to norm*3
d#=(memblock float(3,p)-memblock float(2,p))/parts
write memblock float 1,p,memblock float(2,p)+(n*d#):p=p+4
next i
make mesh from memblock m,1:inc m
next n
delete memblock 1
delete memblock 2
delete memblock 3
endfunction

Теперь о том, как выглядит вызов этих функций в основной программе.
antmod0.x antmod1.x antmod2.x
Начало программы (Загрузка данных и создание набора анимаций)
#include "_system.dba"
#include "_flip.dba"
sync on
` Это определение переменной требуется для вызова функции ld(имя каталога данных)
dim rootdir$(0):rootdir$(0)="antsdata/"
` ...
` Загрузить текстуру
ld("ant.bmp",1,"i")
` Загрузить позы, например как mesh 100,101,102
ld("antmod0.x",100,"e")
ld("antmod1.x",101,"e")
ld("antmod2.x",102,"e")
` Создать анимацию как mesh 1 - 16
makeanim(100,101,1,8)
makeanim(101,102,9,8)
` Создать анимированные модели.
` Тут мы получаем текстурированные кубики размера 1
` Они пока не очень похожи на бегающих муравьев :).
for i=1 to 2
make object cube i,1
` Эта строка требуется, чтобы модели двигались лицом вперед
rotate object i,0,180,0:fix object pivot i
texture object i,1
next i

Теперь главная часть: основной цикл
do
` ...
` Здесь используется одна и та же анимация для моделей 1 и 2
` В хорошей программе код должен быть более сложным.
` Я постараюсь написать еще несколько примеров позже.
` Tick используется, для задания разумной анимации 25 FPS
` (вспомните, в начале программы стоит SYNC RATE 50)
tick=(tick+1)&0
if tick=0
` В каждом цикле мы меняем переменную fr от 1 до 16 и обратно от 16 до 1
` (вспомните, мы создали mesh 1-16 для анимации)
` (Flip-flop animation)
if fr=1 then dfr=1
if fr=16 then dfr=-1
fr=fr+dfr
` Здесь мы меняем mesh анимированных объектов
change mesh 1,0,fr
change mesh 2,0,fr
endif
`...
sync
loop

Еще один исходный код. Очень важной частью программы RFront является функция xsave, которая сохраняет модель в двоичном (не текстовом) .X формате. (Есть команда SAVE MESH в DarkBasicPro, но эта функция работает даже лучше). Посмотрите текст в _xsave.dba Эта функция имеет возможность не сохранять нормали, что делает .X файлы в 2 раза меньше без потери ценной информации.

Продолжение следует (Наверное). До свидания!