using UnityEngine;
using System.Collections;[RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
public class TestCircle : MonoBehaviour {public float Radius = 5;  //半径public int Segments = 50;  //分割数public float InnerRadius = 3; //内圆半径public float AngleDegree = 90;private CircleMeshCreator _creator = new CircleMeshCreator();private MeshFilter _meshFilter;void Awake(){_meshFilter = GetComponent<MeshFilter>();}void Update(){_meshFilter.mesh = _creator.CreateMesh(Radius, Segments, InnerRadius, AngleDegree);}void OnDrawGizmos(){Gizmos.color = Color.gray;DrawMesh();}void OnDrawGizmosSelected(){Gizmos.color = Color.green;DrawMesh();}private void DrawMesh(){Mesh mesh = _creator.CreateMesh(Radius, Segments, InnerRadius, AngleDegree);int[] tris = mesh.triangles;for (int i = 0; i < tris.Length; i+=3){Gizmos.DrawLine(TransformToWorld(mesh.vertices[tris[i]]), TransformToWorld(mesh.vertices[tris[i + 1]]));Gizmos.DrawLine(TransformToWorld(mesh.vertices[tris[i]]), TransformToWorld(mesh.vertices[tris[i + 2]]));Gizmos.DrawLine(TransformToWorld(mesh.vertices[tris[i+1]]), TransformToWorld(mesh.vertices[tris[i + 2]]));}}private Vector3 TransformToWorld(Vector3 src){return transform.TransformPoint(src);}private class CircleMeshCreator{private static readonly int PRECISION = 1000;private float _radius;private int _segments;private float _innerRadius;private float _angleDegree;private Mesh _cacheMesh ;public Mesh CreateMesh(float radius, int segments, float innerRadius, float angleDegree){if (checkDiff(radius, segments, innerRadius, angleDegree)){Mesh newMesh = Create(radius, segments, innerRadius, angleDegree);if (newMesh != null){_cacheMesh = newMesh;this._radius = radius;this._segments = segments;this._innerRadius = innerRadius;this._angleDegree = angleDegree;}}return _cacheMesh;}private Mesh Create(float radius, int segments, float innerRadius, float angleDegree){if (segments <= 0){segments = 1;#if UNITY_EDITORDebug.Log("segments must be larger than zero.");#endif}Mesh mesh = new Mesh();int vlen = segments * 2 + 2;Vector3[] vertices = new Vector3[vlen];float angle = Mathf.Deg2Rad * angleDegree;float currAngle = angle / 2;float deltaAngle = angle / segments;for (int i = 0; i < vlen; i+=2){float cosA = Mathf.Cos(currAngle);float sinA = Mathf.Sin(currAngle);vertices[i] = new Vector3 (cosA * innerRadius, 0, sinA * innerRadius);vertices[i + 1] = new Vector3 (cosA * radius, 0, sinA * radius);currAngle -= deltaAngle;}int tlen = segments * 6;int[] triangles = new int[tlen];for (int i = 0, vi = 0; i < tlen; i += 6, vi+=2){triangles[i] = vi;triangles[i + 1] = vi + 1;triangles[i + 2] = vi + 3;triangles[i + 3] = vi + 3;triangles[i + 4] = vi + 2;triangles[i + 5] = vi;}Vector2[] uvs = new Vector2[vlen];for (int i = 0; i < vlen; i++){uvs [i] = new Vector2 (vertices[i].x / radius / 2 + 0.5f, vertices[i].z / radius / 2 + 0.5f);}mesh.vertices = vertices;mesh.triangles = triangles;mesh.uv = uvs;return mesh;}private bool checkDiff(float radius, int segments, float innerRadius, float angleDegree){return segments != this._segments || (int)((angleDegree - this._angleDegree) * PRECISION) != 0 ||(int)((radius - this._radius) * PRECISION) != 0 || (int)((innerRadius - this._innerRadius) * PRECISION) != 0;}}}

绘制圆形/圆环/扇形/扇面Mesh相关推荐

  1. html5 canvas 圆圈,使用HTML5 Canvas arc()绘制圆形/圆环

    前段时间的一个项目做到这个玩意,研究了一下绘制圆环的方法.最终使用HTML5的画布标签来做.arc()是HTML5 Canvas的一个API函数,作用是"创建弧/曲线(用于创建圆形或部分圆) ...

  2. iOS drawRect绘制圆形/圆环/饼图

    效果如下图的圆,中间的内容可自己添加:隐藏中间白色的圆即是一个饼图 调用方法: GradeView *gradeView = [[GradeView alloc] init]; gradeView.g ...

  3. quartz2D 如何绘制圆形图片, 及圆环图片

    转载自:http://www.cnblogs.com/yuwei0911/p/5277886.html -(void)touchesBegan:(NSSet<UITouch *> *)to ...

  4. Android绘图机制(二)——自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解

    Android绘图机制(二)--自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解 我们要想画好一些炫酷的View,首先我们得知道怎么去画一些基础的图案,比如矩形,圆 ...

  5. PHP如何设置圆,php绘制圆形的方法

    这篇文章主要介绍了php绘制圆形的方法,详细分析了php绘制图形的基本步骤与绘制圆形的实现方法,需要的朋友可以参考下 本文实例讲述了php绘制圆形的方法.分享给大家供大家参考.具体实现方法如下: ph ...

  6. android圆形头像 demo,Android图像处理之绘制圆形头像

    在Android中,绘制圆形和绘制图片都是很容易的事情,但是绘制圆形图片就有点难倒人了.以前为了偷懒就直接去github上找一个开源项目,后来才发现绘制圆形图片其实也是很简单的事.绘制圆形图片也需要两 ...

  7. 精通Android自定义View(十二)绘制圆形进度条

    1 绘图基础简析 1 精通Android自定义View(一)View的绘制流程简述 2 精通Android自定义View(二)View绘制三部曲 3 精通Android自定义View(三)View绘制 ...

  8. 【sketchup 2021】草图大师的基础使用【矩形与橡皮擦、直线与圆、手绘线与多边形、圆形与扇形、推拉工具】

    文章目录 矩形与橡皮擦 矩形普通使用 矩形进阶使用[画立面和分割面] 擦除 连续擦除 选中后不想删除了... 隐藏/显示边线 柔化边线/取消柔化 另一种擦除:删除 直线与圆 直线工具 鼠标绘制 默认绘 ...

  9. c++中用opengl的gl函数在三维空间中绘制圆形和画球体

    c++中用opengl的gl函数在三维空间中绘制圆形和球体 绘制圆形原理: 画圆形的原理如下图,画一个圆形就相当于切蛋糕一样,将一个圆形切成很多个扇形,而扇形可以用三角形类似表示,所以我们可以将绘制圆 ...

最新文章

  1. 【怎样写代码】参数化类型 -- 泛型(六):泛型接口
  2. java中的多态_Java中的多态
  3. 编程之美-程序改错方法整理
  4. 今天俺要说一说工厂方法模式(Factory)
  5. Core Dump解析(1)
  6. 数据仓库项目分析_数据分析项目:仓库库存
  7. asp按时间自动递增编号_约束力最强的手铐——美国ASP钢性手铐
  8. vue 2 使用 Bus.js 实现兄弟 (非父子) 组件通信 简单案例
  9. CSS中盒子模型、嵌套盒子中垂直外边距塌陷问题解决方案、标准盒模型、怪异盒模型
  10. 动态规划问题中最长公共子序列---C语言实现
  11. 010. 深入JVM学习—垃圾收集策略概览
  12. [CQOI2016]手机号码
  13. 韩国军事网络指挥中心遭到网络攻击
  14. 嵌入式系统中常用的通信接口技术
  15. namecheap ssr_如何将SSL证书和自定义Namecheap域添加到GitLab Pages站点
  16. 生命,因追逐梦想而精彩
  17. 绿色建筑评定解析丨智行有嘉
  18. LDO上电瞬间微过冲问题解决和讨论
  19. 程序设计天梯赛2021年选拔 L2-4红豆 (什么完全树给定后序遍历)
  20. 快速入门:BUMO 节点安装运维指南

热门文章

  1. css动画放大延迟,css3延时动画
  2. 色彩空间和色彩模型_你的色彩好吗
  3. 计算机基础:一个字节有多少位?
  4. Java基本语法入门
  5. oracle降权,网站在百度里找不到了怎么办? 网站被降权了怎么办?
  6. 带有时钟使能和同步清零的D触发器
  7. 实验室里密码锁的开发——你了解运算符吗(三)
  8. [BigData]16家大数据分析平台
  9. nvidia-dali GPU加速预处理
  10. 坐缆车题解-dijkstra