MCPcopy
hub / github.com/g3n/engine / createFrictionFromAverage

Method createFrictionFromAverage

experimental/physics/narrowphase.go:80–131  ·  view source on GitHub ↗

TODO test this

(contactEqs []*equation.Contact)

Source from the content-addressed store, hash-verified

78
79// TODO test this
80func (n *Narrowphase) createFrictionFromAverage(contactEqs []*equation.Contact) (*equation.Friction, *equation.Friction) {
81
82 // The last contactEquation
83 lastContactEq := contactEqs[len(contactEqs)-1]
84
85 // Create a friction equation based on the last contact (we will modify it to take into account all contacts)
86 fEq1, fEq2 := n.createFrictionEquationsFromContact(lastContactEq)
87 if (fEq1 == nil && fEq2 == nil) || len(contactEqs) == 1 {
88 return fEq1, fEq2
89 }
90
91 averageNormal := math32.NewVec3()
92 averageContactPointA := math32.NewVec3()
93 averageContactPointB := math32.NewVec3()
94
95 bodyA := lastContactEq.BodyA()
96 //bodyB := lastContactEq.BodyB()
97 normal := lastContactEq.Normal()
98 rA := lastContactEq.RA()
99 rB := lastContactEq.RB()
100
101 for _, cEq := range contactEqs {
102 if cEq.BodyA() != bodyA {
103 averageNormal.Add(&normal)
104 averageContactPointA.Add(&rA)
105 averageContactPointB.Add(&rB)
106 } else {
107 averageNormal.Sub(&normal)
108 averageContactPointA.Add(&rB)
109 averageContactPointB.Add(&rA)
110 }
111 }
112
113 invNumContacts := float32(1) / float32(len(contactEqs))
114
115 averageContactPointA.MultiplyScalar(invNumContacts)
116 averageContactPointB.MultiplyScalar(invNumContacts)
117
118 // Should be the same for both friction equations
119 fEq1.SetRA(averageContactPointA)
120 fEq1.SetRB(averageContactPointB)
121 fEq2.SetRA(averageContactPointA)
122 fEq2.SetRB(averageContactPointB)
123
124 // Set tangents
125 averageNormal.Normalize()
126 t1, t2 := averageNormal.RandomTangents()
127 fEq1.SetTangent(t1)
128 fEq2.SetTangent(t2)
129
130 return fEq1, fEq2
131}
132
133// GenerateEquations is the Narrowphase entry point.
134func (n *Narrowphase) GenerateEquations(pairs []CollisionPair) ([]*equation.Contact, []*equation.Friction) {

Callers

nothing calls this directly

Calls 14

NewVec3Function · 0.92
RandomTangentsMethod · 0.80
SetTangentMethod · 0.80
BodyAMethod · 0.65
NormalMethod · 0.45
RAMethod · 0.45
RBMethod · 0.45
AddMethod · 0.45
SubMethod · 0.45
MultiplyScalarMethod · 0.45
SetRAMethod · 0.45

Tested by

no test coverage detected