Итак, я пытаюсь применить ответ на мои столкновения SAT, Circle - Poly, Poly - Poly. Я портировал этот код в этой статье на JavaScript:
http://rocketmandevelopment.com/blog/separation-of-axis-theorem-for-collision-detection/
Теперь обнаружение работает на всех типах, но ответ терпит неудачу и идет со безумной скоростью и неправильным углом, он не зависит от массы объектов (площадь ^ 2 вместо массы) и angular скорость isn 't применяется
JSFiddle (гравитация не применяется для симуляции, перемещается со стрелками), первая часть в JS - это векторы, а затем физика и затем Главная.
Это мое определение фигур: (нужно было добавить код для ссылки "JSFiddle": P)
var Circle = function(body, c, r, cor, cof) {
this.body = body // Static or dynamic
this.c = c; // Center
this.r = r; // Radius
this.m = getCMass(r); // Mass = Area
this.v = new Vector(); // Velocity
this.cor = cor; // Coefficient of restitution
this.cof = cof; // Coefficient of friction
this.a = 0; // Angle
this.av = 0; // Angular velocity
this.type = "Circle";
}
var Polygon = function(body, c, vs, cor, cof) {
this.body = body // Static or dynamic
this.c = c; // Center
this.vs = vs; // Vertices
this.m = getPMass(vs); // Mass = Area
this.v = new Vector(); // Velocity
this.cor = cor; // Coefficient of restitution
this.cof = cof; // Coefficient of friction
this.a = 0; // Angle
this.av = 0; // Angular velocity
this.type = "Polygon";
}
function getCMass(r) { // More like, getCArea
return (r * r * Math.PI);
}
function getPMass(vs) {
var area = 0;
var j = vs.length - 1;
for (var i = 0; i < vs.length; i++) {
area += (vs[j].x + vs[i].x) * (vs[j].y - vs[i].y);
j = i;
}
return (area / 2);
}
Все функции Collision дают результаты неудачного ответа, поэтому должно быть какое-то соединение.
Вернуться к скорости angular Я знаю, как вращать полигоны, но я ищу, чтобы получить новый av после столкновения:
px = x * cos(a) - y * sin(a);
py = x * sin(a) + y * cos(a);
Также я сделал хороший физический симулятор для строк и безьеров, которые он мог бы помочь: http://murplyx.net/projects/csb/
Итак, самая важная часть в этом для меня - как я буду исправлять, чтобы скорость шла правильно по скорости и углу? (Я использую векторы, а не тригонометрию -.-) Тогда я могу думать о массовых и angular скоростях. Благодарю. Я остаюсь в коробке Box2D.
EDIT: Добавлены функции, которые вычисляют площадь ^ 2, чтобы установить массу равной.