我一直試圖根據Randy Gaul's C++ Impulse Engine基於Randy Gaul's C++ Impulse Engine來實現圓和多邊形之間的碰撞檢測,緊跟在代碼後面,但算法從不返回true。這個是JSFiddle。 (該機構正在使用的方便HTML5的Canvas API渲染)碰撞檢測:分離軸定理 - 圓與多邊形
代碼(只是碰撞檢測)的一個片段:
const circPoly = (a, b) => {
let data = {},
center = a.pos;
data.contacts = [];
center = b.mat.clone().trans().mult(center.clone().sub(b.pos));
let sep = -Number.MAX_VALUE,
faceNorm = 0;
for (let i = 0; i < b.verts2.length; ++i) {
let sep2 = b.norms[i].dot(center.clone().sub(b.verts2[i]));
if (sep2 > a.radius) return data;
if (sep2 > sep) { sep = sep2; faceNorm = i; }
}
let v1 = b.verts2[faceNorm],
v2 = b.verts2[faceNorm + 1 < b.verts2.length ? faceNorm + 1 : 0];
if (sep < 0.0001) {
data.depth = a.radius;
data.norm = b.mat.clone().mult(b.norms[faceNorm]).neg();
data.contacts[0] = data.norm.clone().vmult(a.pos.clone().sadd(a.radius));
return data;
}
let dot1 = center.clone().sub(v1).dot(v2.clone().sub(v1)),
dot2 = center.clone().sub(v2).dot(v1.clone().sub(v2));
data.depth = a.radius - sep;
if (dot1 <= 0) {
if (center.dist2(v1) > a.radius * a.radius) return data;
let norm = v1.clone().sub(center);
norm = b.mat.clone().mult(norm);
norm.norm();
data.norm = norm;
v1 = b.mat.clone().mult(v1.clone().add(b.pos));
data.contacts[0] = v1;
} else if (dot2 <= 0) {
if (center.dist2(v2) > a.radius * a.radius) return data;
let norm = v2.clone().sub(center);
norm = b.mat.clone().mult(norm);
norm.norm();
data.norm = norm;
v2 = b.mat.clone().mult(v2.clone().add(b.pos));
data.contacts[0] = v2;
} else {
let norm = b.norms[faceNorm];
if (center.clone().sub(v1).dot(norm) > a.radius) return data;
norm = b.mat.clone().mult(norm);
data.norm = norm.clone().neg();
data.contacts[0] = data.norm.clone().vmult(a.pos.clone().sadd(a.radius));
}
return data;
};
注意b.verts2
指多邊形的頂點在現實世界中的座標。
我知道一個事實,即Vector類沒有問題,但由於我對轉換矩陣並沒有太多的經驗,所以這個類可能是這些錯誤的根源,儘管它的代碼很漂亮它也完全來源於脈衝引擎,因此它應該可以工作。如前所述,即使發生碰撞,該算法也總是返回false。我在這裏做錯了什麼?我試着拿出早期的回報,但這只是返回奇怪的結果,例如帶有負座標的接觸點,這顯然不太正確。
編輯:修改了我的矢量類的垂直函數,以與脈衝引擎相同的方式工作(兩種方式都是正確的,但我認爲一個是順時針的而另一個是逆時針的 - 我還修改了頂點以反映逆時針方向,岬)。不幸的是,它仍然沒有通過測試。
https://jsfiddle.net/khanfused/tv359kgL/4/
其實,有什麼不對的功能 - 我想通了,有一個與我的向量和矩陣類的問題。不過謝謝。 – Raiden