【发布时间】:2014-06-27 09:59:47
【问题描述】:
所以,我正在尝试对我的 SAT、Circle - Poly、Poly - Poly 碰撞应用响应。我将本文中的这段代码移植到 JavaScript:
http://rocketmandevelopment.com/blog/separation-of-axis-theorem-for-collision-detection/
现在,检测适用于所有类型,但响应失败并且以疯狂的速度和错误的角度进行,它不依赖于对象的质量(面积^2而不是质量)和角速度不适用
JSFiddle(模拟时没有应用重力,用方向键移动),JS中的第一部分是Vectors,然后是Physics,然后是Main。
这是我对形状的定义:(必须为“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);
}
所有碰撞函数都会给出失败的响应结果,所以一定有某种连接。
回到角速度我知道如何旋转多边形,但我希望在碰撞后得到新的 av:
px = x * cos(a) - y * sin(a);
py = x * sin(a) + y * cos(a);
我还为线条和贝塞尔曲线制作了一个不错的物理模拟器,它可能会有所帮助:http://murplyx.net/projects/csb/
所以对我来说最重要的部分是我将如何修复以使速度与速度和角度正确匹配? (我使用的是向量而不是三角函数-.-)然后我可以考虑质量和角速度。谢谢。我不使用 Box2D。
编辑:添加了计算面积^2 以将质量设置为相等的函数。
【问题讨论】:
-
270-` 200` =70(rep) O_o -
O_o 我一开始有 470 个代表 270 + 200 = 470 :P
-
干得好。你正在赚钱和销售:)
标签: javascript vector physics collision