AlbertTJames

Reference from meta object to babylon scene

Recommended Posts

Hey everyone :)

 

I am building a game on top of the babylon engine and I keep all babylon objects inside the meta "game object". I am having trouble with the scope of the variables when performing event related animations, sometimes it works sometimes it does not... And I have not idea why. 

I was playing around with the sky material tutorial http://www.babylonjs-playground.com/#E6OZX#6,  that has some key binding to control the daylight.

 

var setSkyConfig = function(property, from, to) {
      var keys = [{
        frame: 0,
        value: from
      }, {
        frame: 100,
        value: to
      }];

      var animation = new BABYLON.Animation("animation", property, 100, BABYLON.Animation.ANIMATIONTYPE_FLOAT, BABYLON.Animation.ANIMATIONLOOPMODE_CONSTANT);
      animation.setKeys(keys);

      scene.stopAnimation(skybox);
      scene.beginDirectAnimation(skybox, [animation], 0, 100, false, 1);
    };
    
    
    window.addEventListener("keydown", function(evt) {
      switch (evt.keyCode) {
        case 49:
          setSkyConfig("material.inclination", skyboxMaterial.inclination, 0);
          break; // 1
        case 50:
          setSkyConfig("material.inclination", skyboxMaterial.inclination, -0.5);
          break;
...

So that is working fine.

But now if I want to animate a sphere called lightSphere0 without creating a nested function (with direct reference inside it) like above, animation only work if I put the code directly inside the switch, like so.

case 50:
          setSkyConfig("material.inclination", skyboxMaterial.inclination, -0.5);
          var keys = [{
            frame: 0,
            value: lightSphere0.position.x
          }, {
            frame: 100,
            value: 30
          }];

          var animation = new BABYLON.Animation("animation", "position.x", 100, BABYLON.Animation.ANIMATIONTYPE_FLOAT, BABYLON.Animation.ANIMATIONLOOPMODE_CONSTANT);
          animation.setKeys(keys);

          scene.stopAnimation(lightSphere0);
          scene.beginDirectAnimation(lightSphere0, [animation], 0, 100, false, 1);

If i try to call any function outside of this switch with the object as an argument, or with its name, or with the scene object etc.. the animation runs without changing the property of the object. For example those following functions are methods of the meta object (that i call with thisObject.animateFloat(sphere, "position.x", ... , ....). So I get the OK, in the console (I get in fact 4 of them, not sure why), and everytime I have a correct reference to the object in the debugger. But the animation does not work...

animateFloat(object, property, from, to) {
    var keys = [{
      frame: 0,
      value: from
    }, {
      frame: 100,
      value: to
    }];

    var animation = new BABYLON.Animation("animation", property, 100, BABYLON.Animation.ANIMATIONTYPE_FLOAT, BABYLON.Animation.ANIMATIONLOOPMODE_CONSTANT);
    animation.setKeys(keys);

    this.currentSceneObject.stopAnimation(object);
    // edit, what was missing : object.animations.push(animation);
    object._scene.beginAnimation(object, 0, 100, false, 1, function() {
      console.log("ok")
    });
    //this.currentSceneObject.beginDirectAnimation(object, [animation], 0, 100, false, 1);
  };

  animateVector3(objectName, property, from, to) {
    var keys = [{
      frame: 0,
      value: from
    }, {
      frame: 100,
      value: to
    }];

    var sphere = this.currentSceneObject.getMeshByName(objectName);
    var animation = new BABYLON.Animation("animation", property, 100, BABYLON.Animation.ANIMATIONTYPE_VECTOR3, BABYLON.Animation.ANIMATIONLOOPMODE_CONSTANT);
    animation.setKeys(keys);

    this.currentSceneObject.stopAnimation(sphere);
    // edit, what was missing : object.animations.push(animation);
    this.currentSceneObject.beginAnimation(object, 0, 100, false, 1, function() {
      console.log("ok")
    });
    //this.currentSceneObject.beginDirectAnimation(object, [animation], 0, 100, false, 1);
  };

 

On the other hand if I create a function without animation, and change the position manually, it does work. For example if I change the code of the above function to :

 

animateVector3(object, property, from, to) {
    object.position.x = 50;
}

the object is moving...

 

 

Sorry for the long post ! Do you have any clue as to what is going on ? Im lost...

 

Thanks !

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Recently Browsing   0 members

    No registered users viewing this page.