RCI*_*CIX 5 .net c# xna physics
我正在构建一个物理引擎,我有一些"伪verlet"的东西,我想把它升级到"真正的"verlet.所以我找到了一篇文章并开始工作.在我添加了我认为是一个很好的近似值后,引擎不再工作了.有人能帮助我理解我做错了什么吗?
我的主要物理体类的更新,应用力和应用脉冲系统:
public void Update(float timestepLength)
{
if (!this._isStatic)
{
Vector2 velocity = Vector2.Subtract(_position, _lastPosition);
Vector2 nextPos = _position + (_position - _lastPosition) + _acceleration * (timestepLength * timestepLength);
_lastPosition = _position;
_position = nextPos;
_acceleration = Vector2.Zero;
}
}
public void ApplyForce(Vector2 accelerationValue)
{
if (!this._isStatic)
_acceleration += (accelerationValue) * _mass;
}
public void ApplyImpulse(Vector2 impulse)
{
if (!this._isStatic)
_acceleration +=-1 * impulse;
}
Run Code Online (Sandbox Code Playgroud)
编辑: 我已修复它,它就像一个魅力,但我对以下代码有两个问题:
这是代码:
public Vector2 Position
{
get { return _position; }
set { _position = value;}
}
public void Update(float timestepLength)
{
if (!this._isStatic)
{
Vector2 velocity = Vector2.Subtract(_position, _lastPosition);
Vector2 velocityChange = Vector2.Subtract(velocity, Vector2.Subtract(_lastPosition, _twoStepsAgoPosition));
Vector2 nextPos = _position + (_position - _lastPosition) + _acceleration * (timestepLength * timestepLength);
_twoStepsAgoPosition = _lastPosition;
_lastPosition = _position;
_position = nextPos;
_acceleration = Vector2.Multiply(velocityChange, timestepLength);
}
}
public void ApplyForce(Vector2 force)
{
if (!this._isStatic)
_lastPosition -= force;
}
public void ApplyImpulse(Vector2 impulse)
{
if (!this._isStatic)
_acceleration +=-1 * impulse;
}
Run Code Online (Sandbox Code Playgroud)
作为其他人的参考...您可能引用的 Verlet 论文是这样的:由创建杀手的团队制作的高级角色物理,并且是第一个拥有基于布娃娃的物理的团队之一
不管怎样......他们使用的原始代码是:
void ParticleSystem::Verlet() {
for(int i=0; i<NUM_PARTICLES; i++) {
Vector3& x = m_x[i];
Vector3 temp = x;
Vector3& oldx = m_oldx[i];
Vector3& a = m_a[i];
x += x-oldx+a*fTimeStep*fTimeStep;
oldx = temp;
}
}
Run Code Online (Sandbox Code Playgroud)
你是对的,你的代码做了类似的事情。
总是让我的模拟失败的一件事是使用太大的时间步长。此外,通过 Verlet 集成,请确保您使用的时间步长在整个游戏中保持不变。(例如 30 帧/秒(因此时间步长为 1/30))并且不会波动。如果确实如此,您应该使用时间校正的 Verlet 积分来解决此问题
编辑:
问题2的答案:要移动你的位置(不改变速度/加速度)只需将位置更新到新位置,然后作为额外的步骤将此运动的增量(因此newPosition-oldPosition)添加到oldposs,这样就会更新因此。
问题1的答案:冲量是在一段时间内施加到物体上的力。所以你的解决方案是不正确的。冲动是在 X 个时间步长(或帧)内,您使用固定的力调用 applyForce 函数。
| 归档时间: |
|
| 查看次数: |
4394 次 |
| 最近记录: |