Beispiel #1
0
        private void Pin(float pinWeightMaster, float pinPow, float pinDistanceFalloff, bool angularPinning)
        {
            positionOffset = targetAnimatedCenterOfMass - rigidbody.worldCenterOfMass;
            if (float.IsNaN(positionOffset.x))
            {
                positionOffset = Vector3.zero;
            }

            float w = pinWeightMaster * pinWeightMlp;

            if (w <= 0f)
            {
                return;
            }
            w = Mathf.Pow(w, pinPow);

            if (Time.deltaTime > 0f)
            {
                positionOffset /= Time.deltaTime;
            }
            Vector3 force = -rigidbody.velocity + targetVelocity + positionOffset;

            force *= w;
            if (pinDistanceFalloff > 0f)
            {
                force /= 1f + positionOffset.sqrMagnitude * pinDistanceFalloff;
            }

            rigidbody.AddForce(force, ForceMode.VelocityChange);

            // Angular pinning
            if (angularPinning)
            {
                Vector3 torque = PhysXTools.GetAngularAcceleration(rigidbody.rotation, targetAnimatedWorldRotation);

                torque -= rigidbody.angularVelocity;
                torque *= w;
                rigidbody.AddTorque(torque, ForceMode.VelocityChange);
            }
        }
        private void FixedUpdate()
        {
            Vector3 targetVelocity        = Vector3.zero;
            Vector3 targetAngularVelocity = Vector3.zero;

            // Calculate target velocity and angular velocity
            if (useTargetVelocity)
            {
                targetVelocity = (target.position - lastTargetPos) / Time.deltaTime;

                targetAngularVelocity = PhysXTools.GetAngularVelocity(lastTargetRot, target.rotation, Time.deltaTime);
            }

            lastTargetPos = target.position;
            lastTargetRot = target.rotation;

            // Force
            Vector3 force = PhysXTools.GetLinearAcceleration(r.position, target.position);

            force += targetVelocity;
            force -= r.velocity;
            if (r.useGravity)
            {
                force -= Physics.gravity * Time.deltaTime;
            }
            force *= forceWeight;
            r.AddForce(force, ForceMode.VelocityChange);

            // Torque
            Vector3 torque = PhysXTools.GetAngularAcceleration(r.rotation, target.rotation);

            torque += targetAngularVelocity;
            torque -= r.angularVelocity;
            torque *= torqueWeight;
            r.AddTorque(torque, ForceMode.VelocityChange);
        }