Для организации плавного передвижения, плавного изменения поворота, плавного изменения масштаба с автоматической синхронизацией предназначен специальный набор функций.
Для плавного перемещения объекта служит метод 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(); }