gpt4 book ai didi

c++ - 将球体移动到平面永远不会预测 future 的碰撞

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

简短版:

如何正确地将重力添加到我的物理更新中?

详细版本:

我遇到一个问题,即移动球体到平面的通用碰撞算法(发布在下面以供引用)永远不会达到 future 碰撞将被检测到的点。我相信这是由于我的物理更新方式所致。

我对其进行了设置,以便只有在确定 future 会发生碰撞时,重力才会应用到物体上。所以在重力作用于一个物体之前,首先要进行碰撞检查。但是,由于始终假设 future 永远不会发生任何碰撞,因此永远不会施加重力。想象一个具有值的场景

spherePosition = (0, 5, 0)
sphereVelocity = (2, 0, 0)
sphereRadius = 1
planeOrigin = (0, 0, 0)
planeNormal = (0, 1, 0)

这将始终假设球体与平面平行移动。因此,永远不会应用重力。

我的更新比较简单,比如

mAcceleration = mTotalForces / mMass;
Vector3 translation = (mVelocity * fElapsedTime) + 0.5 * mAcceleration * pow(fElapsedTime, 2);
mVelocity += mAcceleration * fElapsedTime;

所以操作顺序大致是

int collisionResult = checkCollision(sphere, plane);
if(collisionResult == 2)
{
sphere.applyGravity(); // Just sets "mAcceleration" to (0, -9.81, 0). Which is then removed by my physics update.
}
sphere.update(timeSlice);

综上所述,我应该何时在物理更新循环中将重力应用于我的对象以及如何?如果我在碰撞检查之前应用它,那么在碰撞检查期间就没有关系,如果我在之后进行,因为如果将来有碰撞,我的更新应该如何调整?

碰撞检查引用:

int IntersectMovingSpherePlane(float sphereRadius, const Vector3& sphereCenter, const Vector3& sphereVelocity, const Vector3& planeNormal,
const Vector3& planeOrigin, float planeD, float &t, Vector3 &q)
{
// Compute distance of sphere center to plane
float dist = Vec3Dot(&planeNormal, &sphereCenter) - planeD;
if (fabs(dist) <= sphereRadius) {
// The sphere is already overlapping the plane. Set time of
// intersection to zero and q to sphere center
t = 0.0f;
q = sphereCenter;
return 0;
} else {
float denom = Vec3Dot(&planeNormal, &sphereVelocity);
if (denom * dist >= 0.0f) {
// No intersection as sphere moving parallel to or away from plane
return 1;
} else {
// Sphere is moving towards the plane

// Use +r in computations if sphere in front of plane, else -r
float r = dist > 0.0f ? sphereRadius : -sphereRadius;
t = (r - dist) / denom;
q = sphereCenter + t * sphereVelocity - sphereRadius * planeNormal;
return 2;
}
}
}

最佳答案

可能这里最简单的方法是使重力成为 mTotalForces 的一部分。

更物理的方法是让重力成为一个单独的加速度。然后添加到 `mTotalForces/mMass"以获得最终的加速度值。

编辑

Vector3 平移 = (mVelocity * fElapsedTime) + 0.5 * mAcceleration * pow(fElapsedTime, 2);

看来您的代码是用于匀速运动的。但是如果你想让一个球在落地后停止掉落,它是不均匀的。

对于这种非匀速运动,通常我们只是将时间范围 segmentation ,在很短的时间内进行匀速计算,可以认为运动是匀速的,而忽略累积误差。

关于c++ - 将球体移动到平面永远不会预测 future 的碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10592729/

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