using UnityEngine; using sam; using System; using System.Collections.Generic; public class GeoCap : MonoBehaviour { public float vertexDistance = 0.02f; public float outerVertDistance = 0.005f; public int minVertsInRing = 8; public int minVertsInLastRing = 32; MeshFilter meshFilter; void Awake() { meshFilter = GetComponent(); } public void OnCapCenterChanged(Vector3 c) { Vector3 refAxis = new Vector3(0.0f, 1.0f, 0.0f); Quaternion q = Quaternion.FromToRotation(refAxis, c); transform.rotation = q; } public void OnCapRadiusChanged(float radius) { //float s = r / 90.0f; //capGeometry.localScale = new Vector3(s, 0.00001f, s); float arcLen = Mathf.PI * radius / 180.0f; int numRings = ((int)Mathf.Ceil(arcLen / vertexDistance)) + 1; // angular separation between consecutive rings float deltaLatitude = radius / (numRings - 1); //Debug.Log($"Radius:{radius} arcLen={arcLen} numRings={numRings}"); int[] ringcount = new int[numRings]; int[] ringoffset = new int[numRings]; List verts = new List(); List inds = new List(); // ring 0 (single vertex at cap center) ringcount[0] = 1; ringoffset[0] = 0; verts.Add(new Vector3(0.0f,1.0f,0.0f)); Vector3 apex = new Vector3(0.0f, 1.0f, 0.0f); for (int ringIndex = 1; ringIndex < numRings; ringIndex++) { ringoffset[ringIndex] = ringoffset[ringIndex - 1] + ringcount[ringIndex - 1]; Quaternion rot = Quaternion.Euler(deltaLatitude*ringIndex, 0.0f, 0.0f); Vector3 p = rot * apex; float circumf = (new Vector2(p.x, p.z).magnitude) * 2 * Mathf.PI; int numVerts; if (ringIndex == numRings-1) { numVerts = (int)Mathf.Ceil(circumf / outerVertDistance) + 1; if (numVerts < minVertsInLastRing) numVerts = minVertsInLastRing; } else { numVerts = (int)Mathf.Ceil(circumf / vertexDistance) + 1; if (numVerts < minVertsInRing) numVerts = minVertsInRing; } ringcount[ringIndex] = numVerts; float deltaLongitude = 360.0f / numVerts; //Debug.Log($"Ring:{ringIndex} circumf={circumf} numVerts={ringcount[ringIndex]}"); for (int vi=0; vi < numVerts; vi++) { rot = Quaternion.Euler(0.0f, deltaLongitude * vi, 0.0f); Vector3 v = rot * p; verts.Add(v); } } // tessellate inner disc (tri-strip) int n = ringcount[1]; for (int i=0; i