Автоматически синхронизируемая анимация 3D-объектов

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

Для плавного перемещения объекта служит метод moveByTime, принимающий в качестве первого аргумента начальную позицию (Position3D), с которой должно начаться движение (или null, если движение должно начаться из текущей позиции), 2-ым аргументом конечную позицию, а 3-им аргументом время, за которое должен переместиться 3D-объект.

var obj1 = scene.getObjectByName("cube");
obj1.onPress = function()
{ 
  var pos = new Position3D(65000, 25000, 300);
  this.moveByTime(null, pos, 1000);   //переместили объект в pos за 1 секунду 
}

Для циклического перемещения объекта между двумя точками нужно вызвать метод cycleMove, первыми двумя аргументами получающий начальную и конечную позицию (Position3D) движения, третий аргумент – время перемещения между точками в миллисекундах.

var obj1 = scene.getObjectByName("cube");
obj1.onPress = function()
{ 
  var startP = new Position3D(65000, 25000, 300);
  var endP = new Position3D(60000, 23000, 250);
  this.cycleMove(startP, endP, 2000);   
}

3D-объекту можно задать путь перемещения по ломаной линии из произвольного числа точек с помощью метода sequenceMove. 1-ый аргумент задает позиции (Position3D) точек, по которым будет двигаться объект, второй аргумент – массив чисел, задающий время перемещения между двумя соседними точками в миллисекундах (1-ый элемент – между 1 и 2 точкой, 2-ой – между 2 и 3 и т.д). Размерность массива временных задержек на 1 меньше размерности массива координат перемещения.

var obj1 = scene.getObjectByName("cube");
obj1.onPress = function()
{ 
  var pos1 = new Position3D(61866, 23500, 360);
  var pos2 = new Position3D(61500, 23866, 360);
  var pos3 = new Position3D(61000, 24000, 360);
  var positions = new Array(pos1, pos2, pos3, pos1);
  var delays = new Array(500, 1000, 750);
  this.sequenceMove(positions, delays);
}

Плавный поворот и масштабирование получаются применением соответственно функций rotateByTime и scaleByTime, принимающих первым аргументом нужный поворот (Rotation3D) или масштаб (Scale3D), а вторым аргументом время в миллисекундах, за которое должно произойти действие.

var obj1 = scene.getObjectByName("cube");
obj1.onPress = function()
{ 
  var rot = new Rotation3D(0, 0, 0, 90);
 this.rotateByTime(rot, 1000);   //повернули объект на 90 град. за 1 секунду 
}

По аналогии с циклическим перемещением объект может циклически поворачиваться или изменять масштаб, для этого есть методы cycleRotate и cycleScale, первым аргументом принимающие начальный поворот/масштаб, вторым аргументом конечный поворот/масштаб, третьим аргументом время совершения 1 полуцикла в миллисекундах.

var obj1 = scene.getObjectByName("cube1");
var obj2 = scene.getObjectByName("cube2");

obj1.onPress = function()
{ 
  var startR = new Rotation3D(0, 0, 0, 90);
  var endR = new Rotation3D(0, 0, 0, 180);
  this.cycleRotate(startR, endR, 1000);   
}
obj2.onPress = function()
{ 
  var startS = new Scale3D(3, 3, 3);
  var endS = new Scale3D(1, 1, 1);
  this.cycleScale(startS, endS, 2000);  
}

Для немедленной остановки текущего перемещения/поворота/масштабирования необходимо использовать методы 3D-объекта stopMove(), stopRotate() или stopScale() соответственно. В следующем примере по нажатию на второй объект первый перестает циклически изменять свои размеры.

var obj1 = scene.getObjectByName("cubeScale");
obj1.onPress = function()
{ 
  var startS = new Scale3D(3, 3, 3);
  var endS = new Scale3D(1, 1, 1);
  this.cycleScale(startS, endS, 2000); 
}

var obj2 = scene.getObjectByName("cubeStop");
obj2.onPress = function()
{ 
  obj1.stopScale();   
}