示例#1
0
    private void UpdateInertiaDamping(JoblifyDynamicBone joblifyDynamicBone)
    {
        for (int i = 0, count = joblifyDynamicBone.m_particles.Count; i < count; i++)
        {
            JoblifyDynamicBone.Particle particle = joblifyDynamicBone.m_particles[i];

            if (particle.parentIndex < 0)
            {
                particle.prevPosition = particle.position;
                particle.position     = particle.trans.position;
            }
            else
            {
                //Inertia
                Vector3 particleInertia = joblifyDynamicBone.m_objectInertia * joblifyDynamicBone.inertia;
                particle.prevPosition += particleInertia;
                particle.position     += particleInertia;

                //Verlet Integration & Damping
                Vector3 velocity = particle.position - particle.prevPosition;
                particle.prevPosition = particle.position;
                particle.position    += velocity * (1 - joblifyDynamicBone.damping);
            }
        }
    }
示例#2
0
    private void ResetTransform(JoblifyDynamicBone.Particle particle)
    {
        if (particle.trans == null)
        {
            return;
        }

        particle.trans.localPosition = particle.initLocalPosition;
        particle.trans.localRotation = particle.initLocalRotation;
    }
示例#3
0
    private void UpdateTransforms(JoblifyDynamicBone joblifyDynamicBone)
    {
        for (int i = 1, count = joblifyDynamicBone.m_particles.Count; i < count; ++i)
        {
            JoblifyDynamicBone.Particle particle = joblifyDynamicBone.m_particles[i];
            Transform particleTrans = particle.trans;

            JoblifyDynamicBone.Particle parentParticle = joblifyDynamicBone.m_particles[particle.parentIndex];
            Transform parentParticleTrans = parentParticle.trans;

            Vector3    v   = particleTrans.localPosition;
            Quaternion rot = Quaternion.FromToRotation(parentParticleTrans.TransformDirection(v), particle.position - parentParticle.position);
            parentParticleTrans.rotation = rot * parentParticleTrans.rotation;

            particleTrans.position = particle.position;
        }
    }
示例#4
0
    private void UpdateElasticityStiffness(JoblifyDynamicBone joblifyDynamicBone)
    {
        for (int i = 0, count = joblifyDynamicBone.m_particles.Count; i < count; i++)
        {
            JoblifyDynamicBone.Particle particle = joblifyDynamicBone.m_particles[i];
            if (particle.parentIndex < 0)
            {
                continue;
            }

            Transform particleTrans = particle.trans;
            JoblifyDynamicBone.Particle parentParticle = joblifyDynamicBone.m_particles[particle.parentIndex];
            Transform parentParticleTrans = parentParticle.trans;

            //Elasticity
            Matrix4x4 m0 = parentParticleTrans.localToWorldMatrix;
            m0.SetColumn(3, parentParticle.position);
            Vector3 targetPosition = m0.MultiplyPoint3x4(particleTrans.localPosition);
            Vector3 delta          = targetPosition - particle.position;
            particle.position += delta * joblifyDynamicBone.elasticity;

            //Stiffness
            float deltaLength = delta.magnitude;
            float length      = (parentParticleTrans.position - particleTrans.position).magnitude;
            float lengthMax   = length * 2 * (1 - joblifyDynamicBone.stiffness);
            if (deltaLength > lengthMax)
            {
                particle.position += delta * (deltaLength - lengthMax) / deltaLength;
            }

            //Length Constraint
            delta              = parentParticle.position - particle.position;
            deltaLength        = delta.magnitude;
            particle.position += delta * (deltaLength - length) / deltaLength;
        }
    }