我已经搜遍了所有,我找到了矩形圆和精灵碰撞的答案。没有什么能在两个点阵列之间提供碰撞检测,例如,
var poly1=[
[0,0],
[20,50],
[50,70],
[70,20],
[50,0]
];
// each point from one to the next represent a line in the shape, then the last point connects to the first to complete it.
var poly2=[
[50,30],
[40,90],
[70,110],
[90,70],
[80,20]
];
var collided=arraysCollided(poly1,poly2);
有没有人知道可以做到这一点的图书馆?我的研究没有提供任何支持这一点,也没有与某些游戏引擎库相关联。
例如,当一个或多个点位于另一个点的多边形内时,会触发碰撞true
。
答案 0 :(得分:0)
SAT.js对我而言,我只是将每一点都放入SAT.Vector
然后进入SAT.Polygon
,然后用SAT.testPolygonPolygon(SAT.Polygon,SAT.Polygon);
var poly1={
name:"poly2",
x:400,
y:60,
rotation:0,
runner:function(){
},
points:[
[20,-50],
[-30,-50],
[-30,30],
[10,60],
[50,20]
]
};
var poly2={
name:"poly2",
x:50,
y:70,
runner:function(){
this.x+=1;
},
points:[
[-20,-40],
[-60,50],
[10,70],
[50,30],
[30,-20]
]
};
pGon=(poly)=>{
var center=SAT.Vector(0,0);
var pts=[];
for(var i in poly.points){
var point=poly.points[i];
// point = [0:x,1:y]
pts[pts.length]=new SAT.Vector(point[0]+poly.x,point[1]+poly.y);
}
var poly_a=new SAT.Polygon(center,pts);
return poly_a;
};
pCollide=(p1,p2)=>{
var p1_poly=pGon(p1);
var p2_poly=pGon(p2);
var res=new SAT.Response();
var collided=SAT.testPolygonPolygon(p1_poly,p2_poly,res);
console.log(collided);
console.log(res);
return collided;
};
var collided=pCollided(poly1,poly2);
用它,它将每个点映射到坐标系上的多边形,然后从那里测试它。所以collided
= true
答案 1 :(得分:0)
我检查了每个多边形的每个点是否在另一个多边形中。这是检查点是否在多边形中的代码:
function pip(x, y, polygon) {
let odd = false;
let v = polygon.va; //The vertices array
let j = v.length - 2;
for (let i=0; i<v.length-1; i+=2) {
if ((v[i+1]<= y && v[j+1]>=y || v[j+1]<= y && v[i+1]>=y)
&& (v[i]<=x || v[j]<=x)) {
odd ^= (v[i] + (y-v[i+1])*(v[j]-v[i])/(v[j+1]-v[i+1])) < x;
}
j=i;
}
if(odd === false) odd = 0;
return odd;
}
我是从Here那里得到的,但是对其进行了修改以使其适用于像[x1,y1,x2,y2,x3,y3...]
这样的数组。要使其适用于x,y对,只需更改for循环修饰符,并将polygon.va[i][0]
视为x
,将polygon[i][1]
视为y
。