Tôi đang xây dựng một công cụ vật lý và tôi đã có một số loại "pseudo-verlet" điều đi và tôi muốn nâng cấp nó lên "thực" verlet. Vì vậy, tôi tìm thấy một bài báo và thiết lập để làm việc. Sau khi tôi thêm vào những gì tôi nghĩ là một xấp xỉ tốt, động cơ không hoạt động nữa. Ai đó có thể giúp tôi hiểu những gì tôi đang làm sai? cập nhậtTích hợp Verlet được thổi lên động cơ vật lý của tôi
chính lớp cơ thể vật lý của tôi, áp dụng có hiệu lực, và áp dụng hệ thống xung:
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;
}
Edit: Tôi đã khắc phục nó và nó hoạt động như một nét duyên dáng, nhưng tôi có hai câu hỏi về mã sau:
- Mã ứng dụng xung có chính xác không và nếu không phải là mã nào?
- Làm cách nào để thay đổi thuộc tính vị trí để cài đặt giữ nguyên vận tốc hiện tại của cơ thể?
Đây là mã:
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;
}
Tại sao không: _acceleration - = xung; ? –
Actualy không nghĩ về điều đó ... Cảm ơn! – RCIX