diff --git a/LinearAlgebra/Spherical.cs b/LinearAlgebra/Spherical.cs index 111a637..e9c2b5b 100644 --- a/LinearAlgebra/Spherical.cs +++ b/LinearAlgebra/Spherical.cs @@ -1,4 +1,4 @@ -using Vector3 = UnityEngine.Vector3; +using UnityEngine; namespace Passer.LinearAlgebra { public class Spherical { @@ -6,6 +6,7 @@ namespace Passer.LinearAlgebra { public Direction direction; public static Spherical zero = new(0, 0, 0); + public static Spherical forward = new(1, 0, 0); public Spherical(float distance, float horizontal, float vertical) { this.distance = distance; @@ -16,6 +17,17 @@ namespace Passer.LinearAlgebra { this.direction = direction; } + public static Spherical FromVector3(Vector3 v) { + float distance = v.magnitude; + if (distance == 0.0f) + return new Spherical(distance, 0, 0); + else { + float verticalAngle = (Mathf.PI / 2 - Mathf.Acos(v.y / distance)) * Mathf.Rad2Deg; + float horizontalAngle = Mathf.Atan2(v.x, v.z) * Mathf.Rad2Deg; + return new Spherical(distance, horizontalAngle, verticalAngle); + } + } + public Vector3 ToVector3() { float verticalRad = (UnityEngine.Mathf.PI / 2) - this.direction.vertical * UnityEngine.Mathf.Deg2Rad; float horizontalRad = this.direction.horizontal * UnityEngine.Mathf.Deg2Rad; @@ -30,7 +42,6 @@ namespace Passer.LinearAlgebra { Vector3 v = new Vector3(x, y, z); return v; - } } } \ No newline at end of file diff --git a/Thing.cs b/Thing.cs index 74fd51c..c78851a 100644 --- a/Thing.cs +++ b/Thing.cs @@ -7,6 +7,7 @@ namespace Passer.Control.Core { /// <summary> /// A thing is the basic building block /// </summary> + [Serializable] public class Thing { #region Types @@ -126,6 +127,7 @@ namespace Passer.Control.Core { public Spherical angularVelocity; #if UNITY_5_3_OR_NEWER + [NonSerialized] public Unity.Thing component; #endif diff --git a/Unity/DistanceSensor.cs b/Unity/DistanceSensor.cs index 1b7c9c4..c623c15 100644 --- a/Unity/DistanceSensor.cs +++ b/Unity/DistanceSensor.cs @@ -7,7 +7,7 @@ namespace Passer.Control.Unity { public class DistanceSensor : Thing { public new Core.DistanceSensor core { - get => (Core.DistanceSensor)base.core; + get => (Core.DistanceSensor)base.core; set => base.core = value; } @@ -29,12 +29,16 @@ namespace Passer.Control.Unity { IEnumerator MeasureDistance() { while (Application.isPlaying) { - if (Physics.Raycast(this.transform.position, this.transform.forward, out RaycastHit hitInfo, 10.0f)) { - core.distance = hitInfo.distance; - - // send distance to... - yield return new WaitForSeconds(1); + if (Physics.Raycast(this.transform.position, this.transform.forward, out RaycastHit hitInfo, 2.0f)) { + Thing thing = hitInfo.transform.GetComponentInParent<Thing>(); + if (thing == null) { + Debug.Log($"collision {hitInfo.transform.name} {hitInfo.distance}"); + core.distance = hitInfo.distance; + } + else + core.distance = 0; } + yield return new WaitForSeconds(0.1f); } } diff --git a/Unity/Thing.cs b/Unity/Thing.cs index 2687f52..a280ca2 100644 --- a/Unity/Thing.cs +++ b/Unity/Thing.cs @@ -5,6 +5,7 @@ namespace Passer.Control.Unity { public class Thing : MonoBehaviour { + [field: SerializeField] public Core.Thing core {get; set; } protected void SetCoreThing(Core.Thing thing) {