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,294 @@
|
|
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
|
+
* Created at 7:27:32 AM Jan 20, 2011
|
26
|
+
*/
|
27
|
+
package org.jbox2d.dynamics.joints;
|
28
|
+
|
29
|
+
import org.jbox2d.common.Mat22;
|
30
|
+
import org.jbox2d.common.MathUtils;
|
31
|
+
import org.jbox2d.common.Rot;
|
32
|
+
import org.jbox2d.common.Vec2;
|
33
|
+
import org.jbox2d.dynamics.SolverData;
|
34
|
+
import org.jbox2d.pooling.IWorldPool;
|
35
|
+
|
36
|
+
/**
|
37
|
+
* @author Daniel Murphy
|
38
|
+
*/
|
39
|
+
public class FrictionJoint extends Joint {
|
40
|
+
|
41
|
+
private final Vec2 m_localAnchorA;
|
42
|
+
private final Vec2 m_localAnchorB;
|
43
|
+
|
44
|
+
// Solver shared
|
45
|
+
private final Vec2 m_linearImpulse;
|
46
|
+
private float m_angularImpulse;
|
47
|
+
private float m_maxForce;
|
48
|
+
private float m_maxTorque;
|
49
|
+
|
50
|
+
// Solver temp
|
51
|
+
private int m_indexA;
|
52
|
+
private int m_indexB;
|
53
|
+
private final Vec2 m_rA = new Vec2();
|
54
|
+
private final Vec2 m_rB = new Vec2();
|
55
|
+
private final Vec2 m_localCenterA = new Vec2();
|
56
|
+
private final Vec2 m_localCenterB = new Vec2();
|
57
|
+
private float m_invMassA;
|
58
|
+
private float m_invMassB;
|
59
|
+
private float m_invIA;
|
60
|
+
private float m_invIB;
|
61
|
+
private final Mat22 m_linearMass = new Mat22();
|
62
|
+
private float m_angularMass;
|
63
|
+
|
64
|
+
protected FrictionJoint(IWorldPool argWorldPool, FrictionJointDef def) {
|
65
|
+
super(argWorldPool, def);
|
66
|
+
m_localAnchorA = new Vec2(def.localAnchorA);
|
67
|
+
m_localAnchorB = new Vec2(def.localAnchorB);
|
68
|
+
|
69
|
+
m_linearImpulse = new Vec2();
|
70
|
+
m_angularImpulse = 0.0f;
|
71
|
+
|
72
|
+
m_maxForce = def.maxForce;
|
73
|
+
m_maxTorque = def.maxTorque;
|
74
|
+
}
|
75
|
+
|
76
|
+
public Vec2 getLocalAnchorA() {
|
77
|
+
return m_localAnchorA;
|
78
|
+
}
|
79
|
+
|
80
|
+
public Vec2 getLocalAnchorB() {
|
81
|
+
return m_localAnchorB;
|
82
|
+
}
|
83
|
+
|
84
|
+
@Override
|
85
|
+
public void getAnchorA(Vec2 argOut) {
|
86
|
+
m_bodyA.getWorldPointToOut(m_localAnchorA, argOut);
|
87
|
+
}
|
88
|
+
|
89
|
+
@Override
|
90
|
+
public void getAnchorB(Vec2 argOut) {
|
91
|
+
m_bodyB.getWorldPointToOut(m_localAnchorB, argOut);
|
92
|
+
}
|
93
|
+
|
94
|
+
@Override
|
95
|
+
public void getReactionForce(float inv_dt, Vec2 argOut) {
|
96
|
+
argOut.set(m_linearImpulse).mulLocal(inv_dt);
|
97
|
+
}
|
98
|
+
|
99
|
+
@Override
|
100
|
+
public float getReactionTorque(float inv_dt) {
|
101
|
+
return inv_dt * m_angularImpulse;
|
102
|
+
}
|
103
|
+
|
104
|
+
public void setMaxForce(float force) {
|
105
|
+
assert (force >= 0.0f);
|
106
|
+
m_maxForce = force;
|
107
|
+
}
|
108
|
+
|
109
|
+
public float getMaxForce() {
|
110
|
+
return m_maxForce;
|
111
|
+
}
|
112
|
+
|
113
|
+
public void setMaxTorque(float torque) {
|
114
|
+
assert (torque >= 0.0f);
|
115
|
+
m_maxTorque = torque;
|
116
|
+
}
|
117
|
+
|
118
|
+
public float getMaxTorque() {
|
119
|
+
return m_maxTorque;
|
120
|
+
}
|
121
|
+
|
122
|
+
/**
|
123
|
+
* @see org.jbox2d.dynamics.joints.Joint#initVelocityConstraints(org.jbox2d.dynamics.TimeStep)
|
124
|
+
*/
|
125
|
+
@Override
|
126
|
+
public void initVelocityConstraints(final SolverData data) {
|
127
|
+
m_indexA = m_bodyA.m_islandIndex;
|
128
|
+
m_indexB = m_bodyB.m_islandIndex;
|
129
|
+
m_localCenterA.set(m_bodyA.m_sweep.localCenter);
|
130
|
+
m_localCenterB.set(m_bodyB.m_sweep.localCenter);
|
131
|
+
m_invMassA = m_bodyA.m_invMass;
|
132
|
+
m_invMassB = m_bodyB.m_invMass;
|
133
|
+
m_invIA = m_bodyA.m_invI;
|
134
|
+
m_invIB = m_bodyB.m_invI;
|
135
|
+
|
136
|
+
float aA = data.positions[m_indexA].a;
|
137
|
+
Vec2 vA = data.velocities[m_indexA].v;
|
138
|
+
float wA = data.velocities[m_indexA].w;
|
139
|
+
|
140
|
+
float aB = data.positions[m_indexB].a;
|
141
|
+
Vec2 vB = data.velocities[m_indexB].v;
|
142
|
+
float wB = data.velocities[m_indexB].w;
|
143
|
+
|
144
|
+
|
145
|
+
final Vec2 temp = pool.popVec2();
|
146
|
+
final Rot qA = pool.popRot();
|
147
|
+
final Rot qB = pool.popRot();
|
148
|
+
|
149
|
+
qA.set(aA);
|
150
|
+
qB.set(aB);
|
151
|
+
|
152
|
+
// Compute the effective mass matrix.
|
153
|
+
Rot.mulToOutUnsafe(qA, temp.set(m_localAnchorA).subLocal(m_localCenterA), m_rA);
|
154
|
+
Rot.mulToOutUnsafe(qB, temp.set(m_localAnchorB).subLocal(m_localCenterB), m_rB);
|
155
|
+
|
156
|
+
// J = [-I -r1_skew I r2_skew]
|
157
|
+
// [ 0 -1 0 1]
|
158
|
+
// r_skew = [-ry; rx]
|
159
|
+
|
160
|
+
// Matlab
|
161
|
+
// K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]
|
162
|
+
// [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]
|
163
|
+
// [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]
|
164
|
+
|
165
|
+
float mA = m_invMassA, mB = m_invMassB;
|
166
|
+
float iA = m_invIA, iB = m_invIB;
|
167
|
+
|
168
|
+
final Mat22 K = pool.popMat22();
|
169
|
+
K.ex.x = mA + mB + iA * m_rA.y * m_rA.y + iB * m_rB.y * m_rB.y;
|
170
|
+
K.ex.y = -iA * m_rA.x * m_rA.y - iB * m_rB.x * m_rB.y;
|
171
|
+
K.ey.x = K.ex.y;
|
172
|
+
K.ey.y = mA + mB + iA * m_rA.x * m_rA.x + iB * m_rB.x * m_rB.x;
|
173
|
+
|
174
|
+
K.invertToOut(m_linearMass);
|
175
|
+
|
176
|
+
m_angularMass = iA + iB;
|
177
|
+
if (m_angularMass > 0.0f) {
|
178
|
+
m_angularMass = 1.0f / m_angularMass;
|
179
|
+
}
|
180
|
+
|
181
|
+
if (data.step.warmStarting) {
|
182
|
+
// Scale impulses to support a variable time step.
|
183
|
+
m_linearImpulse.mulLocal(data.step.dtRatio);
|
184
|
+
m_angularImpulse *= data.step.dtRatio;
|
185
|
+
|
186
|
+
final Vec2 P = pool.popVec2();
|
187
|
+
P.set(m_linearImpulse);
|
188
|
+
|
189
|
+
temp.set(P).mulLocal(mA);
|
190
|
+
vA.subLocal(temp);
|
191
|
+
wA -= iA * (Vec2.cross(m_rA, P) + m_angularImpulse);
|
192
|
+
|
193
|
+
temp.set(P).mulLocal(mB);
|
194
|
+
vB.addLocal(temp);
|
195
|
+
wB += iB * (Vec2.cross(m_rB, P) + m_angularImpulse);
|
196
|
+
|
197
|
+
pool.pushVec2(1);
|
198
|
+
} else {
|
199
|
+
m_linearImpulse.setZero();
|
200
|
+
m_angularImpulse = 0.0f;
|
201
|
+
}
|
202
|
+
// data.velocities[m_indexA].v.set(vA);
|
203
|
+
if( data.velocities[m_indexA].w != wA) {
|
204
|
+
assert(data.velocities[m_indexA].w != wA);
|
205
|
+
}
|
206
|
+
data.velocities[m_indexA].w = wA;
|
207
|
+
// data.velocities[m_indexB].v.set(vB);
|
208
|
+
data.velocities[m_indexB].w = wB;
|
209
|
+
|
210
|
+
pool.pushRot(2);
|
211
|
+
pool.pushVec2(1);
|
212
|
+
pool.pushMat22(1);
|
213
|
+
}
|
214
|
+
|
215
|
+
@Override
|
216
|
+
public void solveVelocityConstraints(final SolverData data) {
|
217
|
+
Vec2 vA = data.velocities[m_indexA].v;
|
218
|
+
float wA = data.velocities[m_indexA].w;
|
219
|
+
Vec2 vB = data.velocities[m_indexB].v;
|
220
|
+
float wB = data.velocities[m_indexB].w;
|
221
|
+
|
222
|
+
float mA = m_invMassA, mB = m_invMassB;
|
223
|
+
float iA = m_invIA, iB = m_invIB;
|
224
|
+
|
225
|
+
float h = data.step.dt;
|
226
|
+
|
227
|
+
// Solve angular friction
|
228
|
+
{
|
229
|
+
float Cdot = wB - wA;
|
230
|
+
float impulse = -m_angularMass * Cdot;
|
231
|
+
|
232
|
+
float oldImpulse = m_angularImpulse;
|
233
|
+
float maxImpulse = h * m_maxTorque;
|
234
|
+
m_angularImpulse = MathUtils.clamp(m_angularImpulse + impulse, -maxImpulse, maxImpulse);
|
235
|
+
impulse = m_angularImpulse - oldImpulse;
|
236
|
+
|
237
|
+
wA -= iA * impulse;
|
238
|
+
wB += iB * impulse;
|
239
|
+
}
|
240
|
+
|
241
|
+
// Solve linear friction
|
242
|
+
{
|
243
|
+
final Vec2 Cdot = pool.popVec2();
|
244
|
+
final Vec2 temp = pool.popVec2();
|
245
|
+
|
246
|
+
Vec2.crossToOutUnsafe(wA, m_rA, temp);
|
247
|
+
Vec2.crossToOutUnsafe(wB, m_rB, Cdot);
|
248
|
+
Cdot.addLocal(vB).subLocal(vA).subLocal(temp);
|
249
|
+
|
250
|
+
final Vec2 impulse = pool.popVec2();
|
251
|
+
Mat22.mulToOutUnsafe(m_linearMass, Cdot, impulse);
|
252
|
+
impulse.negateLocal();
|
253
|
+
|
254
|
+
|
255
|
+
final Vec2 oldImpulse = pool.popVec2();
|
256
|
+
oldImpulse.set(m_linearImpulse);
|
257
|
+
m_linearImpulse.addLocal(impulse);
|
258
|
+
|
259
|
+
float maxImpulse = h * m_maxForce;
|
260
|
+
|
261
|
+
if (m_linearImpulse.lengthSquared() > maxImpulse * maxImpulse) {
|
262
|
+
m_linearImpulse.normalize();
|
263
|
+
m_linearImpulse.mulLocal(maxImpulse);
|
264
|
+
}
|
265
|
+
|
266
|
+
impulse.set(m_linearImpulse).subLocal(oldImpulse);
|
267
|
+
|
268
|
+
temp.set(impulse).mulLocal(mA);
|
269
|
+
vA.subLocal(temp);
|
270
|
+
wA -= iA * Vec2.cross(m_rA, impulse);
|
271
|
+
|
272
|
+
temp.set(impulse).mulLocal(mB);
|
273
|
+
vB.addLocal(temp);
|
274
|
+
wB += iB * Vec2.cross(m_rB, impulse);
|
275
|
+
|
276
|
+
}
|
277
|
+
|
278
|
+
// data.velocities[m_indexA].v.set(vA);
|
279
|
+
if( data.velocities[m_indexA].w != wA) {
|
280
|
+
assert(data.velocities[m_indexA].w != wA);
|
281
|
+
}
|
282
|
+
data.velocities[m_indexA].w = wA;
|
283
|
+
|
284
|
+
// data.velocities[m_indexB].v.set(vB);
|
285
|
+
data.velocities[m_indexB].w = wB;
|
286
|
+
|
287
|
+
pool.pushVec2(4);
|
288
|
+
}
|
289
|
+
|
290
|
+
@Override
|
291
|
+
public boolean solvePositionConstraints(final SolverData data) {
|
292
|
+
return true;
|
293
|
+
}
|
294
|
+
}
|
@@ -0,0 +1,78 @@
|
|
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
|
+
* Created at 7:23:39 AM Jan 20, 2011
|
26
|
+
*/
|
27
|
+
package org.jbox2d.dynamics.joints;
|
28
|
+
|
29
|
+
import org.jbox2d.common.Vec2;
|
30
|
+
import org.jbox2d.dynamics.Body;
|
31
|
+
|
32
|
+
/**
|
33
|
+
* Friction joint definition.
|
34
|
+
*
|
35
|
+
* @author Daniel Murphy
|
36
|
+
*/
|
37
|
+
public class FrictionJointDef extends JointDef {
|
38
|
+
|
39
|
+
|
40
|
+
/**
|
41
|
+
* The local anchor point relative to bodyA's origin.
|
42
|
+
*/
|
43
|
+
public final Vec2 localAnchorA;
|
44
|
+
|
45
|
+
/**
|
46
|
+
* The local anchor point relative to bodyB's origin.
|
47
|
+
*/
|
48
|
+
public final Vec2 localAnchorB;
|
49
|
+
|
50
|
+
/**
|
51
|
+
* The maximum friction force in N.
|
52
|
+
*/
|
53
|
+
public float maxForce;
|
54
|
+
|
55
|
+
/**
|
56
|
+
* The maximum friction torque in N-m.
|
57
|
+
*/
|
58
|
+
public float maxTorque;
|
59
|
+
|
60
|
+
public FrictionJointDef() {
|
61
|
+
super(JointType.FRICTION);
|
62
|
+
localAnchorA = new Vec2();
|
63
|
+
localAnchorB = new Vec2();
|
64
|
+
maxForce = 0f;
|
65
|
+
maxTorque = 0f;
|
66
|
+
}
|
67
|
+
|
68
|
+
/**
|
69
|
+
* Initialize the bodies, anchors, axis, and reference angle using the world anchor and world
|
70
|
+
* axis.
|
71
|
+
*/
|
72
|
+
public void initialize(Body bA, Body bB, Vec2 anchor) {
|
73
|
+
bodyA = bA;
|
74
|
+
bodyB = bB;
|
75
|
+
bA.getLocalPointToOut(anchor, localAnchorA);
|
76
|
+
bB.getLocalPointToOut(anchor, localAnchorB);
|
77
|
+
}
|
78
|
+
}
|