BABYLON.AnimationEvent не работает должным образом - PullRequest
0 голосов
/ 03 октября 2019

Мне нужен Babylon JS для запуска события в определенных кадрах. Я использую BABYLON.AnimationEvent. Но когда вызывается функция действия, ее внутренние переменные не установлены должным образом.

В приведенном ниже примере я создал простую сцену и добавил блок. Коробка будет медленно двигаться вдоль оси х. Каждые 10 кадров я хотел бы, чтобы функция вызывалась и «что-то делала». В этом примере будет отображаться номер кадра.

var createScene = function () {

// This creates a basic Babylon Scene object (non-mesh)
var scene = new BABYLON.Scene(engine);

var box = BABYLON.MeshBuilder.CreateBox("box", {size:10}, scene);

//setup camera
var camera = new BABYLON.ArcRotateCamera("Camera", BABYLON.Tools.ToRadians(-120), BABYLON.Tools.ToRadians(80), 65, new BABYLON.Vector3(0, -15, 0), scene);    camera.attachControl(canvas, false);

 //setup lights
var light1 = new BABYLON.PointLight("light1", new BABYLON.Vector3(-14, 25,25), scene);
light1.intensity = 15;

var animationBox = new BABYLON.Animation("myAnim", "position", 30, BABYLON.Animation.ANIMATIONTYPE_VECTOR3, BABYLON.Animation.ANIMATIONLOOPMODE_CONSTANT);

var keys = [];

for(var i=0; i<100; i++)
{
    keys.push({
        frame: i,
        value: new BABYLON.Vector3(i/10, 0, 0)
    });

    if(i%10==0)
    {
        animationBox.addEvent(new BABYLON.AnimationEvent( i, function() { console.log( "Frame: "+i ) }, true ) );

        /*
        Expected result:
        Frame: 0
        Frame: 10
        Frame: 20
        etc.

        Actual result:
        Frame: 100
        Frame: 100
        Frame: 100
        etc.
        */
    }
}

animationBox.setKeys(keys);
box.animations.push(animationBox);

scene.beginAnimation(box, 0, 100, true);

return scene;

};

Ожидаемый результат:
Кадр: 0Кадр: 10 Кадр: 20 и т. Д.

Фактический результат: Кадр: 100 Кадр: 100 Кадр: 100 и т. Д. Приведенный выше код можно запустить здесь: https://playground.babylonjs.com/#B3RECS#1

1 Ответ

0 голосов
/ 04 октября 2019

Здравствуйте, это потому, что вы захватываете последнее значение i. Вам нужно сделать замыкание для захвата текущего значения:

https://playground.babylonjs.com/#B3RECS#2

(это общий вопрос JS, а не проблема с Babylon.js)

...