Advertisement
Muk99

SoftBody

Oct 6th, 2015
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.39 KB | None | 0 0
  1. using UnityEngine;
  2.  
  3. public class SoftBody : MonoBehaviour {
  4.  
  5.     [Range(0, 1f)]
  6.     public float forceMultiplier = 0.025f;
  7.     public float range = 0.2f;
  8.  
  9.     private int i;
  10.     private int k;
  11.     private Vector3 force;
  12.     private Vector3[] vertices;
  13.     private Mesh mesh;
  14.     private Vector3 localPosition;
  15.     private float distance;
  16.  
  17.     private void Start() {
  18.         var filter = GetComponent<MeshFilter>();
  19.         mesh = Instantiate<Mesh>(filter.sharedMesh);
  20.         filter.mesh = mesh;
  21.         mesh.Optimize();
  22.     }
  23.  
  24.     private void OnCollisionEnter(Collision collision) {
  25.         if(collision.contacts.Length > 0)
  26.             for(i = 0; i < collision.contacts.Length; i++) {
  27.                 force = collision.relativeVelocity;
  28.                 force *= forceMultiplier;
  29.  
  30.                 DeformMeshes(collision.contacts[i].point, force);
  31.             }
  32.     }
  33.  
  34.     private void DeformMeshes(Vector3 position, Vector3 force) {
  35.  
  36.         localPosition = transform.InverseTransformPoint(position);
  37.         vertices = mesh.vertices;
  38.         for(k = 0; k < vertices.Length; k++) {
  39.             distance = Mathf.Clamp01(range - (localPosition - vertices[k]).sqrMagnitude);
  40.             vertices[k] = Vector3.Slerp(vertices[k], vertices[k] - force, distance);
  41.         }
  42.         mesh.vertices = vertices;
  43.         mesh.RecalculateBounds();
  44.         mesh.RecalculateNormals();
  45.     }
  46. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement