C++ C++;导致对象消失的碰撞检测
我目前正在研究一些基本的2D刚体物理学,遇到了一个问题。我有一个功能,检查一个圆和一个AABB之间的碰撞,但有时圆(在这种情况下,玩家)会碰撞然后消失,如果我打印出发生这种情况时的位置,我只设置“nan” 解决方案: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 +
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
在代码层面上的作用,以及tOnCollision
确实如此。到目前为止,这些看起来像是最有可能的罪犯。抱歉!将添加更多细节。@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;
}