Skip to content

Commit 6e8e567

Browse files
committed
Update to "Implement linear and angular velocity damping"
DanielChappuis/reactphysics3d@2e6f571b98f6247c d007ca265d16c1b728897fbc
1 parent 7782ed6 commit 6e8e567

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

src/main/java/org/spout/physics/body/RigidBody.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ public class RigidBody extends CollisionBody {
4747
private final Vector3 mExternalTorque = new Vector3();
4848
private final Vector3 mLinearVelocity = new Vector3();
4949
private final Vector3 mAngularVelocity = new Vector3();
50+
private float mLinearDamping;
51+
private float mAngularDamping;
5052

5153
/**
5254
* Constructs a new rigid body from its transform, mass, local inertia tensor, collision shape and ID.
@@ -64,6 +66,8 @@ public RigidBody(Transform transform, float mass, Matrix3x3 inertiaTensorLocal,
6466
mInertiaTensorLocalInverse = inertiaTensorLocal.getInverse();
6567
mMassInverse = 1 / mass;
6668
mIsGravityEnabled = true;
69+
mLinearDamping = 0;
70+
mAngularDamping = 0;
6771
}
6872

6973
/**
@@ -251,4 +255,46 @@ public void setMaterial(Material material) {
251255
public Material getMaterial() {
252256
return mMaterial;
253257
}
258+
259+
/**
260+
* Returns the linear velocity damping factor.
261+
*
262+
* @return The linear damping
263+
*/
264+
public float getLinearDamping() {
265+
return mLinearDamping;
266+
}
267+
268+
/**
269+
* Sets the linear damping factor.
270+
*
271+
* @param linearDamping The liner damping
272+
*/
273+
public void setLinearDamping(float linearDamping) {
274+
if (linearDamping < 0) {
275+
throw new IllegalArgumentException("Linear damping must be greater or equal to 0");
276+
}
277+
mLinearDamping = linearDamping;
278+
}
279+
280+
/**
281+
* Returns the angular velocity damping factor.
282+
*
283+
* @return The angular damping
284+
*/
285+
public float getAngularDamping() {
286+
return mAngularDamping;
287+
}
288+
289+
/**
290+
* Sets the angular damping factor.
291+
*
292+
* @param angularDamping The angular damping
293+
*/
294+
public void setAngularDamping(float angularDamping) {
295+
if (angularDamping < 0) {
296+
throw new IllegalArgumentException("Angular damping must be greater or equal to 0");
297+
}
298+
mAngularDamping = angularDamping;
299+
}
254300
}

src/main/java/org/spout/physics/engine/DynamicsWorld.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import org.spout.physics.constraint.HingeJoint.HingeJointInfo;
5454
import org.spout.physics.constraint.SliderJoint;
5555
import org.spout.physics.constraint.SliderJoint.SliderJointInfo;
56+
import org.spout.physics.math.Mathematics;
5657
import org.spout.physics.math.Matrix3x3;
5758
import org.spout.physics.math.Quaternion;
5859
import org.spout.physics.math.Transform;
@@ -355,6 +356,12 @@ private void integrateRigidBodiesVelocities() {
355356
if (rigidBody.isGravityEnabled() && mIsGravityOn) {
356357
mConstrainedLinearVelocities.get(i).add(Vector3.multiply(dt * rigidBody.getMassInverse() * rigidBody.getMass(), mGravity));
357358
}
359+
final float linDampingFactor = rigidBody.getLinearDamping();
360+
final float angDampingFactor = rigidBody.getAngularDamping();
361+
final float linearDamping = Mathematics.clamp(1 - dt * linDampingFactor, 0, 1);
362+
final float angularDamping = Mathematics.clamp(1 - dt * angDampingFactor, 0, 1);
363+
mConstrainedLinearVelocities.get(i).multiply(Mathematics.clamp(linearDamping, 0, 1));
364+
mConstrainedAngularVelocities.get(i).multiply(Mathematics.clamp(angularDamping, 0, 1));
358365
rigidBody.updateOldTransform();
359366
} else {
360367
mConstrainedLinearVelocities.add(i, new Vector3(0, 0, 0));

0 commit comments

Comments
 (0)