| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- // Copyright 2016 The G3N Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- package constraint
- import (
- "github.com/g3n/engine/physics/equation"
- "github.com/g3n/engine/math32"
- )
- // Hinge constraint.
- // Think of it as a door hinge.
- // It tries to keep the door in the correct place and with the correct orientation.
- type Hinge struct {
- PointToPoint
- axisA *math32.Vector3 // Rotation axis, defined locally in bodyA.
- axisB *math32.Vector3 // Rotation axis, defined locally in bodyB.
- rotEq1 *equation.Rotational
- rotEq2 *equation.Rotational
- motorEq *equation.RotationalMotor
- }
- // NewHinge creates and returns a pointer to a new Hinge constraint object.
- func NewHinge(bodyA, bodyB IBody, pivotA, pivotB, axisA, axisB *math32.Vector3, maxForce float32) *Hinge {
- hc := new(Hinge)
- hc.initialize(bodyA, bodyB, pivotA, pivotB, maxForce)
- hc.axisA = axisA
- hc.axisB = axisB
- hc.axisA.Normalize()
- hc.axisB.Normalize()
- hc.rotEq1 = equation.NewRotational(bodyA, bodyB, maxForce)
- hc.rotEq2 = equation.NewRotational(bodyA, bodyB, maxForce)
- hc.motorEq = equation.NewRotationalMotor(bodyA, bodyB, maxForce)
- hc.motorEq.SetEnabled(false) // Not enabled by default
- hc.equations = append(hc.equations, &hc.rotEq1.Equation)
- hc.equations = append(hc.equations, &hc.rotEq2.Equation)
- hc.equations = append(hc.equations, &hc.motorEq.Equation)
- return hc
- }
- func (hc *Hinge) SetMotorEnabled(state bool) {
- hc.motorEq.SetEnabled(state)
- }
- func (hc *Hinge) SetMotorSpeed(speed float32) {
- hc.motorEq.SetTargetSpeed(speed)
- }
- func (hc *Hinge) SetMotorMaxForce(maxForce float32) {
- hc.motorEq.SetMaxForce(maxForce)
- hc.motorEq.SetMinForce(-maxForce)
- }
- // Update updates the equations with data.
- func (hc *Hinge) Update() {
- hc.PointToPoint.Update()
- // Get world axes
- quatA := hc.bodyA.Quaternion()
- quatB := hc.bodyB.Quaternion()
- worldAxisA := hc.axisA.Clone().ApplyQuaternion(quatA)
- worldAxisB := hc.axisB.Clone().ApplyQuaternion(quatB)
- t1, t2 := worldAxisA.RandomTangents()
- hc.rotEq1.SetAxisA(t1)
- hc.rotEq2.SetAxisA(t2)
- hc.rotEq1.SetAxisB(worldAxisB)
- hc.rotEq2.SetAxisB(worldAxisB)
- if hc.motorEq.Enabled() {
- hc.motorEq.SetAxisA(hc.axisA.Clone().ApplyQuaternion(quatA))
- hc.motorEq.SetAxisB(hc.axisB.Clone().ApplyQuaternion(quatB))
- }
- }
|