javascript BabylonJS动态生成的动画未播放

g6baxovj  于 2023-11-15  发布在  Java
关注(0)|答案(2)|浏览(135)

我https://playground.babylonjs.com/#7QN6ZM#54。在控制台窗口中,您将注意到以下错误跟踪;**它似乎存在一个问题,即将巴比伦场景传递给JS类,然后尝试从JS类的上下文中播放动画。x1c 0d1x
奇怪的是,正如在操场上所指出的,当我直接从第一个类函数尝试该过程时(即非动态且不使用自定义AnimationSequencer类),一切都按预期工作。

9jyewag0

9jyewag01#

这个错误似乎与ObjAnimationSequence类以及为boxAnimationSequence设置positionKeysrotationKeys的方式有关。
boxAnimationSequence中,您将rotationKeys设置为如下所示:

const boxRotKeys=[
   { frame: 0,  value: new BABYLON.Vector3(0,0,0) },
   { frame: 120, value: new BABYLON.Vector3(0, 0, 0) }, 
   { frame: 180, value: new BABYLON.Vector3(0, Math.PI*2, 0) },
   { frame: 240, value: new BABYLON.Vector3(0, 0, 0) },
   { frame: 300, value: new BABYLON.Vector3(0, 0, 0) },
];
boxAnimationSequence.rotationKeys = boxRotKeys;

字符串
每个关键帧的value都是一个BABYLON.Vector3对象,但是当你为boxAnimationSequence设置positionKeys时,你直接将box.position,也就是一个BABYLON.Vector3,分配给每个关键帧的value字段;

const boxPosKeys=[
   { frame: 0, value: box.position },
   { frame: 120, value: new BABYLON.Vector3(20, 0, 20) },
   { frame: 180, value: new BABYLON.Vector3(40, 0, -20) },
   { frame: 240, value: new BABYLON.Vector3(20, 0, 20) },
   { frame: 300, value: new BABYLON.Vector3(10, 5, 10) },
];


如果box.position没有正确初始化,或者在代码中的其他地方修改了它,这可能会导致问题。box.position可能在某个时候被转换为字符串,这将导致Babylon.js尝试在其上创建_isDirty属性时出现错误。
这种方法可以帮助你修复错误。首先你需要做的是为boxPosKeys中的每个关键帧创建一个新的BABYLON.Vector3对象,就像你在boxRotKeys中做的那样,以确保每个关键帧都有自己唯一的BABYLON.Vector3对象,这应该可以防止它在代码的其他地方被修改。
boxPosKeys代码与boxRotKeys相同;

const boxPosKeys=[
   { frame: 0, value: new BABYLON.Vector3(box.position.x, box.position.y, box.position.z) },
   { frame: 120, value: new BABYLON.Vector3(20, 0, 20) },
   { frame: 180, value: new BABYLON.Vector3(40, 0, -20) },
   { frame: 240, value: new BABYLON.Vector3(20, 0, 20) },
   { frame: 300, value: new BABYLON.Vector3(10, 5, 10) },
];


如果上面的代码没有修复错误,你可能需要做一些调试来找出字符串是在哪里创建的。你可以console.log()box.position的类型和值以及每个关键帧的值字段。这应该有助于你识别字符串来自哪里。

toe95027

toe950272#

我已经找到了错误的来源。这是我的疏忽;在声明了一个动画来更新position属性的地方,数据类型也必须指定为Vector 3:

let meshPositionAnim = new BABYLON.Animation(
    meshAnimSequence.objectId+"MeshPositionAnimation",
    "position",
    this.defaultFPS,
    BABYLON.Animation.ANIMATIONTYPE_VECTOR3,   //Must be ANIMATIONTYPE_VECTOR3
    BABYLON.Animation.ANIMATIONLOOPMODE_CONSTANT,
    true
    );

字符串
我之前一直错误地使用BABYLON.Animation.ANIMATIONTYPE_FLOAT,因为我之前一直在独立地为每个轴制作动画,分别使用position.x,position.y和position.z(它们是浮点值),而不仅仅是position。

相关问题