Главная » Статьи » GLScene » Для новичков

Вставка моделей и их анимация
Вставка моделей и их анимация

Пример демонстрирует анимацию *.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 (загрузка модели и текстуры), но с анимацией я буду разбираться! =))

Источник: http://glscene.ru/content.php?article.15

Категория: Для новичков | Добавил: Samarik (18.06.2007) | Автор: Wanderer
Просмотров: 1930 | Комментарии: 3 | Рейтинг: 5.0/1
Всего комментариев: 3
3  
Думаю для изменения дистанции проще использовать вот етот код
В Uses поставить Math

procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
Camera1.AdjustDistanceToTarget(Power(1.1, WheelDelta / 120));
end;


2  
неплохо было бы сделать видео урок))

1  
Кулллл

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа
Категории раздела
Корзина
Ваша корзина пуста
Наш опрос
Что в гоночных играх самое важное?
Всего ответов: 262
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0