Tanoda
ContactBone.cs
Go to the documentation of this file.
1/******************************************************************************
2 * Copyright (C) Ultraleap, Inc. 2011-2020. *
3 * *
4 * Use subject to the terms of the Apache License 2.0 available at *
5 * http://www.apache.org/licenses/LICENSE-2.0, or another agreement *
6 * between Ultraleap and you, your company or other organization. *
7 ******************************************************************************/
8
9using UnityEngine;
10using System.Collections.Generic;
11
12namespace Leap.Unity.Interaction {
13
23 [AddComponentMenu("")]
24 public class ContactBone : MonoBehaviour {
25
31
36 public
37 #if UNITY_EDITOR
38 new
39 #endif
40 Rigidbody rigidbody;
41
46 #if UNITY_EDITOR
47 new
48 #endif
49 public Collider collider;
50
54 public float width {
55 get {
56 Vector3 scale = collider.transform.lossyScale;
57 if (collider is SphereCollider) {
58 SphereCollider sphere = collider as SphereCollider;
59 return Mathf.Min(sphere.radius * scale.x,
60 Mathf.Min(sphere.radius * scale.y,
61 sphere.radius * scale.z)) * 2F;
62 }
63 else if (collider is CapsuleCollider) {
64 CapsuleCollider capsule = collider as CapsuleCollider;
65 return Mathf.Min(capsule.radius * scale.x,
66 Mathf.Min(capsule.radius * scale.y,
67 capsule.radius * scale.z)) * 1F;
68 }
69 else if (collider is BoxCollider) {
70 BoxCollider box = collider as BoxCollider;
71 return Mathf.Min(box.size.x * scale.x,
72 Mathf.Min(box.size.y * scale.y,
73 box.size.z * scale.z));
74 }
75 else {
76 return Mathf.Min(collider.bounds.size.x * scale.x,
77 Mathf.Min(collider.bounds.size.y * scale.y,
78 collider.bounds.size.z * scale.z));
79 }
80 }
81 }
82
88
93 public FixedJoint joint;
94
99 public FixedJoint metacarpalJoint;
100
105 public Vector3 lastTargetPosition;
106
108
109 Dictionary<IInteractionBehaviour, float> contactingInteractionBehaviours = new Dictionary<IInteractionBehaviour, float>();
110
111 void Start() {
113 }
114
115 void OnDestroy() {
117 }
118
119 void OnCollisionEnter(Collision collision) {
120 #if UNITY_EDITOR
121 bool hitNonInteractionObject = false;
122 #endif
123
124 if (collision.rigidbody == null) {
125 #if UNITY_EDITOR
126 hitNonInteractionObject = true;
127 #endif
128 }
129 else {
130 IInteractionBehaviour interactionObj;
131 if (interactionController.manager.interactionObjectBodies.TryGetValue(collision.rigidbody, out interactionObj)) {
132 _lastObjectTouchedAdjustedMass = collision.rigidbody.mass;
133 if (interactionObj is InteractionBehaviour) {
134 switch ((interactionObj as InteractionBehaviour).contactForceMode) {
135 case ContactForceMode.UI:
137 break;
138 case ContactForceMode.Object:
139 default:
140 if (interactionHand != null) {
142 }
143 else {
145 }
146 break;
147 }
148 }
149
150 if (collision.impulse.magnitude > 0f) {
151 if (!contactingInteractionBehaviours.ContainsKey(interactionObj)) {
153 contactingInteractionBehaviours.Add(interactionObj, Time.fixedTime);
154 }
155 }
156 }
157 else {
158 #if UNITY_EDITOR
159 hitNonInteractionObject = true;
160 #endif
161 }
162 }
163
164 #if UNITY_EDITOR
165 if (hitNonInteractionObject) {
166 // If we hit something that isn't an Interaction Behaviour, there's probably an issue.
167 Debug.LogError("Contact bone collided with something that's not an Interaction"
168 + "Behaviour! This is liable to cause contact bones to build unstable "
169 + "velocities and produce bad behavior. Please check your layer "
170 + "settings in the Interaction Manager, and avoid placing any non-"
171 + "Interaction objects in layers that contain Interaction objects.",
172 this);
173 }
174 #endif
175 }
176
177 private void OnCollisionStay(Collision collision) {
178 if (collision.rigidbody == null) { return; }
179
180 IInteractionBehaviour interactionObj;
181 float timeEntered = 0;
182 if (interactionController.manager.interactionObjectBodies.TryGetValue(collision.rigidbody, out interactionObj)) {
183 if (collision.impulse.magnitude > 0f && !contactingInteractionBehaviours.ContainsKey(interactionObj)) {
185 contactingInteractionBehaviours.Add(interactionObj, Time.fixedTime);
186 } else if (contactingInteractionBehaviours.TryGetValue(interactionObj, out timeEntered) && Time.fixedTime - timeEntered > Time.fixedDeltaTime * 10f) {
188 contactingInteractionBehaviours.Remove(interactionObj);
189 }
190 }
191 }
192
193 void OnCollisionExit(Collision collision) {
194 if (collision.rigidbody == null) { return; }
195
196 IInteractionBehaviour interactionObj;
197 if (interactionController.manager.interactionObjectBodies.TryGetValue(collision.rigidbody, out interactionObj)) {
198 if (contactingInteractionBehaviours.ContainsKey(interactionObj)) {
200 contactingInteractionBehaviours.Remove(interactionObj);
201 }
202 }
203 }
204
205 void OnTriggerEnter(Collider collider) {
206 if (collider.attachedRigidbody == null) { return; }
207
208 IInteractionBehaviour interactionObj;
209 if (interactionController.manager.interactionObjectBodies.TryGetValue(collider.attachedRigidbody, out interactionObj)) {
211
213 }
214 }
215
216 void OnTriggerExit(Collider collider) {
217 if (collider.attachedRigidbody == null) { return; }
218
219 IInteractionBehaviour interactionObj;
220 if (interactionController.manager.interactionObjectBodies.TryGetValue(collider.attachedRigidbody, out interactionObj)) {
222
224 }
225 }
226
227 }
228
229}
UnityEngine.Debug Debug
Definition: TanodaServer.cs:19
Contact Bones store data for the colliders and rigidbodies in each bone of the contact-related repres...
Definition: ContactBone.cs:24
FixedJoint joint
InteractionHands use ContactBones to store additional, hand-specific data. Other InteractionControlle...
Definition: ContactBone.cs:93
Collider collider
The Collider of this ContactBone. This field must not be null for the ContactBone to work correctly.
Definition: ContactBone.cs:49
float width
Soft contact logic requires knowing the "width" of a ContactBone along its axis.
Definition: ContactBone.cs:54
FixedJoint metacarpalJoint
InteractionHands use ContactBones to store additional, hand-specific data. Other InteractionControlle...
Definition: ContactBone.cs:99
InteractionHand interactionHand
InteractionHands use ContactBones to store additional, hand-specific data. Other InteractionControlle...
Definition: ContactBone.cs:87
Vector3 lastTargetPosition
ContactBones remember their last target position; interaction controllers use this to know when to sw...
Definition: ContactBone.cs:105
InteractionController interactionController
ContactBones minimally require references to their InteractionControllerBase, their Rigidbody,...
Definition: ContactBone.cs:30
Rigidbody rigidbody
The Rigidbody of this ContactBone. This field must not be null for the ContactBone to work correctly.
Definition: ContactBone.cs:40
void NotifySoftContactCollisionExit(ContactBone bone, IInteractionBehaviour intObj, Collider collider)
void NotifySoftContactCollisionEnter(ContactBone bone, IInteractionBehaviour intObj, Collider collider)
void NotifyContactBoneCollisionEnter(ContactBone contactBone, IInteractionBehaviour interactionObj)
void NotifyContactBoneCollisionExit(ContactBone contactBone, IInteractionBehaviour interactionObj)
Dictionary< Rigidbody, ContactBone > contactBoneBodies
Maps a Rigidbody to its attached ContactBone, if the Rigidbody is part of an interaction controller.
Dictionary< Rigidbody, IInteractionBehaviour > interactionObjectBodies
Maps a Rigidbody to its attached interaction object, if the Rigidbody is part of and interaction obje...