Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 球面/平面碰撞检测_C++_Game Physics - Fatal编程技术网

C++ 球面/平面碰撞检测

C++ 球面/平面碰撞检测,c++,game-physics,C++,Game Physics,我试图使球体和平面正确碰撞。使用下面的代码,它们确实会发生冲突,但只会发生一小部分冲突。说到飞机,我不知所措,所以一定有什么我忽略了 我试图通过碰撞(发生在狭窄阶段)辨别出深度、法线和接触点。这些将在以后解析脉冲等时使用 问题是,仅在几次迭代后距离就变为获取位置()-glm::vec3(平面碰撞器->获取距离()),平面碰撞器->获取法线(); 自动法线=平面碰撞器->获取法线()*距离; 如果(距离获取半径(); contactNormal=glm::vec3(0.0f、1.0f、0.0f);

我试图使球体和平面正确碰撞。使用下面的代码,它们确实会发生冲突,但只会发生一小部分冲突。说到飞机,我不知所措,所以一定有什么我忽略了

我试图通过碰撞(发生在狭窄阶段)辨别出深度、法线和接触点。这些将在以后解析脉冲等时使用

问题是,仅在几次迭代后距离就变为<0(球体在滚动,然后刚好在平面下)

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());
    }