BABYLON.AnimationEvent 未按预期运行
BABYLON.AnimationEvent doesn't behave as expected
我需要 Babylon JS 在特定帧触发事件。我正在使用 BABYLON.AnimationEvent。但是在调用动作函数时,其内部变量设置不正确
在下面的示例中,我创建了一个简单的场景并添加了一个盒子。该框将沿 x 轴缓慢移动。每 10 帧,我希望调用一个函数 "do something"。在这个例子中,它将显示帧数。
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
您好,这是因为您正在捕获 i 的最后一个值。
您需要关闭以捕获当前值:
https://playground.babylonjs.com/#B3RECS#2
(这是一个一般的 JS 问题,而不是 Babylon.js 的问题)
我需要 Babylon JS 在特定帧触发事件。我正在使用 BABYLON.AnimationEvent。但是在调用动作函数时,其内部变量设置不正确
在下面的示例中,我创建了一个简单的场景并添加了一个盒子。该框将沿 x 轴缓慢移动。每 10 帧,我希望调用一个函数 "do something"。在这个例子中,它将显示帧数。
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
您好,这是因为您正在捕获 i 的最后一个值。 您需要关闭以捕获当前值:
https://playground.babylonjs.com/#B3RECS#2
(这是一个一般的 JS 问题,而不是 Babylon.js 的问题)