T Out Parameter for Get Nearest Point

This commit is contained in:
Josh4359 2023-09-18 14:46:11 -07:00
parent 56e460a95b
commit 5fba9784c2
4 changed files with 396 additions and 349 deletions

View File

@ -4,13 +4,16 @@ using System;
using UnityEditor; using UnityEditor;
using UnityEngine; using UnityEngine;
using UnityEngine.Splines; using UnityEngine.Splines;
using static SplineImporter;
using static SplineData;
using System.IO; using System.IO;
using System.Text; using System.Text;
using Unity.Mathematics; using Unity.Mathematics;
using System.Collections.Generic; using System.Collections.Generic;
namespace FrameJosh.SplineImporter
{
using static SplineImporter;
using static SplineData;
[CustomEditor(typeof(SplineImporter))] [CustomEditor(typeof(SplineImporter))]
public class SplineImporterEditor : Editor public class SplineImporterEditor : Editor
{ {
@ -188,3 +191,4 @@ public class SplineData
} }
#endif #endif
}

View File

@ -2,13 +2,15 @@ using Unity.Mathematics;
using UnityEngine; using UnityEngine;
using UnityEngine.Splines; using UnityEngine.Splines;
namespace FrameJosh.SplineImporter
{
public class SplinePlus : MonoBehaviour public class SplinePlus : MonoBehaviour
{ {
public SplineContainer splineContainer; public SplineContainer splineContainer;
public SplineContainer deformContainer; public SplineContainer deformContainer;
public int resolution; public int resolution = 1;
public void Evaluate(int splineIndex, float anchor, float distance, out Vector3 position, out Quaternion rotation) public void Evaluate(int splineIndex, float anchor, float distance, out Vector3 position, out Quaternion rotation)
{ {
@ -30,6 +32,40 @@ public class SplinePlus : MonoBehaviour
EvaluateSpline(t, out position, out rotation); EvaluateSpline(t, out position, out rotation);
} }
public void GetNearestPoint(int splineIndex, Vector3 point, out Vector3 position, out Quaternion rotation, out float t)
{
position = Vector3.zero;
rotation = Quaternion.identity;
t = 0;
float nearestDistance = Mathf.Infinity;
for (int i = 0; i < splineContainer.Splines.Count; i++)
{
int resolutionScale = Mathf.CeilToInt(splineContainer.Splines[i].GetLength()) * resolution;
for (float j = 0; j <= resolutionScale; j++)
{
Evaluate(i, j / resolutionScale, 0, out Vector3 thisPosition, out Quaternion thisRotation);
float thisDistance = Vector3.Distance(point, thisPosition);
if (thisDistance < nearestDistance)
{
position = thisPosition;
rotation = thisRotation;
t = j / resolutionScale;
nearestDistance = thisDistance;
}
}
}
}
public void GetNearestPoint(Vector3 point, out Vector3 position, out Quaternion rotation) public void GetNearestPoint(Vector3 point, out Vector3 position, out Quaternion rotation)
{ {
position = Vector3.zero; position = Vector3.zero;
@ -168,7 +204,7 @@ public class SplinePlus : MonoBehaviour
upVector = splineContainer.transform.TransformDirection(upVector); upVector = splineContainer.transform.TransformDirection(upVector);
} }
void OnDrawGizmos() void OnDrawGizmosSelected()
{ {
if (!splineContainer || !deformContainer) return; if (!splineContainer || !deformContainer) return;
@ -193,3 +229,4 @@ public class SplinePlus : MonoBehaviour
} }
} }
} }
}

View File

@ -1,6 +1,8 @@
using Unity.Mathematics; using Unity.Mathematics;
using UnityEngine; using UnityEngine;
namespace FrameJosh.SplineImporter.Samples
{
public class SplineEvaluateDebug : MonoBehaviour public class SplineEvaluateDebug : MonoBehaviour
{ {
[SerializeField] SplinePlus splinePlus; [SerializeField] SplinePlus splinePlus;
@ -46,3 +48,4 @@ public class SplineEvaluateDebug : MonoBehaviour
Gizmos.DrawRay(position, transform.forward * matrixSize); Gizmos.DrawRay(position, transform.forward * matrixSize);
} }
} }
}

View File

@ -1,5 +1,7 @@
using UnityEngine; using UnityEngine;
namespace FrameJosh.SplineImporter.Samples
{
public class SplineNearestPointDebug : MonoBehaviour public class SplineNearestPointDebug : MonoBehaviour
{ {
[SerializeField] SplinePlus splinePlus; [SerializeField] SplinePlus splinePlus;
@ -15,3 +17,4 @@ public class SplineNearestPointDebug : MonoBehaviour
Gizmos.DrawCube(position, Vector3.one * cubeSize); Gizmos.DrawCube(position, Vector3.one * cubeSize);
} }
} }
}