Вставка моделей и их анимация
Пример демонстрирует анимацию *.smd и *.md2 моделей
Поместим на форму GLScene, GLSceneViewer, GLCadencer, GLMaterialLibrary. Cоздадим камеру, источник света, dummyCube, двух актёров (Mesh Objects => Actor), сетку (Special Objects => XYZGird) и 4 кнопки (Бег, Смерть, *.smd, *.md2) и один CheckBox. Камеру направим на DummyCube1, а Актёра2 (Actor2) опустим (так как размеры его модели немного меньше чем размеры модели Актёра1 и его ноги не достают до сетки): y = -6. И не забудем сделать видными текстуры Actor2 => Material => Texture => Disabled = False .
Дальше начинаем кодить, при создании формы задаём исходную папку (оттуда будем брать текстуры, модели…):
SetCurrentDir(ExtractFilePath(Application.ExeName)+'Media');
Далее загружаем модели, анимацию и текстуры для Актёров, включаем видимость скелетной анимации, а так же делаем невидимым второго Актёра и выключаем кнопку SMD(*.smd) :
procedure TForm1.FormCreate(Sender: TObject); begin SetCurrentDir(ExtractFilePath(Application.ExeName)+'Media'); Actor1.LoadFromFile('GSG9.smd'); Actor1.AddDataFromFile('run.smd'); Actor1.AddDataFromFile('death1.smd'); Actor1.Animations[1].MakeSkeletalTranslationStatic; Actor1.OverlaySkeleton:=True; baseAnimation:='run'; Actor1.SwitchToAnimation(baseAnimation); Actor2.LoadFromFile('waste.md2'); Actor2.Material.Texture.Image.LoadFromFile('waste.jpg'); Actor2.Animations.LoadFromFile('Quake2Animations.aaf'); SMD.Enabled := False; Actor2.Visible := False; end;
baseAnimation – начальная анимация (её актёры будут исполнят сразу после появления); Для Актёра2 (Actor2) мы используем модель формата *.md2 и вся её анимация хранится в одном файле (в нашем случае в Quake2Animations.aaf ), а для формата *.smd приходится загружать анимацию отдельно. Текстуры первому Актёру(Actor1) мы не задали поскольку текстура (у формата *.smd находится автоматически если создана MaterialLibrary). Далее при нажатии на кнопку “Бег” Актёр должен бежать (проигрываться анимация):
procedure TForm1.BegClick(Sender: TObject); begin Actor1.SwitchToAnimation(1, True); Actor2.SwitchToAnimation ('run', True); Actor2.AnimationMode:=aamLoop; end;
А при нажатии на кнопку “Смерть” Актёр должен умирать:
procedure TForm1.SMERTClick(Sender: TObject); begin Actor1.SwitchToAnimation(2, True); Actor2.SwitchToAnimation ('death1', True); Actor2.AnimationMode:=aamLoop; end;
При нажатии на ЧекБокс должен быть виден скелет модели (только у *.smd):
procedure TForm1.CheckBox1Click(Sender: TObject); begin Actor1.OverlaySkeleton:=CheckBox1.Checked; end;
Ну и старый способ вращения вокруг нашего Актёра:
procedure TForm1.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin mx:=x; my:=y; end; procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if Shift<>[] then begin GLCamera1.MoveAroundTarget(my-y, mx-x); mx:=x; my:=y; end; end;
Не забудем про смену формата моделей Актёров:
procedure TForm1.SMDClick(Sender: TObject); begin Actor1.Visible := True; MD2.Enabled := True; CheckBox1.Enabled := True; Actor2.Visible := False; SMD.Enabled := False; end;
procedure TForm1.MD2Click(Sender: TObject); begin Actor2.Visible := True; Actor1.Visible := False; CheckBox1.Enabled := False; SMD.Enabled := True; MD2.Enabled := False end;
И новый способ приближения камеры к Актёру(если на мышке есть калёсик):
procedure TForm1.FormMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); begin if GLCamera1.Position.X > 0 then GLCamera1.Position.X :=GLCamera1.Position.X - 0.5; if GLCamera1.Position.X < 0 then GLCamera1.Position.X :=GLCamera1.Position.X + 0.5; end;
procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); begin if GLCamera1.Position.X < 0 then GLCamera1.Position.X :=GLCamera1.Position.X - 0.5; if GLCamera1.Position.X > 0 then GLCamera1.Position.X :=GLCamera1.Position.X + 0.5; end;
Что касается формата *.3ds то он вставляется аналогично формату *.md2 (загрузка модели и текстуры), но с анимацией я буду разбираться! =))
|