public void Update(float dt, AccelFunc accelFunc) { var accel = accelFunc(this.position, this.velocity); this.position += this.velocity * dt; this.velocity += accel * dt; }
void StartSpringDumper() { _accelFunc = AccelFuncSpringDumper; _positionFunc = PositionFuncSpringDumper; _energyFunc = EnergyFuncSpring; ResetStates(); }
public void Set(Vector2 position, Vector2 velocity, float dt, AccelFunc accelFunc) { _prevPosition = position; this.velocity = velocity; var accel = accelFunc(position, velocity); this.position = _prevPosition + (velocity * dt) + (accel * (0.5f * dt * dt)); }
public void Update(float dt, AccelFunc accelFunc) { this.position += (this.velocity * dt) + (_accel * (0.5f * dt * dt)); var newAccel = accelFunc(this.position, this.velocity); // 速度が近似なのでこの加速度計算の速度による項はウソ。 this.velocity += (_accel + newAccel) * (0.5f * dt); _accel = newAccel; }
public void Update(float dt, AccelFunc accelFunc) { var accel = accelFunc(this.position, this.velocity); // 速度が近似なのでこの加速度計算の速度による項はウソ。 var newPosition = (this.position * 2f) - _prevPosition + (accel * (dt * dt)); _prevPosition = this.position; this.position = newPosition; this.velocity = (this.position - _prevPosition) / dt; // この速度は近似値。正しい計算には次の位置が必要。 }
void StartSpringDumper() { var position = new Vector2(300f, 0f); var velocity = Vector2.zero; _accelFunc = AccelFuncSpringDumper; _positionFunc = PositionFuncSpringDumper; _energyFunc = EnergyFuncSpring; _eulerState.Set(position, velocity, Time.fixedDeltaTime, _accelFunc); _semiImplicitEulerState.Set(position, velocity, Time.fixedDeltaTime, _accelFunc); _verletState.Set(position, velocity, Time.fixedDeltaTime, _accelFunc); }
public void Set(Vector2 position, Vector2 velocity, float dt, AccelFunc accelFunc) { this.position = position; this.velocity = velocity; Update(dt, accelFunc); }
public void Set(Vector2 position, Vector2 velocity, float dt, AccelFunc accelFunc) { this.position = position; this.velocity = velocity; _accel = accelFunc(position, velocity); }