public void SetDecoupledMode(bool newDecoupled) { if (decoupled == newDecoupled) { return; } SlaveBoneConfiguration newConf; if (decoupled) { newConf = new SlaveBoneConfiguration(model.configuration.wrist); newConf.followsPosition = false; newConf.followsRotation = false; newConf.useGravity = true; } else { newConf = model.configuration.wrist; } for (int i = 0; i < slaveBones.Length; i++) { if (!slaveBones[i].jointRef) { continue; } if (slaveBones[i] == model.proxyHand.slave.wrist) { PhysHelpers.SetSlaveBoneConfiguration(slaveBones[i].jointRef, newConf); } } }
private void Start() { model.proxyHand.relatedHandlers.Add(this); slaveBones = AvatarHelpers.GetSlaveHandBones(model.proxyHand.slave); // Ignore palm-finger collisions for (int i = 0; i < slaveBones.Length; i++) { if (!slaveBones[i].colliderRef) { continue; } Physics.IgnoreCollision((model.proxyHand.slave.wrist as SlaveBoneModel).colliderRef, slaveBones[i].colliderRef, true); } // Set default configuration if needed if (model.configuration == null) { model.configuration = core.model.defaultHandPhysicsConfiguration; } for (int i = 0; i < slaveBones.Length; i++) { if (!slaveBones[i].jointRef) { continue; } // Get initial connected body local rotations if (slaveBones[i].jointRef.connectedBody != null) { slaveBones[i].initialConnectedBodyLocalRotation = slaveBones[i].jointRef.connectedBody.transform.localRotation; } else { slaveBones[i].initialConnectedBodyLocalRotation = slaveBones[i].jointRef.transform.rotation; } // Set initial joint configurations if (slaveBones[i] == model.proxyHand.slave.wrist) { PhysHelpers.SetSlaveBoneConfiguration(slaveBones[i].jointRef, model.configuration.wrist); } else if (slaveBones[i].isSpecial) { PhysHelpers.SetSlaveBoneConfiguration(slaveBones[i].jointRef, model.configuration.specials); } else { PhysHelpers.SetSlaveBoneConfiguration(slaveBones[i].jointRef, model.configuration.fingers); } slaveBones[i].rigidbodyRef.maxDepenetrationVelocity = model.configuration.fingers.maxLinearVelocity; slaveBones[i].rigidbodyRef.maxAngularVelocity = model.configuration.fingers.maxAngularVelocity; } }
private void Update() { if (!model.isActive) { return; } if (model.proxyHand.error > core.model.configuration.maxErrorAllowed && !decoupled) { StartCoroutine(RecoverFromError()); } for (int i = 0; i < slaveBones.Length; i++) { if (model.updateConfFromScale) { model.configuration.fingers.positionDrive = CustomJointDrive.ScaledCopy(model.asset.configuration.fingers.positionDrive, model.proxyHand.slave.extraScale); model.configuration.fingers.rotationDrive = CustomJointDrive.ScaledCopy(model.asset.configuration.fingers.rotationDrive, model.proxyHand.slave.extraScale); model.configuration.fingers.rigidbodyMass = model.asset.configuration.fingers.rigidbodyMass * model.proxyHand.slave.extraScale; model.configuration.wrist.positionDrive = CustomJointDrive.ScaledCopy(model.asset.configuration.wrist.positionDrive, model.proxyHand.slave.extraScale); model.configuration.wrist.rotationDrive = CustomJointDrive.ScaledCopy(model.asset.configuration.wrist.rotationDrive, model.proxyHand.slave.extraScale); model.configuration.wrist.rigidbodyMass = model.asset.configuration.wrist.rigidbodyMass * model.proxyHand.slave.extraScale; model.configuration.specials.positionDrive = CustomJointDrive.ScaledCopy(model.asset.configuration.specials.positionDrive, model.proxyHand.slave.extraScale); model.configuration.specials.rotationDrive = CustomJointDrive.ScaledCopy(model.asset.configuration.specials.rotationDrive, model.proxyHand.slave.extraScale); model.configuration.specials.rigidbodyMass = model.asset.configuration.specials.rigidbodyMass * model.proxyHand.slave.extraScale; } if (model.applyConfOnUpdate && slaveBones[i].jointRef) { // Update joint configurations if (slaveBones[i] == model.proxyHand.slave.wrist) { PhysHelpers.SetSlaveBoneConfiguration(slaveBones[i].jointRef, model.configuration.wrist); } else if (slaveBones[i].isSpecial) { PhysHelpers.SetSlaveBoneConfiguration(slaveBones[i].jointRef, model.configuration.specials); } else { PhysHelpers.SetSlaveBoneConfiguration(slaveBones[i].jointRef, model.configuration.fingers); } // Update built-in velocity clamps slaveBones[i].rigidbodyRef.maxDepenetrationVelocity = model.configuration.fingers.maxLinearVelocity; slaveBones[i].rigidbodyRef.maxAngularVelocity = model.configuration.fingers.maxAngularVelocity; // NO-PROD if (slaveBones[i].jointRef.connectedBody) { slaveBones[i].jointRef.connectedAnchor = slaveBones[i].initialConnectedAnchor; } } } }
private void Start() { model.proxyHand.relatedHandlers.Add(this); slaveBones = AvatarHelpers.GetSlaveHandBones(model.proxyHand.slave); // Set default configuration if needed if (model.asset == null) { model.asset = BasicHelpers.FindScriptableObject <HandPhysicsConfigurationAsset>(core.model.defaultConfAssets); } // Make configuration editable model.configuration = new HandPhysicsConfiguration(model.asset.configuration); for (int i = 0; i < slaveBones.Length; i++) { if (slaveBones[i].colliderRef) { // Ignore palm-finger collisions Physics.IgnoreCollision((model.proxyHand.slave.wrist as SlaveBoneModel).colliderRef, slaveBones[i].colliderRef, true); } if (slaveBones[i].jointRef) { // Get initial connected body local rotations and conn anchors if (slaveBones[i].jointRef.connectedBody != null) { slaveBones[i].initialConnectedBodyLocalRotation = slaveBones[i].jointRef.connectedBody.transform.localRotation; slaveBones[i].initialConnectedAnchor = slaveBones[i].jointRef.connectedAnchor; slaveBones[i].jointRef.autoConfigureConnectedAnchor = false; } else { slaveBones[i].initialConnectedBodyLocalRotation = slaveBones[i].jointRef.transform.rotation; } // Set initial joint configurations if (slaveBones[i] == model.proxyHand.slave.wrist) { PhysHelpers.SetSlaveBoneConfiguration(slaveBones[i].jointRef, model.configuration.wrist); } else if (slaveBones[i].isSpecial) { PhysHelpers.SetSlaveBoneConfiguration(slaveBones[i].jointRef, model.configuration.specials); } else { PhysHelpers.SetSlaveBoneConfiguration(slaveBones[i].jointRef, model.configuration.fingers); } // Initial built-in velocity clamps slaveBones[i].rigidbodyRef.maxDepenetrationVelocity = model.configuration.fingers.maxLinearVelocity; slaveBones[i].rigidbodyRef.maxAngularVelocity = model.configuration.fingers.maxAngularVelocity; } } }