pbox2d 0.6.0-java → 0.8.0-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.mvn/extensions.xml +8 -0
- data/.mvn/wrapper/maven-wrapper.properties +1 -0
- data/.travis.yml +23 -0
- data/CHANGELOG.md +8 -0
- data/README.md +7 -7
- data/Rakefile +1 -2
- data/lib/box2d.jar +0 -0
- data/lib/pbox2d/version.rb +1 -1
- data/lib/pbox2d.rb +1 -0
- data/pbox2d.gemspec +6 -11
- data/pom.rb +59 -0
- data/pom.xml +82 -73
- data/src/org/jbox2d/JBox2D.gwt.xml +12 -0
- data/src/org/jbox2d/callbacks/ContactAdaptor.java +27 -0
- data/src/org/jbox2d/callbacks/ContactFilter.java +59 -0
- data/src/org/jbox2d/callbacks/ContactImpulse.java +42 -0
- data/src/org/jbox2d/callbacks/ContactListener.java +87 -0
- data/src/org/jbox2d/callbacks/DebugDraw.java +297 -0
- data/src/org/jbox2d/callbacks/DestructionListener.java +53 -0
- data/src/org/jbox2d/callbacks/PairCallback.java +29 -0
- data/src/org/jbox2d/callbacks/ParticleDestructionListener.java +20 -0
- data/src/org/jbox2d/callbacks/ParticleQueryCallback.java +19 -0
- data/src/org/jbox2d/callbacks/ParticleRaycastCallback.java +19 -0
- data/src/org/jbox2d/callbacks/QueryCallback.java +45 -0
- data/src/org/jbox2d/callbacks/RayCastCallback.java +55 -0
- data/src/org/jbox2d/callbacks/TreeCallback.java +42 -0
- data/src/org/jbox2d/callbacks/TreeRayCastCallback.java +44 -0
- data/src/org/jbox2d/collision/AABB.java +338 -0
- data/src/org/jbox2d/collision/Collision.java +1444 -0
- data/src/org/jbox2d/collision/ContactID.java +106 -0
- data/src/org/jbox2d/collision/Distance.java +773 -0
- data/src/org/jbox2d/collision/DistanceInput.java +41 -0
- data/src/org/jbox2d/collision/DistanceOutput.java +43 -0
- data/src/org/jbox2d/collision/Manifold.java +116 -0
- data/src/org/jbox2d/collision/ManifoldPoint.java +104 -0
- data/src/org/jbox2d/collision/RayCastInput.java +47 -0
- data/src/org/jbox2d/collision/RayCastOutput.java +46 -0
- data/src/org/jbox2d/collision/TimeOfImpact.java +526 -0
- data/src/org/jbox2d/collision/WorldManifold.java +200 -0
- data/src/org/jbox2d/collision/broadphase/BroadPhase.java +92 -0
- data/src/org/jbox2d/collision/broadphase/BroadPhaseStrategy.java +88 -0
- data/src/org/jbox2d/collision/broadphase/DefaultBroadPhaseBuffer.java +268 -0
- data/src/org/jbox2d/collision/broadphase/DynamicTree.java +883 -0
- data/src/org/jbox2d/collision/broadphase/DynamicTreeFlatNodes.java +873 -0
- data/src/org/jbox2d/collision/broadphase/DynamicTreeNode.java +54 -0
- data/src/org/jbox2d/collision/broadphase/Pair.java +46 -0
- data/src/org/jbox2d/collision/shapes/ChainShape.java +264 -0
- data/src/org/jbox2d/collision/shapes/CircleShape.java +207 -0
- data/src/org/jbox2d/collision/shapes/EdgeShape.java +254 -0
- data/src/org/jbox2d/collision/shapes/MassData.java +105 -0
- data/src/org/jbox2d/collision/shapes/PolygonShape.java +718 -0
- data/src/org/jbox2d/collision/shapes/Shape.java +136 -0
- data/src/org/jbox2d/collision/shapes/ShapeType.java +32 -0
- data/src/org/jbox2d/common/BufferUtils.java +209 -0
- data/src/org/jbox2d/common/Color3f.java +88 -0
- data/src/org/jbox2d/common/IViewportTransform.java +133 -0
- data/src/org/jbox2d/common/Mat22.java +609 -0
- data/src/org/jbox2d/common/Mat33.java +290 -0
- data/src/org/jbox2d/common/MathUtils.java +335 -0
- data/src/org/jbox2d/common/OBBViewportTransform.java +174 -0
- data/src/org/jbox2d/common/PlatformMathUtils.java +46 -0
- data/src/org/jbox2d/common/RaycastResult.java +37 -0
- data/src/org/jbox2d/common/Rot.java +150 -0
- data/src/org/jbox2d/common/Settings.java +246 -0
- data/src/org/jbox2d/common/Sweep.java +116 -0
- data/src/org/jbox2d/common/Timer.java +46 -0
- data/src/org/jbox2d/common/Transform.java +203 -0
- data/src/org/jbox2d/common/Vec2.java +388 -0
- data/src/org/jbox2d/common/Vec3.java +170 -0
- data/src/org/jbox2d/dynamics/Body.java +1246 -0
- data/src/org/jbox2d/dynamics/BodyDef.java +382 -0
- data/src/org/jbox2d/dynamics/BodyType.java +41 -0
- data/src/org/jbox2d/dynamics/ContactManager.java +293 -0
- data/src/org/jbox2d/dynamics/Filter.java +62 -0
- data/src/org/jbox2d/dynamics/Fixture.java +454 -0
- data/src/org/jbox2d/dynamics/FixtureDef.java +214 -0
- data/src/org/jbox2d/dynamics/FixtureProxy.java +38 -0
- data/src/org/jbox2d/dynamics/Island.java +602 -0
- data/src/org/jbox2d/dynamics/Profile.java +97 -0
- data/src/org/jbox2d/dynamics/SolverData.java +33 -0
- data/src/org/jbox2d/dynamics/TimeStep.java +46 -0
- data/src/org/jbox2d/dynamics/World.java +2075 -0
- data/src/org/jbox2d/dynamics/contacts/ChainAndCircleContact.java +57 -0
- data/src/org/jbox2d/dynamics/contacts/ChainAndPolygonContact.java +57 -0
- data/src/org/jbox2d/dynamics/contacts/CircleContact.java +50 -0
- data/src/org/jbox2d/dynamics/contacts/Contact.java +365 -0
- data/src/org/jbox2d/dynamics/contacts/ContactCreator.java +35 -0
- data/src/org/jbox2d/dynamics/contacts/ContactEdge.java +56 -0
- data/src/org/jbox2d/dynamics/contacts/ContactPositionConstraint.java +49 -0
- data/src/org/jbox2d/dynamics/contacts/ContactRegister.java +31 -0
- data/src/org/jbox2d/dynamics/contacts/ContactSolver.java +1104 -0
- data/src/org/jbox2d/dynamics/contacts/ContactVelocityConstraint.java +60 -0
- data/src/org/jbox2d/dynamics/contacts/EdgeAndCircleContact.java +52 -0
- data/src/org/jbox2d/dynamics/contacts/EdgeAndPolygonContact.java +52 -0
- data/src/org/jbox2d/dynamics/contacts/PolygonAndCircleContact.java +51 -0
- data/src/org/jbox2d/dynamics/contacts/PolygonContact.java +50 -0
- data/src/org/jbox2d/dynamics/contacts/Position.java +31 -0
- data/src/org/jbox2d/dynamics/contacts/Velocity.java +31 -0
- data/src/org/jbox2d/dynamics/joints/ConstantVolumeJoint.java +258 -0
- data/src/org/jbox2d/dynamics/joints/ConstantVolumeJointDef.java +75 -0
- data/src/org/jbox2d/dynamics/joints/DistanceJoint.java +356 -0
- data/src/org/jbox2d/dynamics/joints/DistanceJointDef.java +106 -0
- data/src/org/jbox2d/dynamics/joints/FrictionJoint.java +294 -0
- data/src/org/jbox2d/dynamics/joints/FrictionJointDef.java +78 -0
- data/src/org/jbox2d/dynamics/joints/GearJoint.java +520 -0
- data/src/org/jbox2d/dynamics/joints/GearJointDef.java +58 -0
- data/src/org/jbox2d/dynamics/joints/Jacobian.java +32 -0
- data/src/org/jbox2d/dynamics/joints/Joint.java +235 -0
- data/src/org/jbox2d/dynamics/joints/JointDef.java +65 -0
- data/src/org/jbox2d/dynamics/joints/JointEdge.java +57 -0
- data/src/org/jbox2d/dynamics/joints/JointType.java +28 -0
- data/src/org/jbox2d/dynamics/joints/LimitState.java +28 -0
- data/src/org/jbox2d/dynamics/joints/MotorJoint.java +339 -0
- data/src/org/jbox2d/dynamics/joints/MotorJointDef.java +55 -0
- data/src/org/jbox2d/dynamics/joints/MouseJoint.java +262 -0
- data/src/org/jbox2d/dynamics/joints/MouseJointDef.java +62 -0
- data/src/org/jbox2d/dynamics/joints/PrismaticJoint.java +808 -0
- data/src/org/jbox2d/dynamics/joints/PrismaticJointDef.java +120 -0
- data/src/org/jbox2d/dynamics/joints/PulleyJoint.java +393 -0
- data/src/org/jbox2d/dynamics/joints/PulleyJointDef.java +105 -0
- data/src/org/jbox2d/dynamics/joints/RevoluteJoint.java +554 -0
- data/src/org/jbox2d/dynamics/joints/RevoluteJointDef.java +137 -0
- data/src/org/jbox2d/dynamics/joints/RopeJoint.java +276 -0
- data/src/org/jbox2d/dynamics/joints/RopeJointDef.java +34 -0
- data/src/org/jbox2d/dynamics/joints/WeldJoint.java +424 -0
- data/src/org/jbox2d/dynamics/joints/WeldJointDef.java +85 -0
- data/src/org/jbox2d/dynamics/joints/WheelJoint.java +498 -0
- data/src/org/jbox2d/dynamics/joints/WheelJointDef.java +98 -0
- data/src/org/jbox2d/particle/ParticleBodyContact.java +17 -0
- data/src/org/jbox2d/particle/ParticleColor.java +52 -0
- data/src/org/jbox2d/particle/ParticleContact.java +14 -0
- data/src/org/jbox2d/particle/ParticleDef.java +24 -0
- data/src/org/jbox2d/particle/ParticleGroup.java +154 -0
- data/src/org/jbox2d/particle/ParticleGroupDef.java +62 -0
- data/src/org/jbox2d/particle/ParticleGroupType.java +8 -0
- data/src/org/jbox2d/particle/ParticleSystem.java +2172 -0
- data/src/org/jbox2d/particle/ParticleType.java +28 -0
- data/src/org/jbox2d/particle/StackQueue.java +44 -0
- data/src/org/jbox2d/particle/VoronoiDiagram.java +209 -0
- data/src/org/jbox2d/pooling/IDynamicStack.java +47 -0
- data/src/org/jbox2d/pooling/IOrderedStack.java +57 -0
- data/src/org/jbox2d/pooling/IWorldPool.java +101 -0
- data/src/org/jbox2d/pooling/arrays/FloatArray.java +50 -0
- data/src/org/jbox2d/pooling/arrays/GeneratorArray.java +33 -0
- data/src/org/jbox2d/pooling/arrays/IntArray.java +53 -0
- data/src/org/jbox2d/pooling/arrays/Vec2Array.java +57 -0
- data/src/org/jbox2d/pooling/normal/CircleStack.java +77 -0
- data/src/org/jbox2d/pooling/normal/DefaultWorldPool.java +331 -0
- data/src/org/jbox2d/pooling/normal/MutableStack.java +72 -0
- data/src/org/jbox2d/pooling/normal/OrderedStack.java +73 -0
- data/src/org/jbox2d/pooling/stacks/DynamicIntStack.java +60 -0
- metadata +161 -14
- data/lib/jbox2d-library-2.3.1-SNAPSHOT.jar +0 -0
@@ -0,0 +1,554 @@
|
|
1
|
+
/*******************************************************************************
|
2
|
+
* Copyright (c) 2013, Daniel Murphy
|
3
|
+
* All rights reserved.
|
4
|
+
*
|
5
|
+
* Redistribution and use in source and binary forms, with or without modification,
|
6
|
+
* are permitted provided that the following conditions are met:
|
7
|
+
* * Redistributions of source code must retain the above copyright notice,
|
8
|
+
* this list of conditions and the following disclaimer.
|
9
|
+
* * Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
* this list of conditions and the following disclaimer in the documentation
|
11
|
+
* and/or other materials provided with the distribution.
|
12
|
+
*
|
13
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
14
|
+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
15
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
16
|
+
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
17
|
+
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
18
|
+
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
19
|
+
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
20
|
+
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
21
|
+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
22
|
+
* POSSIBILITY OF SUCH DAMAGE.
|
23
|
+
******************************************************************************/
|
24
|
+
package org.jbox2d.dynamics.joints;
|
25
|
+
|
26
|
+
import org.jbox2d.common.Mat22;
|
27
|
+
import org.jbox2d.common.Mat33;
|
28
|
+
import org.jbox2d.common.MathUtils;
|
29
|
+
import org.jbox2d.common.Rot;
|
30
|
+
import org.jbox2d.common.Settings;
|
31
|
+
import org.jbox2d.common.Vec2;
|
32
|
+
import org.jbox2d.common.Vec3;
|
33
|
+
import org.jbox2d.dynamics.Body;
|
34
|
+
import org.jbox2d.dynamics.SolverData;
|
35
|
+
import org.jbox2d.pooling.IWorldPool;
|
36
|
+
|
37
|
+
//Point-to-point constraint
|
38
|
+
//C = p2 - p1
|
39
|
+
//Cdot = v2 - v1
|
40
|
+
// = v2 + cross(w2, r2) - v1 - cross(w1, r1)
|
41
|
+
//J = [-I -r1_skew I r2_skew ]
|
42
|
+
//Identity used:
|
43
|
+
//w k % (rx i + ry j) = w * (-ry i + rx j)
|
44
|
+
|
45
|
+
//Motor constraint
|
46
|
+
//Cdot = w2 - w1
|
47
|
+
//J = [0 0 -1 0 0 1]
|
48
|
+
//K = invI1 + invI2
|
49
|
+
|
50
|
+
/**
|
51
|
+
* A revolute joint constrains two bodies to share a common point while they are free to rotate
|
52
|
+
* about the point. The relative rotation about the shared point is the joint angle. You can limit
|
53
|
+
* the relative rotation with a joint limit that specifies a lower and upper angle. You can use a
|
54
|
+
* motor to drive the relative rotation about the shared point. A maximum motor torque is provided
|
55
|
+
* so that infinite forces are not generated.
|
56
|
+
*
|
57
|
+
* @author Daniel Murphy
|
58
|
+
*/
|
59
|
+
public class RevoluteJoint extends Joint {
|
60
|
+
|
61
|
+
// Solver shared
|
62
|
+
protected final Vec2 m_localAnchorA = new Vec2();
|
63
|
+
protected final Vec2 m_localAnchorB = new Vec2();
|
64
|
+
private final Vec3 m_impulse = new Vec3();
|
65
|
+
private float m_motorImpulse;
|
66
|
+
|
67
|
+
private boolean m_enableMotor;
|
68
|
+
private float m_maxMotorTorque;
|
69
|
+
private float m_motorSpeed;
|
70
|
+
|
71
|
+
private boolean m_enableLimit;
|
72
|
+
protected float m_referenceAngle;
|
73
|
+
private float m_lowerAngle;
|
74
|
+
private float m_upperAngle;
|
75
|
+
|
76
|
+
// Solver temp
|
77
|
+
private int m_indexA;
|
78
|
+
private int m_indexB;
|
79
|
+
private final Vec2 m_rA = new Vec2();
|
80
|
+
private final Vec2 m_rB = new Vec2();
|
81
|
+
private final Vec2 m_localCenterA = new Vec2();
|
82
|
+
private final Vec2 m_localCenterB = new Vec2();
|
83
|
+
private float m_invMassA;
|
84
|
+
private float m_invMassB;
|
85
|
+
private float m_invIA;
|
86
|
+
private float m_invIB;
|
87
|
+
private final Mat33 m_mass = new Mat33(); // effective mass for point-to-point constraint.
|
88
|
+
private float m_motorMass; // effective mass for motor/limit angular constraint.
|
89
|
+
private LimitState m_limitState;
|
90
|
+
|
91
|
+
protected RevoluteJoint(IWorldPool argWorld, RevoluteJointDef def) {
|
92
|
+
super(argWorld, def);
|
93
|
+
m_localAnchorA.set(def.localAnchorA);
|
94
|
+
m_localAnchorB.set(def.localAnchorB);
|
95
|
+
m_referenceAngle = def.referenceAngle;
|
96
|
+
|
97
|
+
m_motorImpulse = 0;
|
98
|
+
|
99
|
+
m_lowerAngle = def.lowerAngle;
|
100
|
+
m_upperAngle = def.upperAngle;
|
101
|
+
m_maxMotorTorque = def.maxMotorTorque;
|
102
|
+
m_motorSpeed = def.motorSpeed;
|
103
|
+
m_enableLimit = def.enableLimit;
|
104
|
+
m_enableMotor = def.enableMotor;
|
105
|
+
m_limitState = LimitState.INACTIVE;
|
106
|
+
}
|
107
|
+
|
108
|
+
@Override
|
109
|
+
public void initVelocityConstraints(final SolverData data) {
|
110
|
+
m_indexA = m_bodyA.m_islandIndex;
|
111
|
+
m_indexB = m_bodyB.m_islandIndex;
|
112
|
+
m_localCenterA.set(m_bodyA.m_sweep.localCenter);
|
113
|
+
m_localCenterB.set(m_bodyB.m_sweep.localCenter);
|
114
|
+
m_invMassA = m_bodyA.m_invMass;
|
115
|
+
m_invMassB = m_bodyB.m_invMass;
|
116
|
+
m_invIA = m_bodyA.m_invI;
|
117
|
+
m_invIB = m_bodyB.m_invI;
|
118
|
+
|
119
|
+
// Vec2 cA = data.positions[m_indexA].c;
|
120
|
+
float aA = data.positions[m_indexA].a;
|
121
|
+
Vec2 vA = data.velocities[m_indexA].v;
|
122
|
+
float wA = data.velocities[m_indexA].w;
|
123
|
+
|
124
|
+
// Vec2 cB = data.positions[m_indexB].c;
|
125
|
+
float aB = data.positions[m_indexB].a;
|
126
|
+
Vec2 vB = data.velocities[m_indexB].v;
|
127
|
+
float wB = data.velocities[m_indexB].w;
|
128
|
+
final Rot qA = pool.popRot();
|
129
|
+
final Rot qB = pool.popRot();
|
130
|
+
final Vec2 temp = pool.popVec2();
|
131
|
+
|
132
|
+
qA.set(aA);
|
133
|
+
qB.set(aB);
|
134
|
+
|
135
|
+
// Compute the effective masses.
|
136
|
+
Rot.mulToOutUnsafe(qA, temp.set(m_localAnchorA).subLocal(m_localCenterA), m_rA);
|
137
|
+
Rot.mulToOutUnsafe(qB, temp.set(m_localAnchorB).subLocal(m_localCenterB), m_rB);
|
138
|
+
|
139
|
+
// J = [-I -r1_skew I r2_skew]
|
140
|
+
// [ 0 -1 0 1]
|
141
|
+
// r_skew = [-ry; rx]
|
142
|
+
|
143
|
+
// Matlab
|
144
|
+
// K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]
|
145
|
+
// [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]
|
146
|
+
// [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]
|
147
|
+
|
148
|
+
float mA = m_invMassA, mB = m_invMassB;
|
149
|
+
float iA = m_invIA, iB = m_invIB;
|
150
|
+
|
151
|
+
boolean fixedRotation = (iA + iB == 0.0f);
|
152
|
+
|
153
|
+
m_mass.ex.x = mA + mB + m_rA.y * m_rA.y * iA + m_rB.y * m_rB.y * iB;
|
154
|
+
m_mass.ey.x = -m_rA.y * m_rA.x * iA - m_rB.y * m_rB.x * iB;
|
155
|
+
m_mass.ez.x = -m_rA.y * iA - m_rB.y * iB;
|
156
|
+
m_mass.ex.y = m_mass.ey.x;
|
157
|
+
m_mass.ey.y = mA + mB + m_rA.x * m_rA.x * iA + m_rB.x * m_rB.x * iB;
|
158
|
+
m_mass.ez.y = m_rA.x * iA + m_rB.x * iB;
|
159
|
+
m_mass.ex.z = m_mass.ez.x;
|
160
|
+
m_mass.ey.z = m_mass.ez.y;
|
161
|
+
m_mass.ez.z = iA + iB;
|
162
|
+
|
163
|
+
m_motorMass = iA + iB;
|
164
|
+
if (m_motorMass > 0.0f) {
|
165
|
+
m_motorMass = 1.0f / m_motorMass;
|
166
|
+
}
|
167
|
+
|
168
|
+
if (m_enableMotor == false || fixedRotation) {
|
169
|
+
m_motorImpulse = 0.0f;
|
170
|
+
}
|
171
|
+
|
172
|
+
if (m_enableLimit && fixedRotation == false) {
|
173
|
+
float jointAngle = aB - aA - m_referenceAngle;
|
174
|
+
if (MathUtils.abs(m_upperAngle - m_lowerAngle) < 2.0f * Settings.angularSlop) {
|
175
|
+
m_limitState = LimitState.EQUAL;
|
176
|
+
} else if (jointAngle <= m_lowerAngle) {
|
177
|
+
if (m_limitState != LimitState.AT_LOWER) {
|
178
|
+
m_impulse.z = 0.0f;
|
179
|
+
}
|
180
|
+
m_limitState = LimitState.AT_LOWER;
|
181
|
+
} else if (jointAngle >= m_upperAngle) {
|
182
|
+
if (m_limitState != LimitState.AT_UPPER) {
|
183
|
+
m_impulse.z = 0.0f;
|
184
|
+
}
|
185
|
+
m_limitState = LimitState.AT_UPPER;
|
186
|
+
} else {
|
187
|
+
m_limitState = LimitState.INACTIVE;
|
188
|
+
m_impulse.z = 0.0f;
|
189
|
+
}
|
190
|
+
} else {
|
191
|
+
m_limitState = LimitState.INACTIVE;
|
192
|
+
}
|
193
|
+
|
194
|
+
if (data.step.warmStarting) {
|
195
|
+
final Vec2 P = pool.popVec2();
|
196
|
+
// Scale impulses to support a variable time step.
|
197
|
+
m_impulse.x *= data.step.dtRatio;
|
198
|
+
m_impulse.y *= data.step.dtRatio;
|
199
|
+
m_motorImpulse *= data.step.dtRatio;
|
200
|
+
|
201
|
+
P.x = m_impulse.x;
|
202
|
+
P.y = m_impulse.y;
|
203
|
+
|
204
|
+
vA.x -= mA * P.x;
|
205
|
+
vA.y -= mA * P.y;
|
206
|
+
wA -= iA * (Vec2.cross(m_rA, P) + m_motorImpulse + m_impulse.z);
|
207
|
+
|
208
|
+
vB.x += mB * P.x;
|
209
|
+
vB.y += mB * P.y;
|
210
|
+
wB += iB * (Vec2.cross(m_rB, P) + m_motorImpulse + m_impulse.z);
|
211
|
+
pool.pushVec2(1);
|
212
|
+
} else {
|
213
|
+
m_impulse.setZero();
|
214
|
+
m_motorImpulse = 0.0f;
|
215
|
+
}
|
216
|
+
// data.velocities[m_indexA].v.set(vA);
|
217
|
+
data.velocities[m_indexA].w = wA;
|
218
|
+
// data.velocities[m_indexB].v.set(vB);
|
219
|
+
data.velocities[m_indexB].w = wB;
|
220
|
+
|
221
|
+
pool.pushVec2(1);
|
222
|
+
pool.pushRot(2);
|
223
|
+
}
|
224
|
+
|
225
|
+
@Override
|
226
|
+
public void solveVelocityConstraints(final SolverData data) {
|
227
|
+
Vec2 vA = data.velocities[m_indexA].v;
|
228
|
+
float wA = data.velocities[m_indexA].w;
|
229
|
+
Vec2 vB = data.velocities[m_indexB].v;
|
230
|
+
float wB = data.velocities[m_indexB].w;
|
231
|
+
|
232
|
+
float mA = m_invMassA, mB = m_invMassB;
|
233
|
+
float iA = m_invIA, iB = m_invIB;
|
234
|
+
|
235
|
+
boolean fixedRotation = (iA + iB == 0.0f);
|
236
|
+
|
237
|
+
// Solve motor constraint.
|
238
|
+
if (m_enableMotor && m_limitState != LimitState.EQUAL && fixedRotation == false) {
|
239
|
+
float Cdot = wB - wA - m_motorSpeed;
|
240
|
+
float impulse = -m_motorMass * Cdot;
|
241
|
+
float oldImpulse = m_motorImpulse;
|
242
|
+
float maxImpulse = data.step.dt * m_maxMotorTorque;
|
243
|
+
m_motorImpulse = MathUtils.clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse);
|
244
|
+
impulse = m_motorImpulse - oldImpulse;
|
245
|
+
|
246
|
+
wA -= iA * impulse;
|
247
|
+
wB += iB * impulse;
|
248
|
+
}
|
249
|
+
final Vec2 temp = pool.popVec2();
|
250
|
+
|
251
|
+
// Solve limit constraint.
|
252
|
+
if (m_enableLimit && m_limitState != LimitState.INACTIVE && fixedRotation == false) {
|
253
|
+
|
254
|
+
final Vec2 Cdot1 = pool.popVec2();
|
255
|
+
final Vec3 Cdot = pool.popVec3();
|
256
|
+
|
257
|
+
// Solve point-to-point constraint
|
258
|
+
Vec2.crossToOutUnsafe(wA, m_rA, temp);
|
259
|
+
Vec2.crossToOutUnsafe(wB, m_rB, Cdot1);
|
260
|
+
Cdot1.addLocal(vB).subLocal(vA).subLocal(temp);
|
261
|
+
float Cdot2 = wB - wA;
|
262
|
+
Cdot.set(Cdot1.x, Cdot1.y, Cdot2);
|
263
|
+
|
264
|
+
Vec3 impulse = pool.popVec3();
|
265
|
+
m_mass.solve33ToOut(Cdot, impulse);
|
266
|
+
impulse.negateLocal();
|
267
|
+
|
268
|
+
if (m_limitState == LimitState.EQUAL) {
|
269
|
+
m_impulse.addLocal(impulse);
|
270
|
+
} else if (m_limitState == LimitState.AT_LOWER) {
|
271
|
+
float newImpulse = m_impulse.z + impulse.z;
|
272
|
+
if (newImpulse < 0.0f) {
|
273
|
+
final Vec2 rhs = pool.popVec2();
|
274
|
+
rhs.set(m_mass.ez.x, m_mass.ez.y).mulLocal(m_impulse.z).subLocal(Cdot1);
|
275
|
+
m_mass.solve22ToOut(rhs, temp);
|
276
|
+
impulse.x = temp.x;
|
277
|
+
impulse.y = temp.y;
|
278
|
+
impulse.z = -m_impulse.z;
|
279
|
+
m_impulse.x += temp.x;
|
280
|
+
m_impulse.y += temp.y;
|
281
|
+
m_impulse.z = 0.0f;
|
282
|
+
pool.pushVec2(1);
|
283
|
+
} else {
|
284
|
+
m_impulse.addLocal(impulse);
|
285
|
+
}
|
286
|
+
} else if (m_limitState == LimitState.AT_UPPER) {
|
287
|
+
float newImpulse = m_impulse.z + impulse.z;
|
288
|
+
if (newImpulse > 0.0f) {
|
289
|
+
final Vec2 rhs = pool.popVec2();
|
290
|
+
rhs.set(m_mass.ez.x, m_mass.ez.y).mulLocal(m_impulse.z).subLocal(Cdot1);
|
291
|
+
m_mass.solve22ToOut(rhs, temp);
|
292
|
+
impulse.x = temp.x;
|
293
|
+
impulse.y = temp.y;
|
294
|
+
impulse.z = -m_impulse.z;
|
295
|
+
m_impulse.x += temp.x;
|
296
|
+
m_impulse.y += temp.y;
|
297
|
+
m_impulse.z = 0.0f;
|
298
|
+
pool.pushVec2(1);
|
299
|
+
} else {
|
300
|
+
m_impulse.addLocal(impulse);
|
301
|
+
}
|
302
|
+
}
|
303
|
+
final Vec2 P = pool.popVec2();
|
304
|
+
|
305
|
+
P.set(impulse.x, impulse.y);
|
306
|
+
|
307
|
+
vA.x -= mA * P.x;
|
308
|
+
vA.y -= mA * P.y;
|
309
|
+
wA -= iA * (Vec2.cross(m_rA, P) + impulse.z);
|
310
|
+
|
311
|
+
vB.x += mB * P.x;
|
312
|
+
vB.y += mB * P.y;
|
313
|
+
wB += iB * (Vec2.cross(m_rB, P) + impulse.z);
|
314
|
+
|
315
|
+
pool.pushVec2(2);
|
316
|
+
pool.pushVec3(2);
|
317
|
+
} else {
|
318
|
+
|
319
|
+
// Solve point-to-point constraint
|
320
|
+
Vec2 Cdot = pool.popVec2();
|
321
|
+
Vec2 impulse = pool.popVec2();
|
322
|
+
|
323
|
+
Vec2.crossToOutUnsafe(wA, m_rA, temp);
|
324
|
+
Vec2.crossToOutUnsafe(wB, m_rB, Cdot);
|
325
|
+
Cdot.addLocal(vB).subLocal(vA).subLocal(temp);
|
326
|
+
m_mass.solve22ToOut(Cdot.negateLocal(), impulse); // just leave negated
|
327
|
+
|
328
|
+
m_impulse.x += impulse.x;
|
329
|
+
m_impulse.y += impulse.y;
|
330
|
+
|
331
|
+
vA.x -= mA * impulse.x;
|
332
|
+
vA.y -= mA * impulse.y;
|
333
|
+
wA -= iA * Vec2.cross(m_rA, impulse);
|
334
|
+
|
335
|
+
vB.x += mB * impulse.x;
|
336
|
+
vB.y += mB * impulse.y;
|
337
|
+
wB += iB * Vec2.cross(m_rB, impulse);
|
338
|
+
|
339
|
+
pool.pushVec2(2);
|
340
|
+
}
|
341
|
+
|
342
|
+
// data.velocities[m_indexA].v.set(vA);
|
343
|
+
data.velocities[m_indexA].w = wA;
|
344
|
+
// data.velocities[m_indexB].v.set(vB);
|
345
|
+
data.velocities[m_indexB].w = wB;
|
346
|
+
|
347
|
+
pool.pushVec2(1);
|
348
|
+
}
|
349
|
+
|
350
|
+
@Override
|
351
|
+
public boolean solvePositionConstraints(final SolverData data) {
|
352
|
+
final Rot qA = pool.popRot();
|
353
|
+
final Rot qB = pool.popRot();
|
354
|
+
Vec2 cA = data.positions[m_indexA].c;
|
355
|
+
float aA = data.positions[m_indexA].a;
|
356
|
+
Vec2 cB = data.positions[m_indexB].c;
|
357
|
+
float aB = data.positions[m_indexB].a;
|
358
|
+
|
359
|
+
qA.set(aA);
|
360
|
+
qB.set(aB);
|
361
|
+
|
362
|
+
float angularError = 0.0f;
|
363
|
+
float positionError = 0.0f;
|
364
|
+
|
365
|
+
boolean fixedRotation = (m_invIA + m_invIB == 0.0f);
|
366
|
+
|
367
|
+
// Solve angular limit constraint.
|
368
|
+
if (m_enableLimit && m_limitState != LimitState.INACTIVE && fixedRotation == false) {
|
369
|
+
float angle = aB - aA - m_referenceAngle;
|
370
|
+
float limitImpulse = 0.0f;
|
371
|
+
|
372
|
+
if (m_limitState == LimitState.EQUAL) {
|
373
|
+
// Prevent large angular corrections
|
374
|
+
float C =
|
375
|
+
MathUtils.clamp(angle - m_lowerAngle, -Settings.maxAngularCorrection,
|
376
|
+
Settings.maxAngularCorrection);
|
377
|
+
limitImpulse = -m_motorMass * C;
|
378
|
+
angularError = MathUtils.abs(C);
|
379
|
+
} else if (m_limitState == LimitState.AT_LOWER) {
|
380
|
+
float C = angle - m_lowerAngle;
|
381
|
+
angularError = -C;
|
382
|
+
|
383
|
+
// Prevent large angular corrections and allow some slop.
|
384
|
+
C = MathUtils.clamp(C + Settings.angularSlop, -Settings.maxAngularCorrection, 0.0f);
|
385
|
+
limitImpulse = -m_motorMass * C;
|
386
|
+
} else if (m_limitState == LimitState.AT_UPPER) {
|
387
|
+
float C = angle - m_upperAngle;
|
388
|
+
angularError = C;
|
389
|
+
|
390
|
+
// Prevent large angular corrections and allow some slop.
|
391
|
+
C = MathUtils.clamp(C - Settings.angularSlop, 0.0f, Settings.maxAngularCorrection);
|
392
|
+
limitImpulse = -m_motorMass * C;
|
393
|
+
}
|
394
|
+
|
395
|
+
aA -= m_invIA * limitImpulse;
|
396
|
+
aB += m_invIB * limitImpulse;
|
397
|
+
}
|
398
|
+
// Solve point-to-point constraint.
|
399
|
+
{
|
400
|
+
qA.set(aA);
|
401
|
+
qB.set(aB);
|
402
|
+
|
403
|
+
final Vec2 rA = pool.popVec2();
|
404
|
+
final Vec2 rB = pool.popVec2();
|
405
|
+
final Vec2 C = pool.popVec2();
|
406
|
+
final Vec2 impulse = pool.popVec2();
|
407
|
+
|
408
|
+
Rot.mulToOutUnsafe(qA, C.set(m_localAnchorA).subLocal(m_localCenterA), rA);
|
409
|
+
Rot.mulToOutUnsafe(qB, C.set(m_localAnchorB).subLocal(m_localCenterB), rB);
|
410
|
+
C.set(cB).addLocal(rB).subLocal(cA).subLocal(rA);
|
411
|
+
positionError = C.length();
|
412
|
+
|
413
|
+
float mA = m_invMassA, mB = m_invMassB;
|
414
|
+
float iA = m_invIA, iB = m_invIB;
|
415
|
+
|
416
|
+
final Mat22 K = pool.popMat22();
|
417
|
+
K.ex.x = mA + mB + iA * rA.y * rA.y + iB * rB.y * rB.y;
|
418
|
+
K.ex.y = -iA * rA.x * rA.y - iB * rB.x * rB.y;
|
419
|
+
K.ey.x = K.ex.y;
|
420
|
+
K.ey.y = mA + mB + iA * rA.x * rA.x + iB * rB.x * rB.x;
|
421
|
+
K.solveToOut(C, impulse);
|
422
|
+
impulse.negateLocal();
|
423
|
+
|
424
|
+
cA.x -= mA * impulse.x;
|
425
|
+
cA.y -= mA * impulse.y;
|
426
|
+
aA -= iA * Vec2.cross(rA, impulse);
|
427
|
+
|
428
|
+
cB.x += mB * impulse.x;
|
429
|
+
cB.y += mB * impulse.y;
|
430
|
+
aB += iB * Vec2.cross(rB, impulse);
|
431
|
+
|
432
|
+
pool.pushVec2(4);
|
433
|
+
pool.pushMat22(1);
|
434
|
+
}
|
435
|
+
// data.positions[m_indexA].c.set(cA);
|
436
|
+
data.positions[m_indexA].a = aA;
|
437
|
+
// data.positions[m_indexB].c.set(cB);
|
438
|
+
data.positions[m_indexB].a = aB;
|
439
|
+
|
440
|
+
pool.pushRot(2);
|
441
|
+
|
442
|
+
return positionError <= Settings.linearSlop && angularError <= Settings.angularSlop;
|
443
|
+
}
|
444
|
+
|
445
|
+
public Vec2 getLocalAnchorA() {
|
446
|
+
return m_localAnchorA;
|
447
|
+
}
|
448
|
+
|
449
|
+
public Vec2 getLocalAnchorB() {
|
450
|
+
return m_localAnchorB;
|
451
|
+
}
|
452
|
+
|
453
|
+
public float getReferenceAngle() {
|
454
|
+
return m_referenceAngle;
|
455
|
+
}
|
456
|
+
|
457
|
+
@Override
|
458
|
+
public void getAnchorA(Vec2 argOut) {
|
459
|
+
m_bodyA.getWorldPointToOut(m_localAnchorA, argOut);
|
460
|
+
}
|
461
|
+
|
462
|
+
@Override
|
463
|
+
public void getAnchorB(Vec2 argOut) {
|
464
|
+
m_bodyB.getWorldPointToOut(m_localAnchorB, argOut);
|
465
|
+
}
|
466
|
+
|
467
|
+
@Override
|
468
|
+
public void getReactionForce(float inv_dt, Vec2 argOut) {
|
469
|
+
argOut.set(m_impulse.x, m_impulse.y).mulLocal(inv_dt);
|
470
|
+
}
|
471
|
+
|
472
|
+
@Override
|
473
|
+
public float getReactionTorque(float inv_dt) {
|
474
|
+
return inv_dt * m_impulse.z;
|
475
|
+
}
|
476
|
+
|
477
|
+
public float getJointAngle() {
|
478
|
+
final Body b1 = m_bodyA;
|
479
|
+
final Body b2 = m_bodyB;
|
480
|
+
return b2.m_sweep.a - b1.m_sweep.a - m_referenceAngle;
|
481
|
+
}
|
482
|
+
|
483
|
+
public float getJointSpeed() {
|
484
|
+
final Body b1 = m_bodyA;
|
485
|
+
final Body b2 = m_bodyB;
|
486
|
+
return b2.m_angularVelocity - b1.m_angularVelocity;
|
487
|
+
}
|
488
|
+
|
489
|
+
public boolean isMotorEnabled() {
|
490
|
+
return m_enableMotor;
|
491
|
+
}
|
492
|
+
|
493
|
+
public void enableMotor(boolean flag) {
|
494
|
+
m_bodyA.setAwake(true);
|
495
|
+
m_bodyB.setAwake(true);
|
496
|
+
m_enableMotor = flag;
|
497
|
+
}
|
498
|
+
|
499
|
+
public float getMotorTorque(float inv_dt) {
|
500
|
+
return m_motorImpulse * inv_dt;
|
501
|
+
}
|
502
|
+
|
503
|
+
public void setMotorSpeed(final float speed) {
|
504
|
+
m_bodyA.setAwake(true);
|
505
|
+
m_bodyB.setAwake(true);
|
506
|
+
m_motorSpeed = speed;
|
507
|
+
}
|
508
|
+
|
509
|
+
public void setMaxMotorTorque(final float torque) {
|
510
|
+
m_bodyA.setAwake(true);
|
511
|
+
m_bodyB.setAwake(true);
|
512
|
+
m_maxMotorTorque = torque;
|
513
|
+
}
|
514
|
+
|
515
|
+
public float getMotorSpeed() {
|
516
|
+
return m_motorSpeed;
|
517
|
+
}
|
518
|
+
|
519
|
+
public float getMaxMotorTorque() {
|
520
|
+
return m_maxMotorTorque;
|
521
|
+
}
|
522
|
+
|
523
|
+
public boolean isLimitEnabled() {
|
524
|
+
return m_enableLimit;
|
525
|
+
}
|
526
|
+
|
527
|
+
public void enableLimit(final boolean flag) {
|
528
|
+
if (flag != m_enableLimit) {
|
529
|
+
m_bodyA.setAwake(true);
|
530
|
+
m_bodyB.setAwake(true);
|
531
|
+
m_enableLimit = flag;
|
532
|
+
m_impulse.z = 0.0f;
|
533
|
+
}
|
534
|
+
}
|
535
|
+
|
536
|
+
public float getLowerLimit() {
|
537
|
+
return m_lowerAngle;
|
538
|
+
}
|
539
|
+
|
540
|
+
public float getUpperLimit() {
|
541
|
+
return m_upperAngle;
|
542
|
+
}
|
543
|
+
|
544
|
+
public void setLimits(final float lower, final float upper) {
|
545
|
+
assert (lower <= upper);
|
546
|
+
if (lower != m_lowerAngle || upper != m_upperAngle) {
|
547
|
+
m_bodyA.setAwake(true);
|
548
|
+
m_bodyB.setAwake(true);
|
549
|
+
m_impulse.z = 0.0f;
|
550
|
+
m_lowerAngle = lower;
|
551
|
+
m_upperAngle = upper;
|
552
|
+
}
|
553
|
+
}
|
554
|
+
}
|
@@ -0,0 +1,137 @@
|
|
1
|
+
/*******************************************************************************
|
2
|
+
* Copyright (c) 2013, Daniel Murphy
|
3
|
+
* All rights reserved.
|
4
|
+
*
|
5
|
+
* Redistribution and use in source and binary forms, with or without modification,
|
6
|
+
* are permitted provided that the following conditions are met:
|
7
|
+
* * Redistributions of source code must retain the above copyright notice,
|
8
|
+
* this list of conditions and the following disclaimer.
|
9
|
+
* * Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
* this list of conditions and the following disclaimer in the documentation
|
11
|
+
* and/or other materials provided with the distribution.
|
12
|
+
*
|
13
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
14
|
+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
15
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
16
|
+
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
17
|
+
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
18
|
+
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
19
|
+
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
20
|
+
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
21
|
+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
22
|
+
* POSSIBILITY OF SUCH DAMAGE.
|
23
|
+
******************************************************************************/
|
24
|
+
/*
|
25
|
+
* JBox2D - A Java Port of Erin Catto's Box2D
|
26
|
+
*
|
27
|
+
* JBox2D homepage: http://jbox2d.sourceforge.net/
|
28
|
+
* Box2D homepage: http://www.box2d.org
|
29
|
+
*
|
30
|
+
* This software is provided 'as-is', without any express or implied
|
31
|
+
* warranty. In no event will the authors be held liable for any damages
|
32
|
+
* arising from the use of this software.
|
33
|
+
*
|
34
|
+
* Permission is granted to anyone to use this software for any purpose,
|
35
|
+
* including commercial applications, and to alter it and redistribute it
|
36
|
+
* freely, subject to the following restrictions:
|
37
|
+
*
|
38
|
+
* 1. The origin of this software must not be misrepresented; you must not
|
39
|
+
* claim that you wrote the original software. If you use this software
|
40
|
+
* in a product, an acknowledgment in the product documentation would be
|
41
|
+
* appreciated but is not required.
|
42
|
+
* 2. Altered source versions must be plainly marked as such, and must not be
|
43
|
+
* misrepresented as being the original software.
|
44
|
+
* 3. This notice may not be removed or altered from any source distribution.
|
45
|
+
*/
|
46
|
+
|
47
|
+
package org.jbox2d.dynamics.joints;
|
48
|
+
|
49
|
+
import org.jbox2d.common.Vec2;
|
50
|
+
import org.jbox2d.dynamics.Body;
|
51
|
+
|
52
|
+
/**
|
53
|
+
* Revolute joint definition. This requires defining an anchor point where the bodies are joined.
|
54
|
+
* The definition uses local anchor points so that the initial configuration can violate the
|
55
|
+
* constraint slightly. You also need to specify the initial relative angle for joint limits. This
|
56
|
+
* helps when saving and loading a game. The local anchor points are measured from the body's origin
|
57
|
+
* rather than the center of mass because:<br/>
|
58
|
+
* <ul>
|
59
|
+
* <li>you might not know where the center of mass will be.</li>
|
60
|
+
* <li>if you add/remove shapes from a body and recompute the mass, the joints will be broken.</li>
|
61
|
+
* </ul>
|
62
|
+
*/
|
63
|
+
public class RevoluteJointDef extends JointDef {
|
64
|
+
|
65
|
+
/**
|
66
|
+
* The local anchor point relative to body1's origin.
|
67
|
+
*/
|
68
|
+
public Vec2 localAnchorA;
|
69
|
+
|
70
|
+
/**
|
71
|
+
* The local anchor point relative to body2's origin.
|
72
|
+
*/
|
73
|
+
public Vec2 localAnchorB;
|
74
|
+
|
75
|
+
/**
|
76
|
+
* The body2 angle minus body1 angle in the reference state (radians).
|
77
|
+
*/
|
78
|
+
public float referenceAngle;
|
79
|
+
|
80
|
+
/**
|
81
|
+
* A flag to enable joint limits.
|
82
|
+
*/
|
83
|
+
public boolean enableLimit;
|
84
|
+
|
85
|
+
/**
|
86
|
+
* The lower angle for the joint limit (radians).
|
87
|
+
*/
|
88
|
+
public float lowerAngle;
|
89
|
+
|
90
|
+
/**
|
91
|
+
* The upper angle for the joint limit (radians).
|
92
|
+
*/
|
93
|
+
public float upperAngle;
|
94
|
+
|
95
|
+
/**
|
96
|
+
* A flag to enable the joint motor.
|
97
|
+
*/
|
98
|
+
public boolean enableMotor;
|
99
|
+
|
100
|
+
/**
|
101
|
+
* The desired motor speed. Usually in radians per second.
|
102
|
+
*/
|
103
|
+
public float motorSpeed;
|
104
|
+
|
105
|
+
/**
|
106
|
+
* The maximum motor torque used to achieve the desired motor speed. Usually in N-m.
|
107
|
+
*/
|
108
|
+
public float maxMotorTorque;
|
109
|
+
|
110
|
+
public RevoluteJointDef() {
|
111
|
+
super(JointType.REVOLUTE);
|
112
|
+
localAnchorA = new Vec2(0.0f, 0.0f);
|
113
|
+
localAnchorB = new Vec2(0.0f, 0.0f);
|
114
|
+
referenceAngle = 0.0f;
|
115
|
+
lowerAngle = 0.0f;
|
116
|
+
upperAngle = 0.0f;
|
117
|
+
maxMotorTorque = 0.0f;
|
118
|
+
motorSpeed = 0.0f;
|
119
|
+
enableLimit = false;
|
120
|
+
enableMotor = false;
|
121
|
+
}
|
122
|
+
|
123
|
+
/**
|
124
|
+
* Initialize the bodies, anchors, and reference angle using the world anchor.
|
125
|
+
*
|
126
|
+
* @param b1
|
127
|
+
* @param b2
|
128
|
+
* @param anchor
|
129
|
+
*/
|
130
|
+
public void initialize(final Body b1, final Body b2, final Vec2 anchor) {
|
131
|
+
bodyA = b1;
|
132
|
+
bodyB = b2;
|
133
|
+
bodyA.getLocalPointToOut(anchor, localAnchorA);
|
134
|
+
bodyB.getLocalPointToOut(anchor, localAnchorB);
|
135
|
+
referenceAngle = bodyB.getAngle() - bodyA.getAngle();
|
136
|
+
}
|
137
|
+
}
|