Блог Александра Божко
Архивы
Рубрики
Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

FireMonkey– новая библиотека классов, появившаяся в Delphi и C++ Builder XE2 – имеет два принципиальных отличия от привычной VCL.

Во-первых, она позволяет создавать кроссплатформенные приложения. Во вторых, кроме обычных «плоских» приложений FireMonkey позволяет создавать 3D приложения. Именно с рассмотрения последних, я и начну данный цикл.

newProj

Насколько я понял, единственным отличием FireMonkey 3D Application от FireMonkey HD Application заключается в том, что главная форма наследуется не от класса TForm из модуля FMX.Forms, а от класса TForm3D того же модуля. Я акцентирую внимание на модуле потому, что VCL класс TForm описан в модуле Forms. Использование точки в названии модуля не является аналогией пространства имен .Net. Просто в названии модуля теперь можно использовать точку.

Создадим новый проект FireMonkey 3D Application.  Главная форма проекта будет “трехмерной”. Если мы сейчас попытаемся “положить” на такую форму обычный элемент управления, например кнопку, то отображаться не будет. Тем не менее, в окне Structure мы сможем найти эту кнопку.  И в коде так же будет присутствовать строка

Button1: TButton;

Зато если мы разместим на форме любой компонент из  группы 3D  Shapes (пусть это будет плоскость TPlane), то он сразу же отобразиться на форме. Забегая наперед скажу,  что и «классические» двумерные контролы тоже вполне можно использовать в FireMonkey 3D приложениях. Но об этом чуть позже, а пока вернемся к плоскости.

Попытавшись подвигать только что созданную плоскость Plane1 по форме, можно заметить, что данный контрол не только меняет свое местоположение, но и особым образом видоизменяет форму. При этом создается полная иллюзия объемности. Если «зацепить» объект за специально выделенные точки, то можно менять его размер (ширину, высоту и глубину) и угол поворота в пространстве. Однако с помощью мышки правильно расположить объект довольно не просто. Подобно управлению в трехмерных компьютерных играх, тут нужна определенная сноровка.

Все становится значительно понятней, если разобраться с системой координат и тем, какое свойство объекта за что отвечает. 3D форма FireMonkey использует так называемую правую систему координат. Она образуется если большой палец правой руки принять за направление X, указательный за направление Y, а средний за направление Z. Положение объекта задается свойством Position, имеющим тип TPosition3D. В Object Inspector мы можем задавать значения Position.X, Position.Y и Position.Z. При нулевых значениях X, Y и Z объект находится в центре формы. Собственно, свойство Position задает положение центральной точки объекта.

Еще одним важным свойством объекта  является RotationAngle, также описанное как TPosition3D. Оно определяет угол поворота объекта относительно своего центра по каждой из осей.

Так же следует обратить вимание на свойство Parent.

property Parent: TFmxObject;

Как и следует из названия, это свойство определяет родительский объект данного объекта. Что это обозначает на практике? Добавим на форму еще один 3D объект, например сферу (TSphere). Сразу же перекрасим нашу сферу, дабы ее можно было легко увидеть на форме. Для этого свойству Sphere2.Material.Emissive присвоим значение  TAlphaColorRec.Red. Оба наши объекта, плоскость и сфера перемещаются по форме независимо друг от друга. Вы можете выделить их и перетаскивать мышью в любое положение на форме. Теперь попробуйте в окне Structure перетащить объект «Sphere1» на объект «Plane1». Во-первых, сфера при этом изменит свое положение на форме, а во вторых при перемещении плоскости сфера станет перемещаться вместе с ней. Иными словами теперь нулевой точкой для сферы будет не условный центр формы, а центр плоскости. Соответственно, координаты сферы и углы поворота будут отсчитываться от плоскости, а не от формы. Если вы вставите в обработчик события OnCreate формы примерно такую строчку
ShowMessage(Sphere1.Parent.Name);,
то при запуске программы увидите сообщение Plane1. Таким образом, мы изменили свойство Parent и «привязали» сферу к плоскости.

Structure1

Что бы полностью «сориентироваться в пространстве» и уяснить поведение 3D объектов FireMonkey, давайте напишем небольшое приложение. Но прежде вернемся к вопросу использования «классических» элементов управления в 3D приложениях. Вы еще не удалили кнопку? Поместите на форму компонент TLayer3D и сделайте parent для нашей кнопки (просто перетащите кнопку на этот компонент в окне Structure) .  Если вы все сделали правильно, то кнопка станет видимой в нашем трехмерном мире. А что бы избежать излишней экстравагантности для компонента TLayer3D измените значение свойства Projection на pjCamera. Теперь мы видим обычную двухмерную кнопку на такой же двухмерной панели.

Теперь создадим на форме 6 компонентов TSpinBox, компонент TLabel и компонент TComboBox.  Естественно, все они будут размещены на слое TLayer3D.

sbPosX: TSpinBox;
sbRotAZ: TSpinBox;
sbRotAY: TSpinBox;
sbPosZ: TSpinBox;
sbPosY: TSpinBox;
sbRotAX: TSpinBox;
ComboBox1: TComboBox;
Label1: TLabel;

firmonkey_app

Идея приложения довольно проста. Мы поместим список 3D объектов  в ComboBox и для выбранного объекта отобразим его координаты, угол поворота по каждой из осей, а заодно и укажем значение свойства Parent. Меняя с помощью SpinBox’ов координаты и углы, мы будем изменять непосредственно свойства выбранного объекта. Таким образом, мы наглядно сможем увидеть,  что от чего зависит и «почувствовать» трехмерную модель Firemonkey.
Код приложения тоже не сложный.

implementation

{$R *.fmx}

procedure TForm2.ComboBox1Change(Sender: TObject);
begin
try
 sbPosX.Value:=
 (ComboBox1.Items.Objects[ComboBox1.ItemIndex] as TControl3D).Position.X;
 sbPosY.Value:=
 (ComboBox1.Items.Objects[ComboBox1.ItemIndex] as TControl3D).Position.Y;
 sbPosZ.Value:=
 (ComboBox1.Items.Objects[ComboBox1.ItemIndex] as TControl3D).Position.Z;

 sbRotAX.Value:=
  (ComboBox1.Items.Objects[ComboBox1.ItemIndex] as TControl3D).RotationAngle.X;
 sbRotAY.Value:=
  (ComboBox1.Items.Objects[ComboBox1.ItemIndex] as TControl3D).RotationAngle.Y;
 sbRotAZ.Value:=
  (ComboBox1.Items.Objects[ComboBox1.ItemIndex] as TControl3D).RotationAngle.Z;
   Label1.Text:=
  (ComboBox1.Items.Objects[ComboBox1.ItemIndex] as TControl3D).Parent.Name;

finally

end;
end;

procedure TForm2.Form3DActivate(Sender: TObject);
var
i: integer;
begin
for I := 0 to Form2.ComponentCount-1 do
begin
  if Components[i].ClassType.InheritsFrom(TControl3D) then
  ComboBox1.Items.AddObject(Components[i].Name, TControl3D(Components[i]));

end;
 ComboBox1.ItemIndex:=0;
end;

procedure TForm2.Form3DCreate(Sender: TObject);
begin
ShowMessage(Sphere1.Parent.Name);
end;

procedure TForm2.sbPosXChange(Sender: TObject);
begin
(ComboBox1.Items.Objects[ComboBox1.ItemIndex] as TControl3D).Position.X := sbPosX.Value;
end;

procedure TForm2.sbPosYChange(Sender: TObject);
begin
(ComboBox1.Items.Objects[ComboBox1.ItemIndex] as TControl3D).Position.Y := sbPosY.Value;

end;

procedure TForm2.sbPosZChange(Sender: TObject);
begin
(ComboBox1.Items.Objects[ComboBox1.ItemIndex] as TControl3D).Position.Z := sbPosZ.Value;
end;

procedure TForm2.sbRotAXChange(Sender: TObject);
begin
 (ComboBox1.Items.Objects[ComboBox1.ItemIndex] as TControl3D).RotationAngle.X := sbRotAX.Value;
end;

procedure TForm2.sbRotAYChange(Sender: TObject);
begin
(ComboBox1.Items.Objects[ComboBox1.ItemIndex] as TControl3D).RotationAngle.Y := sbRotAY.Value;
end;

procedure TForm2.sbRotAZChange(Sender: TObject);
begin
(ComboBox1.Items.Objects[ComboBox1.ItemIndex] as TControl3D).RotationAngle.Z := sbRotAZ.Value;
end;

end.

Если честно, я делаю подобный набросок для форм с большим количеством объектов, что бы увязать их в пространстве. При этом я наблюдаю за объектами с разных камер. Но о камерах и освещении в следующей части.

Скачать исходный код.

Много новой и интересной информации по FireMonkey вы сможете получить, приняв участие в бесплатной многодневной технической  конференции CodeRage 6.

CodeRage 6

CodeRage 6

Другие статьи серии:

Firemonkey на практике #1
Firemonkey на практике #2. Освещение и материал поверхности 3D объектов
Firemonkey на практике #2. Движение 3D объектов
Firemonkey на практике #3. Использование 3D моделей
Firemonkey на практике #4. Ты попал!
Firemonkey на практике #5.


Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Продукты DevArt
Купить онлайн:



Читай русскоязычные Delphi блоги
Каталог блогов Blogdir.ru
Яндекс.Метрика