Графика
October 18, 2022

Новые свойства LocalAxisX,Y,Z и новые методы AnimMoveByLocal в модуле Graph3D

В версии PascalABC.NET 3.8.3.3189 от 18.10.22 в модуле Graph3D у графических объектов появились новые свойства и методы. Они предназначены для работы с трехмерными объектами в локальных координатах.

Перейти в официальный Телеграм-канал PascalABC.NET:
https://t.me/pascalabc_official

Свойства LocalAxisX, LocalAxisY, LocalAxisZ

Создадим комбинированный объект в виде параллелепипеда с двумя сферами-глазиками по бокам:

uses Graph3D;

begin
  var b := Box(0, 0, 0, 3, 1, 1);
  var s := Sphere(1, 0.5, 0, 0.4);
  var s1 := s.Clone.MoveByY(-1);
  b.AddChild(s);
  b.AddChild(s1);
end.

Результат запуска:

Можно заметить, что глазики имеют один цвет - это произошло потому что мы создавали второй глазик клонированием.

Обратим внимание, что направление взгляда объекта (от центра к глазикам) совпадает с осью OX.

Теперь повернем полученный объект на 45 градусов к нам и поднимем его "нос" на 30 градусов.

  b.Rotate(OrtZ, 45);
  b.Rotate(OrtY, -30);

Направление взгляда объекта поменялось. Однако у каждого объекта есть своя локальная система координат, оси которой направлены так же, как и в момент его создания. Так, локальная ось OX Local по-прежнему направлена вдоль направления взгляда объекта.

У каждого 3D-объекта появились новые свойства: LocalAxisX, LocalAxisY и LocalAxisZ, задающие оси объекта в локальной системе координат.

Изобразим стрелкой направление LocalAxisX:

var a := Arrow(Origin, b.LocalAxisX * 5);

Результат:

Теперь анимируем объект вдоль локальной оси OX на расстояние 10 за 2 секунды, воспользовавшись методом AnimMoveByLocal:

uses Graph3D;

begin
  var b := Box(0, 0, 0, 3, 1, 1);
  var s := Sphere(1, 0.5, 0, 0.4);
  var s1 := s.Clone.MoveByY(-1);
  b.AddChild(s);
  b.AddChild(s1);
  b.Rotate(OrtZ, 45);
  b.Rotate(OrtY, -30);
  var a := Arrow(Origin, b.LocalAxisX * 5);
  b.AnimMoveByLocal(OrtX * 10, 2).Begin;
end.

Результат после перемещения:

Заключение. В этой короткой статье мы продемонстрировали использование новых свойств трехмерных объектов LocalAxisX, LocalAxisY, LocalAxisZ и нового метода AnimMoveByLocal, позволяющего анимированно перемещаться в локальных координатах.