|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
using System.Collections;
|
|
|
|
|
|
using UnityEditor;
|
|
|
|
|
|
|
|
|
|
|
|
namespace RootMotion.Dynamics {
|
|
|
|
|
|
|
|
|
|
|
|
// Tools for symmetric operations
|
|
|
|
|
|
public class SymmetryTools: Editor {
|
|
|
|
|
|
|
|
|
|
|
|
public static Rigidbody GetSymmetric(Rigidbody r, Rigidbody[] R, Transform root) {
|
|
|
|
|
|
Vector3 localPos = root.InverseTransformPoint(r.position);
|
|
|
|
|
|
|
|
|
|
|
|
Rigidbody closest = null;
|
|
|
|
|
|
float closestDistance = 0.01f;
|
|
|
|
|
|
|
|
|
|
|
|
foreach (Rigidbody r2 in R) {
|
|
|
|
|
|
if (r != r2) {
|
|
|
|
|
|
Vector3 localPos2 = root.InverseTransformPoint(r2.position);
|
|
|
|
|
|
localPos2.x = -localPos2.x;
|
|
|
|
|
|
|
|
|
|
|
|
float dist = Vector3.Distance(localPos, localPos2);
|
|
|
|
|
|
if (dist < closestDistance) {
|
|
|
|
|
|
closest = r2;
|
|
|
|
|
|
closestDistance = dist;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return closest;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static Collider GetSymmetric(Collider c, Collider[] C, Transform root) {
|
|
|
|
|
|
Vector3 localPos = root.InverseTransformPoint(c.transform.position);
|
|
|
|
|
|
|
|
|
|
|
|
Collider closest = null;
|
|
|
|
|
|
float closestDistance = 0.01f;
|
|
|
|
|
|
|
|
|
|
|
|
foreach (Collider c2 in C) {
|
|
|
|
|
|
if (c != c2) {
|
|
|
|
|
|
Vector3 localPos2 = root.InverseTransformPoint(c2.transform.position);
|
|
|
|
|
|
localPos2.x = -localPos2.x;
|
|
|
|
|
|
|
|
|
|
|
|
float dist = Vector3.Distance(localPos, localPos2);
|
|
|
|
|
|
if (dist < closestDistance) {
|
|
|
|
|
|
closest = c2;
|
|
|
|
|
|
closestDistance = dist;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return closest;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static Vector3 MirrorDelta(Transform r, Transform s, Transform root, Vector3 delta) {
|
|
|
|
|
|
Vector3 dXW = r.right * delta.x;
|
|
|
|
|
|
Vector3 dYW = r.up * delta.y;
|
|
|
|
|
|
Vector3 dZW = r.forward * delta.z;
|
|
|
|
|
|
|
|
|
|
|
|
Vector3 dXWM = Mirror(dXW, root);
|
|
|
|
|
|
Vector3 dYWM = Mirror(dYW, root);
|
|
|
|
|
|
Vector3 dZWM = Mirror(dZW, root);
|
|
|
|
|
|
|
|
|
|
|
|
Vector3 deltaS = Vector3.zero;
|
|
|
|
|
|
deltaS = DeltaSize(deltaS, s, dXWM, delta.x);
|
|
|
|
|
|
deltaS = DeltaSize(deltaS, s, dYWM, delta.y);
|
|
|
|
|
|
deltaS = DeltaSize(deltaS, s, dZWM, delta.z);
|
|
|
|
|
|
|
|
|
|
|
|
return deltaS;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static Vector3 Mirror(Vector3 v, Transform root) {
|
|
|
|
|
|
Vector3 local = root.InverseTransformVector(v);
|
|
|
|
|
|
return root.TransformVector(-local.x, local.y, local.z);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static Vector3 DeltaSize(Vector3 size, Transform t, Vector3 direction, float delta) {
|
|
|
|
|
|
Axis axis = AxisTools.GetAxisToDirection(t, direction);
|
|
|
|
|
|
|
|
|
|
|
|
switch(axis) {
|
|
|
|
|
|
case Axis.X: size.x += delta; break;
|
|
|
|
|
|
case Axis.Y: size.y += delta; break;
|
|
|
|
|
|
case Axis.Z: size.z += delta; break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return size;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static Collider[] GetColliderPair(Collider r, Collider s) {
|
|
|
|
|
|
if (s == null) return new Collider[1] {r};
|
|
|
|
|
|
return new Collider[2] {r, s};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|