From 5099580885a157459c10f104fa418712e6e52391 Mon Sep 17 00:00:00 2001 From: QuantumCoderQC Date: Sun, 1 Dec 2019 00:59:16 +0100 Subject: [PATCH] Implemented Kinematic and Static flags for better control. Mass of Animated(Kinematic) and Static objects will be set to zero. Implemented btMotionState for kinematic rigid bodies. And btSetWorldTransform for Dynamic and static rigid bodies. Kinematic rigid bodies can now be fully contolled through animation timeline inside blender. --- .../armory/trait/physics/bullet/RigidBody.hx | 19 +++++++++++++++---- blender/arm/exporter.py | 7 ++++--- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/Sources/armory/trait/physics/bullet/RigidBody.hx b/Sources/armory/trait/physics/bullet/RigidBody.hx index c19bcad1..20169320 100644 --- a/Sources/armory/trait/physics/bullet/RigidBody.hx +++ b/Sources/armory/trait/physics/bullet/RigidBody.hx @@ -26,6 +26,7 @@ class RigidBody extends iron.Trait { public var linearDamping:Float; public var angularDamping:Float; public var animated:Bool; + public var staticObj:Bool; public var destroyed = false; var linearFactors:Array; var angularFactors:Array; @@ -100,6 +101,7 @@ class RigidBody extends iron.Trait { this.animated = flags[0]; this.trigger = flags[1]; this.ccd = flags[2]; + this.staticObj = flags[3]; notifyOnAdd(init); } @@ -219,6 +221,8 @@ class RigidBody extends iron.Trait { vec1.setY(0); vec1.setZ(0); var inertia = vec1; + + if(staticObj || animated) mass = 0; if (mass > 0) btshape.calculateLocalInertia(mass, inertia); var bodyCI = new bullet.Bt.RigidBodyConstructionInfo(mass, motionState, btshape, inertia); body = new bullet.Bt.RigidBody(bodyCI); @@ -250,8 +254,12 @@ class RigidBody extends iron.Trait { setAngularFactor(angularFactors[0], angularFactors[1], angularFactors[2]); } - var CF_NO_CONTACT_RESPONSE = 4; // bullet.Bt.CollisionObject.CF_NO_CONTACT_RESPONSE - if (trigger) bodyColl.setCollisionFlags(bodyColl.getCollisionFlags() | CF_NO_CONTACT_RESPONSE); + if (trigger) bodyColl.setCollisionFlags(bodyColl.getCollisionFlags() | bullet.Bt.CollisionObject.CF_NO_CONTACT_RESPONSE); + if (animated){ + bodyColl.setCollisionFlags(bodyColl.getCollisionFlags() | bullet.Bt.CollisionObject.CF_KINEMATIC_OBJECT); + bodyColl.setCollisionFlags(bodyColl.getCollisionFlags() & ~bullet.Bt.CollisionObject.CF_STATIC_OBJECT); + } + if (staticObj && !animated) bodyColl.setCollisionFlags(bodyColl.getCollisionFlags() | bullet.Bt.CollisionObject.CF_STATIC_OBJECT); if (ccd) setCcd(transform.radius); @@ -283,7 +291,7 @@ class RigidBody extends iron.Trait { function physicsUpdate() { if (!ready) return; - if (object.animation != null || animated) { + if (animated) { syncTransform(); } else { @@ -447,7 +455,10 @@ class RigidBody extends iron.Trait { quat.fromMat(t.world); quat1.setValue(quat.x, quat.y, quat.z, quat.w); trans1.setRotation(quat1); - body.setCenterOfMassTransform(trans1); + if(animated) + body.getMotionState().setWorldTransform(trans1); + else + body.setWorldTransform(trans1); if (currentScaleX != t.scale.x || currentScaleY != t.scale.y || currentScaleZ != t.scale.z) setScale(t.scale); activate(); } diff --git a/blender/arm/exporter.py b/blender/arm/exporter.py index 917bde19..bca54f47 100755 --- a/blender/arm/exporter.py +++ b/blender/arm/exporter.py @@ -2236,7 +2236,7 @@ class ArmoryExporter: elif rb.collision_shape == 'CAPSULE': shape = 6 body_mass = rb.mass - is_static = not rb.enabled or (rb.type == 'PASSIVE' and not rb.kinematic) + is_static = (not rb.enabled and not rb.kinematic) or (rb.type == 'PASSIVE' and rb.kinematic) if is_static: body_mass = 0 x = {} @@ -2285,10 +2285,11 @@ class ArmoryExporter: col_margin, deact_lv, deact_av, deact_time ) - body_flags = '[{0}, {1}, {2}]'.format( + body_flags = '[{0}, {1}, {2}, {3}]'.format( str(rb.kinematic).lower(), str(bobject.arm_rb_trigger).lower(), - str(bobject.arm_rb_ccd).lower() + str(bobject.arm_rb_ccd).lower(), + str(is_static).lower() ) x['parameters'].append(body_params) x['parameters'].append(body_flags)