GLScene - Вставка моделей и их анимация
Автор: Daddy
WEB-сайт: http://daddy.mirgames.ru
Поместим на форму 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 (загрузка модели и текстуры), но с анимацией я буду разбираться! =))
Вот Готовый пример.
|