我需要巴比伦JS在特定帧处触发事件。我正在使用BABYLON.AnimationEvent。但是,在调用动作函数时,其内部变量设置不正确。
在下面的示例中,我创建了一个简单的场景并添加了一个框。该框将沿x轴缓慢移动。每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
答案 0 :(得分:0)
您好,这是因为您正在捕获i的最后一个值。 您需要关闭以捕获当前值:
https://playground.babylonjs.com/#B3RECS#2
(这是一个通用的JS问题,与Babylon.js无关)