Сделать стартовой    

 
Welcome to www.kupper-hip.narod.ru 1
  1
1
navigation
Статистика

footer
Статья по GLScene №1.
 GLScene - Первые шаги
 Учебник научит Вас основам работы в программе GLScene. Вы познакомитесь с интерфейсом и основными командами программы. А в конце Вы на практике реализуете свои знания при написании простеёшего космического симулятора.

 Нашим первым шагом будет создание простого кубика, звучит не так страшно =). Поместим на форму два объекта: GLScene и GLSceneViewer. GLScene - инспектор объектов нашей сцены. GLSceneViewer - окно в котором отображается наша сцена. Двойным щелчком левой кнопки мыши на GLScene1 входим в инспектор объектов и создадим простой объект Cube (Scene objects => Add object => Basic geometry => Cube ).

 Далее создадим камеру (Cameras => Add camera) и источник света (Scene objects => Add object => LightSource). Теперь в GLSceneViewer1 в разделе Camera выбираем GLCamera1. Займёмся настройкой камеры: Выбрав GLCamera1 в Object Inspector'е находим раздел TargetObject и выбираем Cube1. А теперь поменяем координаты камеры (т.к. всем объектам в момент создания задаются одинаковые координаты и наша камера просто не увидит кубик) в разделе Position устанавливаем x = 1, y = 1 , x = 1 (писать без знака равно естественно).

 Теперь немного программного кода:

 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;

И в разделе public не забудьте объявить переменные mx и my:

Public
mx, my : Integer;

Теперь с помощью мышки мы можем вращать камеру вокруг куба.

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

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

GLScene: Примитивное движение

Исходить будем из статьи GLScene первые шаги.

Для движения нам понадобится GLCadencer (поместите на форму). Теперь от вас необходимо только писать:

Cube1.Turn(deltaTime*X) - Вращение объекта (в нашем случае куба), где X скорость вращения.
Cube1.Roll(deltaTime*X) - Вращение(качение) объекта, трудно объяснить словами лучше один раз увидеть.
procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: Double);
begin
Cube1.Turn(deltaTime*10);
end;

или

procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: Double);
begin
Cube1.Roll(deltaTime*10);
end;

Не забудьте в Object Inspector'е в разделе Scene выбрать GLScene1.


Это только первая статья из цикла "Движение". Так как в этой статье описывается только вращение объектов.

GLScene: Текстуры

В этой статье мы научимся налеплять текстуры на наши объекты. Исходить будем из статьи GLScene первые шаги. Во-первых можно изменять цвет объекта без использования текстур.


В Object Inspector'е выбрав раздел Material нажимаем на троеточие.


В появившемся окне Material Editor можно менять цвет объекта. При запуске приложения будет заметно что световые эффекты остались, но при использовании текстуры световых эффектов не будет видно (затемнение и т.д.). Чтобы они стали видны TextureMode надо указать в tmModulate.

Чтобы наложить текстуру на объект необходимо в Material Editor'е выбрать раздел Texture.


И опять нажав на троеточие указать путь к текстуре (ВНИМАНИЕ!!! Текстура должна быть формата *.BMP иначе при использовании других форматов текстура не будет отображаться. Чтобы использовать текстуры других форматов, необходимо подключить соответствующие модули в раздел USES. Например JPEG, для *.jpg).

И не забудьте убрать галочку Disable, чтобы текстуру было видно.

GLScene: Спецэффекты (Огонь)

Поместим на форму GLScene, GLSceneViewer, GLCadencer, GLFireFXManager.


Теперь создадим камеру, две сферы (с источником света внутри) и один кубик. Поставим сферы по правому и левому краям от квадрата, одной сфере задаём х = 3, а другой х = -3. Поменяем цвета света GLLightSource1 и GLLigthSource2 выбрав в Object Inspector'е раздел Diffuse = clrOrange у одного и у другого. Теперь создадим сам огонь: У Sphere1 в Object Inspector'е выбираем раздел Effects и нажимаем троеточие, появится окно Sphere1.Xcollection.

Далее нажимаем на + и добавляем FireFX ( в Object Inspector'е в разделе Manager выбираем FireFXManager1) тоже самое проделываем с Sphere2.


Настроим GLFireFXManager1.

Задаём ему:

Cadencer = GLCadencer1
FireBurst = 1
FireDensity = 0,5
FireRadius = 0,5
MaxParticles = 96
OuterColor = clrOrange
ParticleInterval = 0,01
ParticleSize = 0,7

При желании можете поменять направление огня:

Находим в Object Inspector'е раздел FireDir, нажимаем троеточие и в появившемся меню меняем координаты x, y, z.

Далее переходим к кубику. Заставим его вращаться (см. статью "Примитивное движение") добавив в код нашей программы следующие строчки:

procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: Double);
begin
Cube1.Turn(deltaTime*10);
Cube1.Roll(deltaTime*10);
end;

Запускаем программу. Теперь мы можем наблюдать две горящие сферы и вращающийся кубик между ними.

 

 

Партнёры

 

 

Наш баннер
  • Если вы хотите поставить мою кнопочку на свой сайт:
  • footer
    Design by KuPPeR
    Hosted by uCoz