创建一个扇形Mesh
来源:互联网 发布:手机音乐剪切软件 编辑:程序博客网 时间:2024/04/28 16:45
using UnityEngine;using System.Collections;/* ============================================================================== * 功能描述:测试Mesh创建 * 创 建 者:cjunhong * Q Q :327112182 * 创建日期:2014/11/26 11:23:58 * ==============================================================================*/[RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]public class TestMesh : MonoBehaviour { public float radius = 2; public float angleDegree = 100; public int segments = 10; public int angleDegreePrecision = 1000; public int radiusPrecision = 1000; private MeshFilter meshFilter; private SectorMeshCreator creator = new SectorMeshCreator(); [ExecuteInEditMode] private void Awake() { meshFilter = GetComponent<MeshFilter>(); } private void Update() { meshFilter.mesh = creator.CreateMesh(radius, angleDegree, segments, angleDegreePrecision, radiusPrecision); } void OnDrawGizmos() { Gizmos.color = Color.gray; DrawMesh(); } void OnDrawGizmosSelected() { Gizmos.color = Color.green; DrawMesh(); } private void DrawMesh() { Mesh mesh = creator.CreateMesh(radius, angleDegree, segments, angleDegreePrecision, radiusPrecision); int[] tris = mesh.triangles; for (int i = 0; i < tris.Length; i+=3) { Gizmos.DrawLine(convert2World(mesh.vertices[tris[i]]), convert2World(mesh.vertices[tris[i + 1]])); Gizmos.DrawLine(convert2World(mesh.vertices[tris[i]]), convert2World(mesh.vertices[tris[i + 2]])); Gizmos.DrawLine(convert2World(mesh.vertices[tris[i+1]]), convert2World(mesh.vertices[tris[i + 2]])); } } private Vector3 convert2World(Vector3 src) { return transform.TransformPoint(src); } private class SectorMeshCreator { private float radius; private float angleDegree; private int segments; private Mesh cacheMesh ; /// <summary> /// 创建一个扇形Mesh /// </summary> /// <param name="radius">扇形半价</param> /// <param name="angleDegree">扇形角度</param> /// <param name="segments">扇形弧线分段数</param> /// <param name="angleDegreePrecision">扇形角度精度(在满足精度范围内,认为是同个角度)</param> /// <param name="radiusPrecision"> /// <pre> /// 扇形半价精度(在满足半价精度范围内,被认为是同个半价)。 /// 比如:半价精度为1000,则:1.001和1.002不被认为是同个半径。因为放大1000倍之后不相等。 /// 如果半价精度设置为100,则1.001和1.002可认为是相等的。 /// </pre> /// </param> /// <returns></returns> public Mesh CreateMesh(float radius, float angleDegree, int segments, int angleDegreePrecision, int radiusPrecision) { if (checkDiff(radius, angleDegree, segments, angleDegreePrecision, radiusPrecision)) { Mesh newMesh = Create(radius, angleDegree, segments); if (newMesh != null) { cacheMesh = newMesh; this.radius = radius; this.angleDegree = angleDegree; this.segments = segments; } } return cacheMesh; } private Mesh Create(float radius, float angleDegree, int segments) { if (segments == 0) { segments = 1;#if UNITY_EDITOR Debug.Log("segments must be larger than zero.");#endif } Mesh mesh = new Mesh(); Vector3[] vertices = new Vector3[3 + segments - 1]; vertices[0] = new Vector3(0, 0, 0); float angle = Mathf.Deg2Rad * angleDegree; float currAngle = angle / 2; float deltaAngle = angle / segments; for (int i = 1; i < vertices.Length; i++) { vertices[i] = new Vector3(Mathf.Cos(currAngle) * radius, 0, Mathf.Sin(currAngle) * radius); currAngle -= deltaAngle; } int[] triangles = new int[segments * 3]; for (int i = 0, vi = 1; i < triangles.Length; i += 3, vi++) { triangles[i] = 0; triangles[i + 1] = vi; triangles[i + 2] = vi + 1; } mesh.vertices = vertices; mesh.triangles = triangles; Vector2[] uvs = new Vector2[vertices.Length]; for (int i = 0; i < uvs.Length; i++) { uvs[i] = new Vector2(vertices[i].x, vertices[i].z); } mesh.uv = uvs; return mesh; } private bool checkDiff(float radius, float angleDegree, int segments, int angleDegreePrecision, int radiusPrecision) { return segments != this.segments || (int)((angleDegree - this.angleDegree) * angleDegreePrecision) != 0 || (int)((radius - this.radius) * radiusPrecision) != 0; } } }
0 0
- 创建一个扇形Mesh
- Unity 创建一个扇形Mesh
- Mesh学习笔记3-创建一个box
- 创建mesh
- 创建mesh
- Silverlight - Tip: 使用Expression Blend 创建一个扇形
- MapXtreme创建扇形
- [Unity]利用Mesh在Unity中绘制扇形图片
- [Unity]利用Mesh在Unity中绘制扇形图片2
- OGRE -- HardwareBuffer创建Mesh
- Ogre自己创建Mesh
- Unity3D-Mesh创建
- Unity3D 动态创建Mesh
- unity代码创建mesh
- Mesh Compression 学习 -- OpenCtm 创建mesh文件
- [CSS3学习]画出一个扇形
- 【翻译】 8步之内创建布署一个Silverlight Mesh-enabled web应用
- 8步之内创建布署一个Silverlight Mesh-enabled web应用
- 史上最全的iOS面试题及答案
- [Codeforces #295(Div 1)]简要题解
- Android开发中ScollView嵌套ListView显示不全问题解决
- webapp-tel-emall-sms-weixin
- Handler异步消息处理机制浅析
- 创建一个扇形Mesh
- 在RaspberryPi树莓派上使用RXTX(RXTX的源码安装)
- 【Hbase】Java调用Hbase接口实现数据库操作
- 如何动态的建立大小已知的二维数组(多维数组)
- Eclipse开发Android常用快捷键
- 多线程中锁的概念python
- Linux和Mac中当前目录打开终端(shell)
- linux下查看Memcached运行状态
- 【POJ】 3667 hotel (线段树-区间合并)