From bb394358922671961a51362f1e174044e3bc2882 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Mon, 5 Jan 2026 14:39:08 +0100 Subject: [PATCH] Fix Direction.ToVector3 --- Assets/NanoBrain/LinearAlgebra/src/Angle.cs | 4 +++ .../NanoBrain/LinearAlgebra/src/Direction.cs | 36 +++++++++++++++---- Assets/NanoBrain/Neuroid.cs | 4 ++- Assets/Scenes/Boids/Boids.unity | 6 ++-- .../Scripts/Editor/SwarmControl_Editor.cs | 4 +-- 5 files changed, 40 insertions(+), 14 deletions(-) diff --git a/Assets/NanoBrain/LinearAlgebra/src/Angle.cs b/Assets/NanoBrain/LinearAlgebra/src/Angle.cs index d73d257..70f5b10 100644 --- a/Assets/NanoBrain/LinearAlgebra/src/Angle.cs +++ b/Assets/NanoBrain/LinearAlgebra/src/Angle.cs @@ -56,6 +56,10 @@ namespace LinearAlgebra { public readonly float inRevolutions => this.value / 360.0f; + public override string ToString() { + return $"{this.inDegrees} deg."; + } + public static readonly AngleFloat zero = Degrees(0); public static readonly AngleFloat deg90 = Degrees(90); public static readonly AngleFloat deg180 = Degrees(180); diff --git a/Assets/NanoBrain/LinearAlgebra/src/Direction.cs b/Assets/NanoBrain/LinearAlgebra/src/Direction.cs index a962589..dfc90bd 100644 --- a/Assets/NanoBrain/LinearAlgebra/src/Direction.cs +++ b/Assets/NanoBrain/LinearAlgebra/src/Direction.cs @@ -66,6 +66,10 @@ namespace LinearAlgebra { return d; } + public override readonly string ToString() { + return $"Direction(h: {this.horizontal}, v: {this.vertical})"; + } + /// /// A forward direction with zero for both angles /// @@ -107,10 +111,17 @@ namespace LinearAlgebra { /// Convert the direction into a carthesian vector /// /// The carthesian vector corresponding to this direction. - public UnityEngine.Vector3 ToVector3() { - UnityEngine.Quaternion q = UnityEngine.Quaternion.Euler(90 - this.vertical.inDegrees, this.horizontal.inDegrees, 0); - UnityEngine.Vector3 v = q * UnityEngine.Vector3.forward; - return v; + public readonly UnityEngine.Vector3 ToVector3() { + // Convert degrees to radians + float radH = this.horizontal.inRadians; + float radV = this.vertical.inRadians; + + // Calculate Vector + float x = MathF.Cos(radV) * MathF.Cos(radH); + float y = MathF.Sin(radV); + float z = MathF.Cos(radV) * MathF.Sin(radH); + + return new UnityEngine.Vector3(x, y, z); } /// @@ -132,9 +143,20 @@ namespace LinearAlgebra { /// /// The carthesian vector corresponding to this direction. public Vector3Float ToVector3() { - Quaternion q = Quaternion.Euler(90 - this.vertical.inDegrees, this.horizontal.inDegrees, 0); - Vector3Float v = q * Vector3Float.forward; - return v; + // Quaternion q = Quaternion.Euler(90 - this.vertical.inDegrees, this.horizontal.inDegrees, 0); + // Vector3Float v = q * Vector3Float.forward; + // return v; + // Convert degrees to radians + float radH = this.horizontal.inRadians; + float radV = this.vertical.inRadians; + + // Calculate Vector + float x = MathF.Cos(radV) * MathF.Cos(radH); + float y = MathF.Sin(radV); + float z = MathF.Cos(radV) * MathF.Sin(radH); + + return new Vector3Float(x, y, z); + } /// diff --git a/Assets/NanoBrain/Neuroid.cs b/Assets/NanoBrain/Neuroid.cs index 5468235..a7ddff9 100644 --- a/Assets/NanoBrain/Neuroid.cs +++ b/Assets/NanoBrain/Neuroid.cs @@ -83,7 +83,9 @@ public class Neuroid : Nucleus { Vector3 direction = synapseNucleus.outputValue.direction.ToVector3(); float weight = synapse.weight; - float magnitude = weight * curve.Evaluate(synapseNucleus.outputValue.magnitude); + float activatedValue = curve.Evaluate(synapseNucleus.outputValue.magnitude); + float magnitude = weight * activatedValue; + Debug.Log($"{this.name} {synapseNucleus.outputValue.direction} {synapseNucleus.outputValue.direction.horizontal}{synapseNucleus.outputValue.direction.vertical} {direction}"); result += direction * magnitude; } diff --git a/Assets/Scenes/Boids/Boids.unity b/Assets/Scenes/Boids/Boids.unity index 955eb8d..593d20e 100644 --- a/Assets/Scenes/Boids/Boids.unity +++ b/Assets/Scenes/Boids/Boids.unity @@ -374,10 +374,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::SwarmControl speed: 1 - inertia: 0.8 + inertia: 0.9 alignmentForce: 2 cohesionForce: 2 - avoidanceForce: 100 + avoidanceForce: 10 separationDistance: 0.3 perceptionDistance: 2 boundaryForce: 5 @@ -395,7 +395,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: ec888ca5333d45a438f9f417fa5ce135, type: 3} m_Name: m_EditorClassIdentifier: Assembly-CSharp::SwarmSpawn - count: 100 + count: 1 boidPrefab: {fileID: 8702527964058765413, guid: f9c706268554ce449a8773675b2864b8, type: 3} spawnAreaSize: {x: 0.5, y: 0.5, z: 0.5} minDelay: 0.05 diff --git a/Assets/Scenes/Boids/Scripts/Editor/SwarmControl_Editor.cs b/Assets/Scenes/Boids/Scripts/Editor/SwarmControl_Editor.cs index 5feb192..4f2fe37 100644 --- a/Assets/Scenes/Boids/Scripts/Editor/SwarmControl_Editor.cs +++ b/Assets/Scenes/Boids/Scripts/Editor/SwarmControl_Editor.cs @@ -9,14 +9,12 @@ public class SwarmControl_Editor : Editor { DrawDefaultInspector(); if (EditorGUI.EndChangeCheck()) { - SwarmControl swarmControl = (SwarmControl)target; NanoBrainObj[] nanoBrains = FindObjectsByType(FindObjectsSortMode.None); - + foreach (NanoBrainObj brain in nanoBrains) { UpdateWeight(brain, "Avoidance", swarmControl.avoidanceForce); } - //} Debug.Log("Updated weights"); } }