void FixedUpdate()
    {
        if (pickArgs != null)
        {
            ObiSolver solver = picker.Cloth.Solver;

            // Calculate picking position in solver space:
            Vector3 targetPosition = pickArgs.worldPosition;
            if (solver.simulateInLocalSpace)
            {
                targetPosition = solver.transform.InverseTransformPoint(targetPosition);
            }

            // Get particle position and velocity:
            Vector4[] positions   = new Vector4[1];
            Vector4[] velocities  = new Vector4[1];
            int       solverIndex = picker.Cloth.particleIndices[pickArgs.particleIndex];
            Oni.GetParticlePositions(solver.OniSolver, positions, 1, solverIndex);
            Oni.GetParticleVelocities(solver.OniSolver, velocities, 1, solverIndex);

            // Calculate effective inverse mass:
            float invMass = picker.Cloth.invMasses[pickArgs.particleIndex] * picker.Cloth.areaContribution[pickArgs.particleIndex];

            if (invMass > 0)
            {
                // Calculate and apply spring force:
                Vector4 force = ((new Vector4(targetPosition[0], targetPosition[1], targetPosition[2], 0) - positions[0]) * springStiffness - velocities[0] * springDamping) / invMass;
                Oni.AddParticleExternalForce(picker.Cloth.Solver.OniSolver, ref force, new int[] { solverIndex }, 1);
            }
        }
    }
Ejemplo n.º 2
0
        public override void ApplyForcesToActor(ObiActor actor)
        {
            Matrix4x4 l2sTransform;

            if (actor.Solver.simulateInLocalSpace)
            {
                l2sTransform = actor.Solver.transform.worldToLocalMatrix * transform.localToWorldMatrix;
            }
            else
            {
                l2sTransform = transform.localToWorldMatrix;
            }

            Vector4 force = l2sTransform.MultiplyVector(Vector3.forward * (intensity + GetTurbulence(turbulence)));

            force[3] = actor.UsesCustomExternalForces ? 1 : 0;

            Oni.AddParticleExternalForce(actor.Solver.OniSolver, ref force, actor.particleIndices, actor.particleIndices.Length);
        }