func (this *PivotJoint) PreStep(dt float32) { a, b := this.BodyA, this.BodyB this.r1 = transform.RotateVect(this.Anchor1, transform.Rotation{a.rot.X, a.rot.Y}) this.r2 = transform.RotateVect(this.Anchor2, transform.Rotation{b.rot.X, b.rot.Y}) // Calculate mass tensor k_tensor(a, b, this.r1, this.r2, &this.k1, &this.k2) // compute max impulse this.jMaxLen = this.MaxForce * dt // calculate bias velocity delta := vect.Sub(vect.Add(b.p, this.r2), vect.Add(a.p, this.r1)) this.bias = vect.Clamp(vect.Mult(delta, -bias_coef(this.ErrorBias, dt)/dt), this.MaxBias) }
func (arb *Arbiter) applyCachedImpulse2(dt_coef float32) { if arb.state == arbiterStateFirstColl && arb.NumContacts > 0 { return } //println("asd") a := arb.ShapeA.Body b := arb.ShapeB.Body for _, con := range arb.Contacts { j := transform.RotateVect(con.n, transform.Rotation{con.jnAcc, con.jtAcc}) apply_impulses(a, b, con.r1, con.r2, vect.Mult(j, dt_coef)) } }
func (spring *DampedSpring) PreStep(dt float32) { a := spring.BodyA b := spring.BodyB spring.r1 = transform.RotateVect(spring.Anchor1, transform.Rotation{a.rot.X, a.rot.Y}) spring.r2 = transform.RotateVect(spring.Anchor2, transform.Rotation{a.rot.X, a.rot.Y}) delta := vect.Sub(vect.Add(b.p, spring.r2), vect.Add(a.p, spring.r1)) dist := vect.Length(delta) if dist == 0 { dist = float32(math.Inf(1)) } spring.n = vect.Mult(delta, 1.0/dist) k := k_scalar(a, b, spring.r1, spring.r2, spring.n) spring.nMass = 1.0 / k spring.targetVRN = 0.0 spring.vCoef = float32(1.0 - math.Exp(float64(-spring.Damping*dt*k))) fSpring := spring.SpringForceFunc(spring, dist) apply_impulses(a, b, spring.r1, spring.r2, vect.Mult(spring.n, fSpring*dt)) }
func (arb *Arbiter) applyImpulse3() { a := arb.ShapeA.Body b := arb.ShapeB.Body for i := 0; i < arb.NumContacts; i++ { con := arb.Contacts[i] n := con.n r1 := con.r1 r2 := con.r2 // Calculate the relative bias velocities. vb1 := vect.Add(a.v_bias, vect.Mult(vect.Perp(r1), a.w_bias)) vb2 := vect.Add(b.v_bias, vect.Mult(vect.Perp(r2), b.w_bias)) vbn := vect.Dot(vect.Sub(vb2, vb1), n) // Calculate the relative velocity. vr := relative_velocity(a, b, r1, r2) vrn := vect.Dot(vr, n) // Calculate the relative tangent velocity. vrt := vect.Dot(vect.Add(vr, arb.Surface_vr), vect.Perp(n)) // Calculate and clamp the bias impulse. jbn := (con.bias - vbn) * con.nMass jbnOld := con.jBias con.jBias = vect.FMax(jbnOld+jbn, 0.0) // Calculate and clamp the normal impulse. jn := -(con.bounce + vrn) * con.nMass jnOld := con.jnAcc con.jnAcc = vect.FMax(jnOld+jn, 0.0) // Calculate and clamp the friction impulse. jtMax := arb.u * con.jnAcc jt := -vrt * con.tMass jtOld := con.jtAcc con.jtAcc = vect.FClamp(jtOld+jt, -jtMax, jtMax) // Apply the bias impulse. apply_bias_impulses(a, b, r1, r2, vect.Mult(n, con.jBias-jbnOld)) // Apply the final impulse. apply_impulses(a, b, r1, r2, transform.RotateVect(n, transform.Rotation{con.jnAcc - jnOld, con.jtAcc - jtOld})) } }