gpt4 book ai didi

c++ - 简单的二维碰撞问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:01:06 25 4
gpt4 key购买 nike

我想找出静止球和运动球之间何时发生碰撞,但我提出的算法有时无法检测到碰撞,运动球会穿过静止球。移动的球受重力影响,而静止的则不受。

这是我的碰撞检测代码:

GLfloat whenSpheresCollide(const sphere2d &firstSphere, const sphere2d &secondSphere)
{
Vector2f relativePosition = subtractVectors(firstSphere.vPosition, secondSphere.vPosition);
Vector2f relativeVelocity = subtractVectors(firstSphere.vVelocity, secondSphere.vVelocity);

GLfloat radiusSum = firstSphere.radius + secondSphere.radius;

//We'll find the time when objects collide if a collision takes place

//r(t) = P[0] + t * V[0]
//
//d^2(t) = P[0]^2 + 2 * t * P[0] * V[0] + t^2 * V[0]^2
//
//d^2(t) = V[0]^2 * t^2 + 2t( P[0] . V[0] ) + P[0]^2
//
//d(t) = R
//
//d(t)^2 = R^2
//
//V[0]^2 * t^2 + 2t( P[0] . V[0] ) + P[0]^2 - R^2 = 0
//
//delta = ( P[0] . V[0] )^2 - V[0]^2 * (P[0]^2 - R^2)
//
// We are interested in the lowest t:
//
//t = ( -( P[0] . V[0] ) - sqrt(delta) ) / V[0]^2
//

GLfloat equationDelta = squaref( dotProduct(relativePosition, relativeVelocity) ) - squarev( relativeVelocity ) * ( squarev( relativePosition ) - squaref(radiusSum) );

if (equationDelta >= 0.0f)
{
GLfloat collisionTime = ( - dotProduct(relativePosition, relativeVelocity) - sqrtf(equationDelta) ) / squarev(relativeVelocity);

if (collisionTime >= 0.0f && collisionTime <= 1.0f / GAME_FPS)
{
return collisionTime;
}
}

return -1.0f;
}

这里是调用碰撞检测的更新函数:

void GamePhysicsManager::updateBallPhysics()
{
//
//Update velocity
vVelocity->y -= constG / GAME_FPS; //v = a * t = g * 1 sec / (updates per second)

shouldApplyForcesToBall = TRUE;

vPosition->x += vVelocity->x / GAME_FPS;
vPosition->y += vVelocity->y / GAME_FPS;

if ( distanceBetweenVectors( *pBall->getPositionVector(), *pBasket->getPositionVector() ) <= pBasket->getRadius() + vectorLength(*vVelocity) / GAME_FPS )
{
//Ball sphere
sphere2d ballSphere;
ballSphere.radius = pBall->getRadius();
ballSphere.mass = 1.0f;
ballSphere.vPosition = *( pBall->getPositionVector() );
ballSphere.vVelocity = *( pBall->getVelocityVector() );


sphere2d ringSphereRight;
ringSphereRight.radius = 0.05f;
ringSphereRight.mass = -1.0f;
ringSphereRight.vPosition = *( pBasket->getPositionVector() );
//ringSphereRight.vPosition.x += pBasket->getRadius();
ringSphereRight.vPosition.x += (pBasket->getRadius() - ringSphereRight.radius);
ringSphereRight.vVelocity = zeroVector();


GLfloat collisionTime = whenSpheresCollide(ballSphere, ringSphereRight);

if ( collisionTime >= 0.0f )
{
DebugLog("collision");
respondToCollision(&ballSphere, &ringSphereRight, collisionTime, pBall->getRestitution() * 0.75f );
}

//
//Implement selection of the results that are first to collide collision

vVelocity->x = ballSphere.vVelocity.x;
vVelocity->y = ballSphere.vVelocity.y;

vPosition->x = ballSphere.vPosition.x;
vPosition->y = ballSphere.vPosition.y;
}

为什么没有在 100% 的情况下检测到碰撞?它仅在 70% 的情况下被检测到。谢谢。

更新:当我将 FPS 从 30 更改为 10 时,问题似乎已解决。FPS 如何影响我的碰撞检测?

最佳答案

delta = ( P[0] . V[0] )^2 - V[0]^2 * (P[0]^2 - R^2)

不应该是 delta = b2 - 4 ac 吗?


[编辑] 哦,我明白了,你把 4 排除在外了。在这种情况下,您确定要考虑 t 的两种解决方案吗?

t = ( -( P[0] . V[0] ) - sqrt(delta) ) / V[0]^2

t = ( -( P[0] . V[0] ) + sqrt(delta) ) / V[0]^2

关于c++ - 简单的二维碰撞问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2073510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com