Пример #1
0
func (c *Physics) Integrate(data *structs.Data, duration float64) {

	if data.InvMass <= 0 {
		return
	}

	if duration <= 0 {
		panic("Duration cant be zero")
	}

	// update linear position
	data.Position.Add(data.Velocity.Multiply(duration))

	// Work out the acceleration from the force
	resultingAcc := data.Acceleration.Clone()
	resultingAcc.Add(data.Forces.Multiply(data.InvMass))

	// update linear velocity from the acceleration
	data.Velocity.Add(resultingAcc.Multiply(duration))

	// impose drag
	data.Velocity = data.Velocity.Multiply(math.Pow(data.Damping, duration))

	// look in the direction where you want to go
	data.Orientation = data.Velocity.ToOrientation()
	// data.Orientation += data.Rotations * duration

	// clear forces
	c.Data.Forces.Clear()
}