|
|
- 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;
- }
-
- }
- }
|