Tanoda
PhysicsHand.cs
Go to the documentation of this file.
1using System.Collections;
2using System.Collections.Generic;
3using UnityEngine;
4
5public class PhysicsHand : MonoBehaviour
6{
7 public bool MasterSwitch = true;
8 public LayerMask collisionMask;
9
10 private new Rigidbody rigidbody;
11
12 private Vector3 targetPosition = Vector3.zero;
13 private Quaternion targetRotation = Quaternion.identity;
14
15 protected const float MaxVelocityChange = 10f;
16 public float VelocityMagic = 6000f;
17 protected const float AngularVelocityMagic = 50f;
18 protected const float MaxAngularVelocityChange = 20f;
19 protected const float HandRadius = 0.05f;
20 private float itemRadius = 0f;
21 private Bounds itemBounds;
22 private Renderer itemRenderer;
23
24 // Start is called before the first frame update
25 void Start()
26 {
27 rigidbody = GetComponent<Rigidbody>();
28 rigidbody.maxAngularVelocity = 50;
29 }
30
31 public void MoveTo(Vector3 position, Quaternion rotation)
32 {
33 //Debug.Log("moveto");
34 if (MasterSwitch)
35 {
36 targetPosition = gameObject.transform.parent.TransformPoint(position);
37 targetRotation = rotation;
39 }
40 else
41 {
42 rigidbody.velocity = Vector3.zero;
43 rigidbody.angularVelocity = Vector3.zero;
44
45 rigidbody.MovePosition(position);
46 rigidbody.MoveRotation(rotation);
47 }
48 }
49
50 public void SetHoldItemRadius(float r)
51 {
52 itemRadius = r;
53 }
54 public void SetHoldItemBounds(Bounds b)
55 {
56 itemBounds = b;
57 }
58 public void SetHoldItemRenderer(Renderer r)
59 {
60 itemRenderer = r;
61 }
62
63 private void OnCollisionEnter(Collision collision)
64 {
65 //Debug.Log($"CollisionEnter: {collision.gameObject}");
66 }
67 protected void ExecuteFixedUpdate()
68 {
69 var deltaPos = targetPosition - transform.position;
70 if (float.IsNaN(deltaPos.x)) return;
71
72 //Debug.Log("target velocity: " + (targetPosition - transform.position));
73
74 Quaternion rotationDelta = targetRotation * Quaternion.Inverse(rigidbody.rotation);
75
76 float angle;
77 Vector3 axis;
78 rotationDelta.ToAngleAxis(out angle, out axis);
79 if (angle > 180)
80 angle -= 360;
81 //Debug.Log("target anular velocity: " + ( angle*axis));
82 var deltaAngle = angle * axis;
83 if (float.IsNaN(deltaAngle.x)) return;
84 if (rigidbody.velocity.magnitude < 1.5f)
85 {
86 rigidbody.velocity = Vector3.MoveTowards(rigidbody.velocity, targetPosition - transform.position, 2f)*4;
87 }
88
89 rigidbody.angularVelocity = Vector3.MoveTowards(rigidbody.angularVelocity, angle*axis, 2f);
90 return;
91 bool handCollides = Physics.CheckSphere(targetPosition, HandRadius, collisionMask);
92 bool itemCondition = Physics.CheckSphere(targetPosition, itemRadius, collisionMask); //TODO: predict item position
93 //var worldBounds = itemBounds;
94 //worldBounds.center = targetPosition;
96 //var itemCollisionGOs = Macro.CollidesWithWhat(Macro.CollidesWithWhat(worldBounds), itemRenderer, targetPosition, targetRotation.eulerAngles);
97
98
99 //bool itemCondition = (itemCollisionGOs == null || itemCollisionGOs.Length <= 0);
100
101 if (!handCollides && !itemCondition)
102 {
103 //keep updating velocity, just in case. Otherwise you get jitter
104 rigidbody.velocity = Vector3.zero;
105 rigidbody.angularVelocity = Vector3.zero;
106 /*
107 rigidbody.velocity = (targetPosition - rigidbody.position) / Time.fixedDeltaTime;
108 float angle; Vector3 axis;
109 (targetRotation * Quaternion.Inverse(rigidbody.rotation)).ToAngleAxis(out angle, out axis);
110 rigidbody.angularVelocity = axis.normalized * angle / Time.fixedDeltaTime;
111 */
112
113 rigidbody.MovePosition(targetPosition);
114 rigidbody.MoveRotation(targetRotation);
115 }
116 else
117 {
118 rigidbody.velocity = Vector3.zero;
119 rigidbody.angularVelocity = Vector3.zero;
120 //return;
121 Vector3 velocityTarget, angularTarget;
122 bool success = GetTargetVelocities(out velocityTarget, out angularTarget);
123 if (success)
124 {
125 float maxAngularVelocityChange = MaxAngularVelocityChange;
126 float maxVelocityChange = MaxVelocityChange;
127
128 rigidbody.velocity = Vector3.MoveTowards(rigidbody.velocity, velocityTarget, maxVelocityChange);
129 rigidbody.angularVelocity = Vector3.MoveTowards(rigidbody.angularVelocity, angularTarget, maxAngularVelocityChange);
130 }
131 }
132 }
133
134 protected bool GetTargetVelocities(out Vector3 velocityTarget, out Vector3 angularTarget)
135 {
136 bool realNumbers = false;
137
138 float velocityMagic = VelocityMagic;
139 float angularVelocityMagic = AngularVelocityMagic;
140
141 Vector3 positionDelta = (targetPosition - rigidbody.position);
142 velocityTarget = (positionDelta * velocityMagic * Time.deltaTime);
143
144 if (float.IsNaN(velocityTarget.x) == false && float.IsInfinity(velocityTarget.x) == false)
145 {
146 realNumbers = true;
147 }
148 else
149 velocityTarget = Vector3.zero;
150
151
152 Quaternion rotationDelta = targetRotation * Quaternion.Inverse(rigidbody.rotation);
153
154
155 float angle;
156 Vector3 axis;
157 rotationDelta.ToAngleAxis(out angle, out axis);
158
159 if (angle > 180)
160 angle -= 360;
161
162 if (angle != 0 && float.IsNaN(axis.x) == false && float.IsInfinity(axis.x) == false)
163 {
164 angularTarget = angle * axis * angularVelocityMagic * Time.deltaTime;
165
166 realNumbers &= true;
167 }
168 else
169 angularTarget = Vector3.zero;
170
171 return realNumbers;
172 }
173
174}
float VelocityMagic
Definition: PhysicsHand.cs:16
const float MaxAngularVelocityChange
Definition: PhysicsHand.cs:18
LayerMask collisionMask
Definition: PhysicsHand.cs:8
bool GetTargetVelocities(out Vector3 velocityTarget, out Vector3 angularTarget)
Definition: PhysicsHand.cs:134
void SetHoldItemBounds(Bounds b)
Definition: PhysicsHand.cs:54
const float HandRadius
Definition: PhysicsHand.cs:19
void ExecuteFixedUpdate()
Definition: PhysicsHand.cs:67
const float AngularVelocityMagic
Definition: PhysicsHand.cs:17
void MoveTo(Vector3 position, Quaternion rotation)
Definition: PhysicsHand.cs:31
void SetHoldItemRadius(float r)
Definition: PhysicsHand.cs:50
bool MasterSwitch
Definition: PhysicsHand.cs:7
const float MaxVelocityChange
Definition: PhysicsHand.cs:15
void SetHoldItemRenderer(Renderer r)
Definition: PhysicsHand.cs:58