Я пытаюсь сделать очень простые 2-мерные физические функции для решения твердого тела со сферическими частицами в качестве коллайдеров,
У меня есть жесткое тело и класс частиц:
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 (с помощью импульса сила сохраняет в частице и позиционирует мир pos моей частицы):
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 по угловой скорости, которая становится действительно большой при самом небольшом столкновении, на данный момент я не использую какое-либо демпфирование (линейное или угловое), и у меня нет инерция для моей угловой скорости,
Думаю, моя проблема заключается в отсутствии инерции, но я немного запутываюсь, когда смотрю в Интернете, как это вычислить,
Я смотрю в box2d, чтобы увидеть, где инерция хранится, и похоже, что это переменная жесткого тела (как масса). Я нашел в Интернете, что Инерция = масса * (r * r)
проблема => что такое r ...
-if - расстояние до моего центра тяжести (поэтому положение моего жесткого тела), очевидно, всегда равно 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 ‹numberOfParticle) I + = (massOfParticle (i) * (RelativePosOfParticle (i) * RelativePosOfParticle (i)) В этом случае лучше, потому что если я возведу в квадрат расстояние до каждой частицы ( вместо того, чтобы сначала искать в центре), my I будет больше 0. Но я не уверен, что это правильная формула ...
Если кто-то может объяснить мне просто, как вычислить инерцию? Могу ли я вычислить инерцию моего жесткого тела напрямую (а не по частицам)? Могу ли я сохранить инерцию, или если она углубится, где применить импульс (я читал это также на другом веб-сайте ...)? и / или почему я могу ошибиться в своей функции импульса, чтобы получить такую большую угловую скорость (может быть, это нормально, и демпфирование решает эту проблему другим физическим двигателем).
А также, если кто-то может ответить (просто из любопытства), использует ли box2d простую версию инерции, потому что ее быстрее вычислить, а результат достаточно хорош? Или расчет Box2d правильный, и я что-то упускаю при чтении кода?
Большое спасибо ^^,
Мариус.