Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
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 (загрузка модели и текстуры), но с анимацией я буду разбираться! =))

Вот Готовый пример.

Проект Delphi World © Выпуск 2002 - 2024
Автор проекта: USU Software
Вы можете выкупить этот проект.