0

I'm trying to make some examples using Famo.us Physics engine.

I had tried an example of spring. I thought rotational spring could be similar with it,so I'm trying to do but it's not that easy for me.

Here is an example using Rotational Spring, but it doesn't work

var Engine                  = require("famous/core/Engine");
var Surface                 = require("famous/core/Surface");
var ImageSurface            = require("famous/surfaces/ImageSurface");
var Modifier                = require("famous/core/Modifier");

var Transform               = require("famous/core/Transform");
var Transitionable          = require("famous/transitions/Transitionable");
var PhysicsEngine           = require("famous/physics/PhysicsEngine");
var Spring                  = require("famous/physics/forces/Spring");
var RotationalSpring        = require("famous/physics/forces/RotationalSpring");
var Particle                = require("famous/physics/bodies/Particle");
var Body                    = require("famous/physics/bodies/Body");
var Constraint              = require("famous/physics/constraints/Constraint");
var MouseSync = require("famous/inputs/MouseSync");
var mainContext = Engine.createContext();   
var PE = new PhysicsEngine();
content.particle = new Particle({
                          mass: 1,
                          position: [0, 0, 0],
                          velocity: [0, 0, 0],
                          axis : 0x01   //0x01 : Particle.AXES.y
                        });

// Create a spring that will act on the particle
var rotationalSpring = new RotationalSpring({
  anchor: [0, 0, 0],
  period: 400,  // <= Play with these values :-)
  dampingRatio: 0.07, // <= if 0 then just once / else if 1 then infinite
  length: 0
});

// Link the spring, particle and surface together
PE.attach(rotationalSpring, content.particle);  
PE.addBody(content.particle);
var translateMod = new Modifier({       origin: [.5,.5]    });

//Get Mouse input
var position = [0, 0];

var mouseSync = new MouseSync(function() {
    return position;
});

Engine.pipe(mouseSync);

// Get start when there is a Mouse input
mouseSync.on("start", function() {
    FaceSequence.particle.applyForce(new Vector(0, 1.0, 0));
});

translateMod.transformFrom(function() {

        var transM = FaceSequence.particle.getTransform();      
        return transM;
});

How can I make it works?? :)

Jihye
  • 1
  • @dmvaldman I have been trying to get something to work here.. but can't seem to apply any angular velocity. Do you have a short example of RotationalSpring in action? – johntraver May 15 '14 at 22:42

1 Answers1

0

After poking at the above code a bit, I realized that the function calls of RotationalSpring matched up with Body, not Particle. After a quick rewrite I got a number of odd results which made me think of rotational balances. They are extremely sensitive and extremely delicate, so I guessed that this might work the same way. After dropping the torque a bit I started to get some almost reasonable results. I'll leave the fine tuning, but here is some almost reasonable rotational spring code. I have tilted a surface of angle a little bit to make the rotation a little more clear. You can also see it run live at codefamo.us

Here is the code...

/* globals define */
define(function(require, exports, module) {
  var Engine                  = require("famous/core/Engine");
  var Surface                 = require("famous/core/Surface");
  var ImageSurface            = require("famous/surfaces/ImageSurface");
  var Modifier                = require("famous/core/Modifier");
  var StateModifier           = require("famous/modifiers/StateModifier");

  var Transform               = require("famous/core/Transform");
  var Transitionable          = require("famous/transitions/Transitionable");
  var PhysicsEngine           = require("famous/physics/PhysicsEngine");
  var Spring                  = require("famous/physics/forces/Spring");
  var RotationalSpring        = require("famous/physics/forces/RotationalSpring");
  var Particle                = require("famous/physics/bodies/Particle");
  var Body                    = require("famous/physics/bodies/Body");
  var Constraint              = require("famous/physics/constraints/Constraint");
  var Vector = require('famous/math/Vector');
  var MouseSync = require("famous/inputs/MouseSync");


  var mainContext = Engine.createContext();
  var PE = new PhysicsEngine();

  var surf = new Surface({
    size: [200,200],
    properties: {
      backgroundColor:'red',
      '-webkit-backface-visibility':'visible'
    }
  });

  var tilt = new StateModifier({
    transform: Transform.rotateX(Math.PI/8)
  });

  // Create a spring that will act on the particle
  var rotationalSpring = new RotationalSpring({
    anchor: new Vector(0, 1, 0),
    period: 3000,  // <= Play with these values :-)
    dampingRatio: 0.1// <= if 0 then just once / else if 1 then infinite
  });

  var body = new Body({
    mass: 10
  });

  // Link the spring, particle and surface together
  PE.addBody(body);
  PE.attach(rotationalSpring, body);

  var translateMod = new Modifier({
    origin: [.5,.5]
  });

  translateMod.transformFrom(function() {
    return body.getTransform();
  });

  Engine.on('click', function() {
    body.applyTorque(new Vector(0,.001,0));
  });

  mainContext.add(translateMod).add(tilt).add(surf);
});
rich
  • 196
  • 4