Mesh编程——三角形,多边形,正方体,园形,圆环
基类:
using System.Collections; using System.Collections.Generic; using UnityEngine; public abstract class MeshDrawBase : MonoBehaviour { protected MeshFilter targetFilter; protected Mesh mh; protected int[] tris; protected Vector2[] uvs; protected Vector3[] nornals; private void Awake() { targetFilter = GetComponent<MeshFilter>(); } protected virtual void Update() { } protected abstract void DrawMesh(); }
画出顶点:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MeshInfoImationPrint : MeshDrawBase { protected override void DrawMesh() { } private void OnDrawGizmos()//编辑器模式调用 { targetFilter = GetComponent<MeshFilter>(); mh = targetFilter.sharedMesh; Gizmos.color = Color.red; for (int i = 0; i < mh.vertices.Length; i++) { Vector3 worldPoint = transform.TransformPoint(mh.vertices[i]);//局部坐标转成世界坐标 Gizmos.DrawSphere(worldPoint, .1f); } } }
画三角形:
using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 画三角形 /// </summary> [RequireComponent(typeof(MeshFilter))] [RequireComponent(typeof(MeshRenderer))] public class TriangleDraw : MeshDrawBase { public List<Vector3> vts = new List<Vector3>(); private void Start() { mh = new Mesh(); //获取顶点 //世界坐标转换成局部坐标 for (int i = 0; i < vts.Count; i++) { vts[i] = transform.InverseTransformPoint(vts[i]); } mh.vertices = vts.ToArray(); //三角形 tris = new int[3]; tris[0] = 0; tris[1] = 1; tris[2] = 2; mh.triangles = tris; //uv uvs = new Vector2[vts.Count]; uvs[0] = new Vector2(0, 0); uvs[1] = new Vector2(0, 1); uvs[2] = new Vector2(1, 0); mh.uv = uvs; mh.RecalculateBounds(); mh.RecalculateNormals();//法线 mh.RecalculateTangents();//切线 targetFilter.mesh = mh; } protected override void DrawMesh() { } }
画多边形:
using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 画多边形 /// </summary> [RequireComponent(typeof(MeshFilter))]//挂脚本时,自动添加组件 [RequireComponent(typeof(MeshRenderer))] public class CreatManyTriabgle : MeshDrawBase { private List<Vector3> vts = new List<Vector3>(); protected override void DrawMesh() { } private void DrawPolygon() { mh = new Mesh(); //顶点 mh.vertices = vts.ToArray(); //三角形 int trislength = (vts.Count - 2) * 3; tris = new int[trislength]; for (int i = 0,n=1; i < trislength; i+=3,n++) { tris[i] = 0; tris[i + 1] = n; tris[i + 2] = n + 1; } mh.triangles = tris; //法线 nornals = new Vector3[vts.Count]; for (int i = 0; i < vts.Count; i++) { nornals[i] = new Vector3(0, 0, 1); } mh.normals = nornals; mh.RecalculateBounds(); mh.RecalculateTangents(); targetFilter.mesh = mh; } protected override void Update() { base.Update(); if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if(Physics.Raycast(ray,out hit, Mathf.Infinity)) { Vector3 worldHitPoint = hit.point; //世界转成局部坐标 Vector3 localHitPoint = transform.InverseTransformPoint(worldHitPoint); vts.Add(localHitPoint); } } if (Input.GetKeyDown(KeyCode.R)) { Reset(); } if (Input.GetKeyDown(KeyCode.S)) { // Debug.LogError(111); DrawPolygon(); } } private void Reset()//重置 { vts.Clear(); targetFilter.mesh = null; Destroy(mh); } private void OnGUI()//显示数字序号 { if (vts.Count == 0) return; GUI.color = Color.red; for (int i = 0; i < vts.Count; i++) { Vector3 worldPoint = transform.TransformPoint(vts[i]); Vector3 screenPoint = Camera.main.WorldToScreenPoint(worldPoint); Vector3 uiPoint = new Vector3(screenPoint.x, Camera.main.pixelHeight - screenPoint.y, screenPoint.z); GUI.Label(new Rect(uiPoint, new Vector3(100, 80)), i.ToString()); } } private void OnDrawGizmos()//画线 { if (vts.Count == 0) return; Gizmos.color = Color.cyan;//金色 for (int i = 0; i < vts.Count; i++) { //转成世界坐标 Vector3 worldHitPoint = transform.TransformPoint(vts[i]); Gizmos.DrawSphere(worldHitPoint, .2f); } } }
画正方体:
using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 画正方体 /// </summary> [RequireComponent(typeof(MeshFilter))] [RequireComponent(typeof(MeshRenderer))] public class DrawMeshCube : MeshDrawBase { public List<Vector3> vts = new List<Vector3>(); private void Start() { mh = new Mesh(); //顶点 mh.vertices = vts.ToArray(); //三角形 tris = new int[] { 0,3,1, 3,2,1,//下 0,4,7, 0,7,3,//前 3,7,2,//右 2,7,6, 2,6,1,//后 6,5,1, 1,5,4, 1,4,0,//左 7,4,5, 7,5,6//上 }; mh.triangles = tris; mh.RecalculateBounds(); mh.RecalculateNormals(); mh.RecalculateTangents(); targetFilter.mesh = mh; } protected override void DrawMesh() { } private void OnDrawGizmos() { if (vts.Count == 0) return; Gizmos.color = Color.red;//点的颜色 for (int i = 0; i < vts.Count; i++) { Vector3 worldPoint = transform.TransformPoint(vts[i]);//转成世界坐标 Gizmos.DrawSphere(worldPoint, .1f);//画点 } } }
画圆:
画圆环:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class huayuan : MonoBehaviour { public Material mat;//材质 Vector3 vec = new Vector3(0, 0, 0);//原点坐标 int num = 100;//园的分割数 // Use this for initialization void Start() { // DrawCircle(1,num , vec); DrawRing(1, .8f, num, vec); } /// <summary> /// 画圆 /// </summary> /// <param name="radius">圆的半径</param> /// <param name="segments">圆的分割数</param> /// <param name="centerCircle">圆心得位置</param> void DrawCircle(float radius, int segments, Vector3 centerCircle) { gameObject.AddComponent<MeshFilter>(); gameObject.AddComponent<MeshRenderer>(); gameObject.GetComponent<MeshRenderer>().material = mat; //顶点 Vector3[] vertices = new Vector3[segments + 1]; vertices[0] = centerCircle; float deltaAngle = Mathf.Deg2Rad * 360f / segments; float currentAngle = 0; for (int i = 1; i < vertices.Length; i++) { float cosA = Mathf.Cos(currentAngle); float sinA = Mathf.Sin(currentAngle); vertices[i] = new Vector3(cosA * radius + centerCircle.x, sinA * radius + centerCircle.y, 0); currentAngle += deltaAngle; } int[] triangles = new int[segments * 3]; for (int i = 0, j = 1; i < segments * 3 - 3; i += 3, j++) { triangles[i] = 0; triangles[i + 1] = j + 1; triangles[i + 2] = j; } triangles[segments * 3 - 3] = 0; triangles[segments * 3 - 2] = 1; triangles[segments * 3 - 1] = segments; Mesh mesh = GetComponent<MeshFilter>().mesh; mesh.Clear(); mesh.vertices = vertices; mesh.triangles = triangles; } // 画圆环 /// <summary> /// 画圆环 /// </summary> /// <param name="radius">圆半径</param> /// <param name="innerRadius">内圆半径</param> /// <param name="segments">圆的分个数</param> /// <param name="centerCircle">圆心坐标</param> void DrawRing(float radius, float innerRadius, int segments, Vector3 centerCircle) { gameObject.AddComponent<MeshFilter>(); gameObject.AddComponent<MeshRenderer>(); gameObject.GetComponent<MeshRenderer>().material = mat; //顶点 Vector3[] vertices = new Vector3[segments * 2]; float deltaAngle = Mathf.Deg2Rad * 360f / segments; float currentAngle = 0; for (int i = 0; i < vertices.Length; i += 2) { float cosA = Mathf.Cos(currentAngle); float sinA = Mathf.Sin(currentAngle); vertices[i] = new Vector3(cosA * innerRadius + centerCircle.x, sinA * innerRadius + centerCircle.y, 0); vertices[i + 1] = new Vector3(cosA * radius + centerCircle.x, sinA * radius + centerCircle.y, 0); currentAngle += deltaAngle; } //三角形 int[] triangles = new int[segments * 6]; for (int i = 0, j = 0; i < segments * 6; i += 6, j += 2) { triangles[i] = j; triangles[i + 1] = (j + 1) % vertices.Length; triangles[i + 2] = (j + 3) % vertices.Length; triangles[i + 3] = j; triangles[i + 4] = (j + 3) % vertices.Length; triangles[i + 5] = (j + 2) % vertices.Length; } Mesh mesh = GetComponent<MeshFilter>().mesh; mesh.Clear(); mesh.vertices = vertices; mesh.triangles = triangles; } }
莫说我穷的叮当响,大袖揽清风。
莫讥我困时无处眠,天地做床被。
莫笑我渴时无美酒,江湖来做壶。