RCI*_*CIX 2 .net c# xna physics restitution
我的物理引擎中有一个碰撞解决方法,如下所示:
Vector2 n1pos = n1.NonLinearSpace != null ? n1.NonLinearPosition : n1.Position;
Vector2 n2pos = n2.NonLinearSpace != null ? n2.NonLinearPosition : n2.Position;
Vector2 posDiff = n2pos - n1pos;
Vector2 posDiffNormal = posDiff;
posDiffNormal.Normalize();
float totalRadius = n1.Radius + n2.Radius;
float posDiffLength = posDiff.Length();
float interPenetration = totalRadius - posDiffLength;
float averageRestitution = (n1.RestitutionCoefficient + n2.RestitutionCoefficient) / 2;
Vector2 forceAmount = Vector2.Multiply(posDiffNormal, interPenetration);
Vector2 n1force =
(
(n1.Velocity * n1.Mass) +
(n2.Velocity * n2.Mass) +
n2.Mass * averageRestitution * (n2.Velocity - n1.Velocity)
) /
(n1.Mass + n2.Mass);
Vector2 n2force =
(
(n1.Velocity * n1.Mass) +
(n2.Velocity * n2.Mass) +
n1.Mass * averageRestitution * (n2.Velocity - n1.Velocity)
) /
(n1.Mass + n2.Mass);
n1.ApplyForce(???);
if (!n1.IsStatic)
{
n1.Position += ???;
}
n2.ApplyForce(???);
if (!n2.IsStatic)
{
n2.Position += ???;
}
Run Code Online (Sandbox Code Playgroud)
现在,我无法弄清楚应该对我的引擎中的物体应用什么来获得适当的恢复系数.(???部分).有人可以帮忙吗?
从这个问题和你的其他问题来看,你正试图在行走之前跑步.
小智 5
我意识到这是一个老问题,但我遇到了同样的问题,谷歌出现了这个页面.我想我可能会分享我的发现.首先,你必须意识到恢复系数是碰撞的属性,而不是碰撞中涉及的任何一个物体.也就是说,对于n个对象,您需要定义n(n-1)/ 2个恢复系数(每对对象一个).
然而,我研究过的物理引擎(Bullet,Chipmunk和Box2d)都将恢复原状定义为身体的属性.在碰撞时,它们将两个物体的恢复系数组合成单个值并在碰撞解决中使用它.显然,这在物理上是不正确的.但这对游戏来说并不重要:它只需要以直观的方式表现.以下是这些物理引擎使用的恢复函数:
restitution = body1->restitution * body2->restitutionrestitution = body1->restitution * body2->restitutionrestitution = max(body1->restitution, body2->restitution)Box2d允许用户在配置文件中自定义恢复功能.子弹和花栗鼠没有.
我建议你选择任何恢复混合功能感觉最好.只需稍微玩一下,看看你喜欢什么.
| 归档时间: |
|
| 查看次数: |
1791 次 |
| 最近记录: |