// apply an impulse
if (dynamicsWorld != null) {
CollisionWorld.ClosestRayResultCallback rayCallback = new CollisionWorld.ClosestRayResultCallback(cameraPosition, rayTo);
dynamicsWorld.rayTest(cameraPosition, rayTo, rayCallback);
if (rayCallback.hasHit()) {
RigidBody body = RigidBody.upcast(rayCallback.collisionObject);
if (body != null) {
body.setActivationState(CollisionObject.ACTIVE_TAG);
Vector3f impulse = new Vector3f(rayTo);
impulse.normalize();
float impulseStrength = 10f;
impulse.scale(impulseStrength);
Vector3f relPos = new Vector3f();
relPos.sub(rayCallback.hitPointWorld, body.getCenterOfMassPosition(new Vector3f()));
body.applyImpulse(impulse, relPos);
}
}
}
}
else {
}
break;
}
case 0: {
if (state == 0) {
// add a point to point constraint for picking
if (dynamicsWorld != null) {
CollisionWorld.ClosestRayResultCallback rayCallback = new CollisionWorld.ClosestRayResultCallback(cameraPosition, rayTo);
dynamicsWorld.rayTest(cameraPosition, rayTo, rayCallback);
if (rayCallback.hasHit()) {
RigidBody body = RigidBody.upcast(rayCallback.collisionObject);
if (body != null) {
// other exclusions?
if (!(body.isStaticObject() || body.isKinematicObject())) {
pickedBody = body;
pickedBody.setActivationState(CollisionObject.DISABLE_DEACTIVATION);
Vector3f pickPos = new Vector3f(rayCallback.hitPointWorld);
Transform tmpTrans = body.getCenterOfMassTransform(new Transform());
tmpTrans.inverse();
Vector3f localPivot = new Vector3f(pickPos);
tmpTrans.transform(localPivot);
Point2PointConstraint p2p = new Point2PointConstraint(body, localPivot);