C++ C++;导致对象消失的碰撞检测

C++ C++;导致对象消失的碰撞检测,c++,collision-detection,game-physics,C++,Collision Detection,Game Physics,我目前正在研究一些基本的2D刚体物理学,遇到了一个问题。我有一个功能,检查一个圆和一个AABB之间的碰撞,但有时圆(在这种情况下,玩家)会碰撞然后消失,如果我打印出发生这种情况时的位置,我只设置“nan” 解决方案: if (colCheck.x == 0 && colCheck.y == 0) { std::cout << "Zero Vector" << std::endl; float impulse = m_Velocity.x +

我目前正在研究一些基本的2D刚体物理学,遇到了一个问题。我有一个功能,检查一个圆和一个AABB之间的碰撞,但有时圆(在这种情况下,玩家)会碰撞然后消失,如果我打印出发生这种情况时的位置,我只设置“nan”

解决方案:

if (colCheck.x == 0 && colCheck.y == 0)
{
    std::cout << "Zero Vector" << std::endl;
    float impulse = m_Velocity.x + m_Velocity.y;
    m_Velocity.x = 0;
    m_Velocity.y = 0;
    m_Velocity += NormVector(diff)*impulse;
}
else
{
    VDirNorm = NormVector(colCheck);
    dist = getMagnitude(colCheck) - m_fRadius;
}
if(colCheck.x==0&&colCheck.y==0)
{

std::cout我看到的一个问题是带有零向量的
NormVector
。您将被零除,在返回的向量中生成nan。当
diff
diffcontained
相同时,在现有代码中可能会发生这种情况,因此
colCheck
将是(0,0)导致
VDirNorm
中有NAN,NAN将传播到
MU位置


通常,标准化的零长度向量应保持为零长度向量(请参阅),但在这种情况下,由于您在碰撞后使用归一化向量偏移身体,因此需要添加代码以合理方式处理它。

我看到的一个问题是
NormVector
具有零向量。您将除以零,在返回向量中生成NaN。当
时,在现有代码中可能会发生这种情况>diff
diffcontained
是相同的,因此
colCheck
将是(0,0),导致
VDirNorm
中包含nan,nan将传播到
m\u位置


通常,标准化的零长度向量应保持为零长度向量(请参阅),但在这种情况下,由于您在碰撞后使用规范化向量偏移身体,因此需要添加代码以合理的方式处理它。

您应该进行一些调试,并报告您发现的内容。您需要提供适当的。特别是,我们需要知道
NormVector
在代码层面上的作用,以及
OnCollision
的作用。到目前为止,这些似乎是最有可能的罪魁祸首。抱歉!将添加更多细节。@Xirema现在一切都好了吗?:)您应该进行一些调试并报告您发现的内容。您需要提供适当的解决方案。特别是,我们需要知道
NormVector
在代码层面上的作用,以及t
OnCollision
确实如此。到目前为止,这些看起来像是最有可能的罪犯。抱歉!将添加更多细节。@Xirema现在一切都好了吗?:)哦,哇,我不完全确定我将如何着手解决这个问题,但你完全正确,我会看看我能做些什么,看看这是否是问题!谢谢!我倾向于认为NaN是一个完美的valid对规范化零向量的响应(尽管OP仍然需要进行代码更改,以避免首先对零向量调用normalize)但基于,规范化零向量的正确方法似乎是保持其不变。因此我可能会将其添加到答案中。经过一些小的调试后,您完全正确,当colCheck为0,0时会发生这种情况。我尝试在发生这种情况时将VDirNorm保持为0,0,但同样的问题也会发生。修复这一问题可能很困难!但谢谢或者指出它!成功了!将把结果添加到问题中!哦,哇,我不完全确定我将如何解决这个问题,但你完全正确,我将看看我能做些什么,看看这是否是问题所在!谢谢!我倾向于认为NaN是对零向量规范化的完美有效回答(尽管OP仍然需要进行代码更改,以避免首先对零向量调用normalize)但基于,规范化零向量的正确方法似乎是保持其不变。因此我可能会将其添加到答案中。经过一些小的调试后,您完全正确,当colCheck为0,0时会发生这种情况。我尝试在发生这种情况时将VDirNorm保持为0,0,但同样的问题也会发生。修复这一问题可能很困难!但谢谢或者指出!做了!会把结果添加到问题中!
void Game::GamePlay::PlayerController::OnCollision(sf::Vector2f vDir)
{

if (abs(vDir.x) > abs(vDir.y))
    {
        if (vDir.x > 0.0f)
        {
            //std::cout << "Right" << std::endl;
            //Collision on the right
            m_Velocity.x = 0.0f;
        }
        if (vDir.x < 0.0f)
        {
            //std::cout << "Left" << std::endl;
            //Collision on the left
            m_Velocity.x = 0.0f;
        }
        return;
    }
    else
    {
        if (vDir.y > 0.0f)
        {
            //std::cout << "Below" << std::endl;
            //Collision below
            m_Velocity.y = 0.0f;
            if (!m_bCanJump && m_RecentlyCollidedNode != nullptr)
            {
                m_RecentlyCollidedNode->ys += 3.f;
            }
            m_bCanJump = true;
        }
        if (vDir.y < 0.0f)
        {
            //std::cout << "Above" << std::endl;
            //Collision above
            m_Velocity.y = 0.0f;

        }
    }
}
inline sf::Vector2f NormVector(sf::Vector2f vec)
{
    float mag = getMagnitude(vec);
    return vec / mag;
}
if (colCheck.x == 0 && colCheck.y == 0)
{
    std::cout << "Zero Vector" << std::endl;
    float impulse = m_Velocity.x + m_Velocity.y;
    m_Velocity.x = 0;
    m_Velocity.y = 0;
    m_Velocity += NormVector(diff)*impulse;
}
else
{
    VDirNorm = NormVector(colCheck);
    dist = getMagnitude(colCheck) - m_fRadius;
}