Advertisement
Guest User

FABRIKTest

a guest
Feb 25th, 2020
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.65 KB | None | 0 0
  1. using Unity.Mathmatics;
  2. using UnityEngine;
  3.  
  4. public class FABRIKTest : MonoBehaviour
  5. {
  6.     void Awake() => camera = Camera.main;
  7.  
  8.     void Update()
  9.     {
  10.             float3 mousePosition = Input.mousePosition;
  11.         mousePosition.z = -camera.transform.position.z;
  12.         float3 worldMousePosition = new float3(camera.ScreenToWorldPoint(mousePosition));
  13.  
  14.         float3 screenCenter = camera.ViewportToWorldPoint(new float3(new float2(0.5f, 0.5f), -camera.transform.position.z));
  15.  
  16.         Debug.DrawLine(screenCenter + new float3(-0.1f, 0, 0), screenCenter + new float3(0.1f, 0, 0));
  17.         Debug.DrawLine(screenCenter + new float3(0, -0.1f, 0), screenCenter + new float3(0, 0.1f, 0));
  18.  
  19.         if (Input.GetMouseButton(0))
  20.             target = math.lerp(worldMousePosition.xy - screenCenter.xy, target, math.pow(2, -5 * Time.deltaTime));
  21.  
  22.         if (Input.GetMouseButton(1))
  23.         {
  24.             float3 newCameraPosition = camera.transform.position;
  25.             newCameraPosition = math.lerp(worldMousePosition + new float3(0, 0, camera.transform.position.z), newCameraPosition, math.pow(2, -Time.deltaTime));
  26.             camera.transform.position = newCameraPosition;
  27.         }
  28.  
  29.         float2 root = segments[segments.Length - 1];
  30.  
  31.         for (int i = 0; segments.Length - 1 > i; i++)
  32.         {
  33.             float2 r = Reach(segments[i], segments[i + 1], target);
  34.             segments[i] = target;
  35.             target = r;
  36.         }
  37.  
  38.         segments[segments.Length - 1] = target;
  39.  
  40.         target = root;
  41.  
  42.         for (int i = segments.Length - 1; i > 0; i--)
  43.         {
  44.             float2 r = Reach(segments[i], segments[i - 1], target);
  45.             segments[i] = target;
  46.             target = r;
  47.         }
  48.  
  49.         segments[0] = target;
  50.        
  51.         for (int i = 0; segments.Length - 1 > i; i++)
  52.         {
  53.             solutions[i + 1] = screenCenter + new float3(segments[i], 0);
  54.             solutions[i + 2] = screenCenter + new float3(segments[i + 1], 0);
  55.         }
  56.  
  57.         solutions[0] = solutions[1];
  58.         solutions[solutions.Length - 1] = solutions[solutions.Length - 2];
  59.  
  60.         for (int i = 0; solutions.Length - 1 > i; i++)
  61.             Debug.DrawLine(solutions[i], solutions[i + 1]);
  62.     }
  63.  
  64.     private float2 Reach(float2 head, float2 tail, float2 target)
  65.     {
  66.         float2 direction = tail - target;
  67.         return target + (direction * math.length(tail - head) / math.length(direction));
  68.     }
  69.  
  70.     float2[] segments = new float2[6] { new float2(5, 4), new float2(4, 3), new float2(3, 2), new float2(2, 1), new float2(1, 0), new float2(0, 0) };
  71.     float3[] solutions = new float3[6 + 2];
  72.     float2 target = float2.zero;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement