2014-09-03 128 views
0

我使用這種方法實現了一個簡單的AABB vs球體碰撞from gamedev。 當球與四面八方碰撞時,它可以正常工作。AABB vs球體碰撞

問題是球體不會滑到盒子邊緣。這意味着當球體沿-y方向落在箱子的邊緣上時,它將再次沿+ y方向運動。見下圖(碰撞後拍攝)。

我認爲問題是在這種情況下contactnormal是總是[0,1,0]。我如何實現更現實的行爲? 對於矢量計算,我使用的是glMatrix

var delta = vec3.create(); 
vec3.subtract(delta, centerRelSphereAABB, closestPoint); 
distance = vec3.length(delta); 

if(distance < C.radius){ 

    penetrationDepth = C.radius - distance; 

    contactNormal = vec3.create(); 
    vec3.subtract(contactNormal, delta, A.centerOfMass); 
    vec3.normalize(contactNormal, delta); 

    //contact point 
    contactPoint = vec3.create(); 
    vec3.scale(contactPoint, contactNormal, C.radius - penetrationDepth); 
    vec3.subtract(contactPoint, model_1.centerOfMass, contactPoint); 
} 

然後數據被轉發到我的碰撞響應。

enter image description here

回答

0

溝您的聯繫正常。當對象是球體時,開始時的矢量Delta是碰撞法線。你將不得不規範它,並可能否定它,但它是在正確的方向。

在其他形狀的一般情況下不成立...