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