【发布时间】:2013-01-21 22:23:33
【问题描述】:
我尝试制作一个非常简单的 2d 物理函数来解决以球体粒子作为对撞机的刚体,
我有这么一个刚体和粒子类:
function _rigidBody () {
this._position = cc.p(0.0, 0.0);
this._angle = 0;
this._linearVelocity = cc.p(0.0, 0.0);
this._angularVelocity = 0.0;
this._force = cc.p(0.0, 0.0);
this._angularMoment = 0;
this._mass = 1.0;
this._particles = [];
}
function _particle () {
this._initialPosition = cc.p(0.0, 0.0);
this._relativePosition = cc.p(0.0, 0.0);
this._worldPosition = cc.p(0.0, 0.0);
this._linearVelocity = cc.p(0.0, 0.0);
this._force = cc.p(0.0, 0.0);
this._radius = 10.0;
}
所以基本上,每一帧我都会计算每个刚体中存储的每个粒子的新位置,然后我检查粒子之间的碰撞,如果发生碰撞,我会计算一个力来击退它们(基于半径和咀嚼程度它们里面有),然后我将这个力存储在粒子中,
我通过向我的刚体添加和冲量来计算 LinearVelocity 和 AngularVelocity,以获取它包含的所有粒子上的所有力存储。
我的函数 addImpulse(用脉冲将力存储在粒子中并定位我的粒子的世界位置):
this.AddImpulse = function(bodyIdx,impulse,position){
var b = g_Bodies[ bodyIdx ];
if(position == null){position = b._position;}
b._linearVelocity.x += (impulse.x/ b._mass);
b._linearVelocity.y += (impulse.y/ b._mass);
b._angularVelocity += ((position.x - b._position.x) * impulse.y -
(position.y - b._position.y) * impulse.x);
};
我的问题是,这个函数对 linearVelocity 工作得很好,因为它接缝的角速度在最轻微的碰撞时会变得非常大, 目前,我没有使用任何阻尼(线性或角度),并且我的 angularVelocity 没有惯性,
我猜惯性缺失是我的问题,但是当我在互联网上查看如何计算它时,我有点困惑,
我在 box2d 中查看是否存储了惯性,并且它似乎是刚体的变量(作为质量)。
我在互联网上发现惯性 = 质量 * (r*r)
问题 => 什么是 r ...
-如果是我的重心距离(所以我的刚体的位置),显然一直等于0(body.position - body.position == 0)
在 box2d 中我发现: this.m_I = massData.I - this.m_mass * (massData.center.x * massData.center.x + massData.center.y * massData.center.y); 而massData.center 接缝为刚体形状的中心, 就我而言,问题是我的形状是 2 个球体,一个在 (0,10),一个在 (0,-10),所以中心是 (0,0) ....
在另一个网站上我发现: for(i
如果有人可以用简单的方式解释我,如何计算惯性?如果我可以直接(而不是通过粒子)计算我的刚体的惯性?如果我可以存储惯性,或者如果它加深了应用冲动的地方(我也在其他网站上读到过......)? 和/或为什么我的脉冲函数会做错以获得如此大的角速度(也许是正常的,解决这个问题的阻尼是其他物理引擎)。
如果有人可以回答(只是出于好奇),box2d 是否使用简单版本的惯性,因为计算速度更快并且结果足够好?还是Box2d的计算是正确的,看代码的时候漏掉了什么?
非常感谢^^,
马吕斯。
【问题讨论】:
标签: 2d box2d physics momentum angular-momentum