gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 04:47:50 25 4
gpt4 key购买 nike

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

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

  • 使用了 constraint这样球就不会“飞走”:
    rigidConstraints.distanceConstraint( wheel, ball, 1 );
  • 用过drag让球减速:
    world.add(Physics.integrator('verlet', { drag: 0.9 }));
  • 让轮子吸引球,这样当阻力足够慢时球就会落向它

我的问题:

  1. 如何逐渐减慢球的旋转速度?
    我已经有一个非常高的drag 值,但它看起来并没有做任何事情
  2. 我如何使对轮子的吸引力起作用?
    距离限制应该防止球逃脱,而不是靠近方向盘。
  3. 为什么 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();
});

最佳答案

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

  2. 不幸的是,距离约束强加了固定距离。因此,要防止球以这种方式逃逸,您需要实现自己的行为。 (更多内容在下方)

  3. 您必须将 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
}

当然,这是一种“只管完成”的方法,但它应该有效。

关于javascript - 如何制作逼真的轮盘赌球旋转动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24456610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com