C++ 球面/平面碰撞检测
我试图使球体和平面正确碰撞。使用下面的代码,它们确实会发生冲突,但只会发生一小部分冲突。说到飞机,我不知所措,所以一定有什么我忽略了 我试图通过碰撞(发生在狭窄阶段)辨别出深度、法线和接触点。这些将在以后解析脉冲等时使用 问题是,仅在几次迭代后距离就变为<0(球体在滚动,然后刚好在平面下)C++ 球面/平面碰撞检测,c++,game-physics,C++,Game Physics,我试图使球体和平面正确碰撞。使用下面的代码,它们确实会发生冲突,但只会发生一小部分冲突。说到飞机,我不知所措,所以一定有什么我忽略了 我试图通过碰撞(发生在狭窄阶段)辨别出深度、法线和接触点。这些将在以后解析脉冲等时使用 问题是,仅在几次迭代后距离就变为获取位置()-glm::vec3(平面碰撞器->获取距离()),平面碰撞器->获取法线(); 自动法线=平面碰撞器->获取法线()*距离; 如果(距离获取半径(); contactNormal=glm::vec3(0.0f、1.0f、0.0f);
auto-distance=glm::dot(球体->获取位置()-glm::vec3(平面碰撞器->获取距离()),平面碰撞器->获取法线();
自动法线=平面碰撞器->获取法线()*距离;
如果(距离<0.0f)
{
返回false;
}
如果(距离==0.0f)
{
穿透深度=球体准直器->获取半径();
contactNormal=glm::vec3(0.0f、1.0f、0.0f);
contactPoint=bodyA->GetPosition();
}
其他的
{
穿透深度=球体准直器->GetRadius()-距离;
contactNormal=正常;
接触点=法线*(距离-sphereCollider->GetRadius());
}
当然要注意浮点比较,但我认为这不是问题所在。记录距离,它在一帧内从0.003-ish快速移动到-0.11。
auto distance = glm::dot(sphere->GetPosition() - glm::vec3(planeCollider->GetDistance()), planeCollider->GetNormal());
auto normal = planeCollider->GetNormal() * distance;
if (distance < 0.0f)
{
return false;
}
if (distance == 0.0f)
{
penetrationDepth = sphereCollider->GetRadius();
contactNormal = glm::vec3(0.0f, 1.0f, 0.0f);
contactPoint = bodyA->GetPosition();
}
else
{
penetrationDepth = sphereCollider->GetRadius() - distance;
contactNormal = normal;
contactPoint = normal * (distance - sphereCollider->GetRadius());
}