using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
|
|
namespace Utility.Meshes
|
|
{
|
|
|
|
public static class Curve
|
|
{
|
|
|
|
// Could do this on the GPU
|
|
public static Vector3[] CurveVertices(Vector3[] vertices, Vector3 ringCentre, Vector3 Axis, Transform origin, Vector3 meshCentre)
|
|
{
|
|
Vector3[] curvedVertices = new Vector3[vertices.Length];
|
|
Vector3 down = Vector3.ProjectOnPlane(meshCentre - ringCentre, Axis).normalized;
|
|
Vector3 perpendicular = Vector3.Cross(Axis, down).normalized;
|
|
float radius = Vector3.ProjectOnPlane(meshCentre - ringCentre, Axis).magnitude;
|
|
|
|
for (int i = 0; i < vertices.Length; i++)
|
|
{
|
|
Vector3 position = origin.TransformPoint(vertices[i]);
|
|
Vector3 directionFromCentre = Vector3.Project(position - meshCentre, perpendicular);
|
|
Vector3 directionAlongAxis = Vector3.Project(position - ringCentre, Axis);
|
|
float vertexRadius = Vector3.Project(position - ringCentre, down).magnitude;
|
|
|
|
float arcLength = directionFromCentre.magnitude;
|
|
float angle = (arcLength / radius);
|
|
if (Vector3.Dot(directionFromCentre, perpendicular) < 0)
|
|
angle = -angle;
|
|
|
|
Vector3 curvedDirection = Quaternion.AngleAxis(Mathf.Rad2Deg * angle, Axis) * down;
|
|
curvedVertices[i] = origin.InverseTransformPoint(ringCentre + (curvedDirection.normalized * (vertexRadius)) + directionAlongAxis);
|
|
}
|
|
|
|
return curvedVertices;
|
|
}
|
|
|
|
}
|
|
}
|