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); } } }
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); }