如何制作逼真的轮盘球旋转动画

我正在使用PhysicsJS制作2D轮盘球旋转动画。

到目前为止,我已经实现了以下内容:

  • 使用一个约束,以便球不会“飞走”:
    rigidConstraints.distanceConstraint( wheel, ball, 1 );
  • 用拖动减慢球速度:
    world.add(Physics.integrator('verlet', { drag: 0.9 }));
  • 使轮子吸引球,以便当阻力足够减慢时它会朝向它
  • 我的问题:

  • 我如何逐渐减慢球的旋转速度?
    我已经有了非常高的drag值,但它看起来并不像是在做任何事情
  • 我如何吸引车轮工作?
    距离限制应该防止球脱离,而不是靠近车轮。
  • 为什么angularVelocity: -0.005在轮子上根本不起作用?
  • 我的代码,也在JSfiddle上

    Physics(function (world) {
        var viewWidth = window.innerWidth
            ,viewHeight = window.innerHeight
            ,renderer
            ;
    
        world.add(Physics.integrator('verlet', {
            drag: 0.9
        }));
    
        var rigidConstraints = Physics.behavior('verlet-constraints', {
            iterations: 10
        });
    
        // create a renderer
        renderer = Physics.renderer('canvas', {
            el: 'viewport'
            ,width: viewWidth
            ,height: viewHeight
        });
    
        // add the renderer
        world.add(renderer);
        // render on each step
        world.on('step', function () {
            world.render();
        });
    
        // create some bodies
        var ball = Physics.body('circle', {
            x: viewWidth / 2
            ,y: viewHeight / 2 - 300
            ,vx: -0.05
            ,mass: 0.1
            ,radius: 10
            ,cof: 0.99
            ,styles: {
                fillStyle: '#cb4b16'
                ,angleIndicator: '#72240d'
            }
        })
    
        var wheel = Physics.body('circle', {
            x: viewWidth / 2
            ,y: viewHeight / 2
            ,angularVelocity: -0.005
            ,radius: 100
            ,mass: 100
            ,restitution: 0.35
            // ,cof: 0.99
            ,styles: {
                fillStyle: '#6c71c4'
                ,angleIndicator: '#3b3e6b'
            }
            ,treatment: "static"
        });
    
        world.add(ball);
        world.add(wheel);
    
        rigidConstraints.distanceConstraint( wheel, ball, 1 );
    
        world.add( rigidConstraints );
    
        // add things to the world
        world.add([
            Physics.behavior('interactive', { el: renderer.el })
            ,Physics.behavior('newtonian', { strength: 5 })
            ,Physics.behavior('body-impulse-response')
            ,Physics.behavior('body-collision-detection')
            ,Physics.behavior('sweep-prune')
        ]);
    
        // subscribe to ticker to advance the simulation
        Physics.util.ticker.on(function( time ) {
            world.step( time );
        });
    
        // start the ticker
        Physics.util.ticker.start();
    });
    

  • Drag在该版本的PhysicsJS中存在一个错误,请尝试使用github中最新的版本。 https://github.com/wellcaffeinated/PhysicsJS/issues/94

  • 不幸的是距离约束施加了一个固定的距离。 所以为了防止球以这种方式逃跑,你需要实现你自己的行为。 (更多)

  • 你必须改变behavior: "static"behavior: "kinematic" 。 静态物体永远不会自行移动。

  • 要创建自定义行为,请查看此处的文档:https://github.com/wellcaffeinated/PhysicsJS/wiki/Behaviors#creating-a-custom-behavior

    为了获得你描述的功能,你需要做这样的事情:

    // in the behave method
    // calculate the displacement of the ball from the wheel... something like....
    disp.clone( wheel.state.pos ).vsub( ball.state.pos );
    // if it's greater than max distance, then move it back inside the max radius
    if ( disp.norm() > maxDist ){
        var moveBy = disp.norm() - maxDist;
        disp.normalize(); // unit vector towards the wheel
        disp.mult( moveBy );
        ball.state.pos.vadd( disp ); // move it back inside the max radius
    }
    

    当然,这是一个“完成它”的方式,但它应该起作用。

    链接地址: http://www.djcxy.com/p/21271.html

    上一篇: How to make a realistic roulette ball spinning animation

    下一篇: Rebinding events with jquery not working