我使用此方法from gamedev实现了简单的AABB与Sphere碰撞。 当球体从四面八方与盒子碰撞时,它工作正常。
问题是球体不会滑动盒子的边缘。当球体落在-y方向上的方向碰撞在盒子的边缘时,它将再次向+ y方向移动。见下图(碰撞后拍摄)。
我认为问题在于,在这种情况下,接触正常总是[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);
}
然后将数据转发给我的碰撞响应。
答案 0 :(得分:0)
疏通你的联系方式。当对象是球体时,您在开始时具有的矢量Delta是碰撞法线。你必须将其标准化,并可能否定它,但它正朝着正确的方向发展。
在其他形状的一般情况下不正确......