[Unity]利用Mesh在Unity中绘制扇形图片2
之前那篇文章后,和同事又就这个问题讨论了一下,发现,其实不需要那么死心眼画n个三角形,因为图片本身除了圆以外的地方都是透明的, 画出来也没事。
这样的话, 其实可以把正方形的图片分成4个三角形,这样的话,最多也就画5个三角形就够了。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;[RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
public class TestProgressBar : MonoBehaviour
{ public float radius = 2;[Range(0,360)]//把角度限制在0-360public float startAngleDegree = 0;[Range(0,360)]//把角度限制在0-360public float angleDegree = 100;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, startAngleDegree, angleDegree, angleDegreePrecision, radiusPrecision);}//在Scene界面画辅助线void OnDrawGizmos(){Gizmos.color = Color.gray;DrawMesh();}//在Scene界面画辅助线void OnDrawGizmosSelected(){Gizmos.color = Color.green;DrawMesh();}private void DrawMesh(){Mesh mesh = creator.CreateMesh(radius, startAngleDegree, angleDegree, 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 startAngleDegree;private float angleDegree;private Mesh cacheMesh;/// <summary> /// 创建一个扇形Mesh /// </summary> /// <param name="radius">扇形半径</param> /// <param name="startAngleDegree">扇形开始角度</param> /// <param name="angleDegree">扇形角度</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 startAngleDegree, float angleDegree, int angleDegreePrecision, int radiusPrecision){if (checkDiff(radius, startAngleDegree, angleDegree, angleDegreePrecision, radiusPrecision)){//参数有改变才需要重新画meshMesh newMesh = Create(radius, startAngleDegree, angleDegree);if (newMesh != null){cacheMesh = newMesh;this.radius = radius;this.startAngleDegree = startAngleDegree;this.angleDegree = angleDegree;}}return cacheMesh;}private Vector3 CalcPoint(float angle){//这个函数计算了非特殊角度射线在正方形上的点angle = angle % 360;if (angle == 0) {return new Vector3 (1, 0, 0);} else if (angle == 180) {return new Vector3(-1,0,0);}//这里分别对应这个射线处于上图哪个三角形中, 分别计算if (angle <= 45 || angle > 315) {return new Vector3(1,Mathf.Tan(Mathf.Deg2Rad*angle), 0);} else if (angle <= 135) {return new Vector3(1/Mathf.Tan(Mathf.Deg2Rad*angle), 1, 0);} else if (angle <= 225) {return new Vector3(-1, -Mathf.Tan(Mathf.Deg2Rad*angle), 0);} else {return new Vector3(-1/Mathf.Tan(Mathf.Deg2Rad*angle), -1, 0);}}private Mesh Create(float radius, float startAngleDegree, float angleDegree){if (startAngleDegree == 360) {startAngleDegree = 0;}Mesh mesh = new Mesh();List<Vector3> calcVertices = new List<Vector3> ();calcVertices.Add (Vector3.zero);//第一个点是圆心点calcVertices.Add (CalcPoint (startAngleDegree));//第二个点是起始角度对应的点float [] specialAngle = new float[]{45, 135, 225, 315};//上图正方形4个顶点对应的角度和点Vector3 [] specialPoint = new Vector3[] {new Vector3(1,1,0), new Vector3(-1,1,0), new Vector3(-1,-1,0),new Vector3(1,-1,0)};//计算正方形四个点是不是在要画的扇形范围内, 如果是, 则是要画出来的顶点for (int i = 0; i < specialAngle.Length; ++i) {if(startAngleDegree < specialAngle[i] && specialAngle[i] - startAngleDegree < angleDegree){calcVertices.Add(specialPoint[i]);}}//这里为什么要第二个for循环? 扇形的角度+起始角度就可能超过360, 所以要计算到720for (int i = 0; i < specialAngle.Length; ++i) {if(startAngleDegree < specialAngle[i]+360 && specialAngle[i]+360 - startAngleDegree < angleDegree){calcVertices.Add(specialPoint[i]);}}calcVertices.Add (CalcPoint (startAngleDegree + angleDegree));Vector3[] vertices = new Vector3[calcVertices.Count];//uv是网格上的点对应到纹理上的某个位置的像素, 纹理是一张图片, 所以是二维Vector2[] uvs = new Vector2[vertices.Length];for (int i = 0; i < vertices.Length; ++i) {//之前是按半径为单位长度1计算的顶点, 实际顶点是要算上实际半径vertices[i] = calcVertices[i]*radius;//纹理的半径就是0.5, 圆心在0.5f, 0.5f的位置uvs[i] = new Vector2(calcVertices[i].x*0.5f+0.5f,calcVertices[i].y*0.5f+0.5f);}int[] triangles = new int[(vertices.Length-2)*3];for (int i = 0, vi = 1; i < triangles.Length; i += 3, vi++){//每个三角形都是由圆心点+两个相邻弧度上的点构成的triangles[i] = 0;triangles[i + 2] = vi;triangles[i + 1] = vi + 1;} mesh.vertices = vertices;mesh.triangles = triangles;mesh.uv = uvs;return mesh;}private bool checkDiff(float radius, float startAngleDegree, float angleDegree, int angleDegreePrecision, int radiusPrecision){return (int)(startAngleDegree - this.startAngleDegree) != 0 || (int)((angleDegree - this.angleDegree) * angleDegreePrecision) != 0 ||(int)((radius - this.radius) * radiusPrecision) != 0;}}
}
最终效果:
[Unity]利用Mesh在Unity中绘制扇形图片2相关推荐
- [Unity]利用Mesh在Unity中绘制扇形图片
背景 最近碰到个功能, 要画一个扇形图案, 如下图: 美术原图: 需求是这个图形跟随角色, 在角色背后, 并且每个角色的扇形角度可能不同. So, NGUI和UGUI很好用的FilledType是用不 ...
- Unity 利用Mesh在Unity中绘制扇形图片
直接上脚本,挂空物体上就行: using UnityEngine; using System.Collections; using System.Collections.Generic; [Requi ...
- 利用VBA将excel中链接转换为图片形式存放在指定的单元格中
利用VBA将excel中链接转换为图片形式存放在指定的单元格中 VBA代码如下 Private Declare Function URLDownloadToFile Lib "urlmon& ...
- caxa齿轮零件图_利用CAXA在CATIA中绘制渐开线齿轮
渐开线齿轮作为机械传动中的重要零部件,在机械结构中广泛应用,而渐开线齿轮的绘制却是机械制图中的难点.二维软件一般可以通过参数模块进行渐开线绘制,而目前的三维软件却很难进行渐开线的精确绘制.在不要求齿轮 ...
- java利用POI在word中绘制折线图
1.poi的简介 Apache POI 简介是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office(Excel.WORD ...
- [Unity][UGUI]绘制扇形图形
绘制扇形图形 的资料 参考资料 1,2 都比较完整 想到一种 使用 UGUI 创建 扇形 的方法 相关资料: 1. [Unity&特效]怎么画圆范围circle range技能指示器skill ...
- Qt自定义委托在QTableView中绘制控件、图片、文字
自定义委托,继承于,QStyledItemDelegate类,重载Paint()函数, 1.实现在QTableView中绘制 格式字符串 2.实现在QTableView中绘制进度条 3.实现在QTab ...
- 【Java AWT 图形界面编程】使用鼠标滚轮缩放 Canvas 画布中绘制的背景图像 ( 绘制超大图像 + 鼠标拖动 + 鼠标滚轮缩放 + 以当前鼠标指针位置为缩放中心 示例 )
文章目录 一.鼠标滚轮缩放的中心点设置为当前鼠标中心点 - 要点分析 1.保存当前鼠标指针指向的位置 2.根据鼠标指针指向的位置以及比例重新计算图片位置 二.绘制超大图像 + 鼠标拖动 + 鼠标滚轮缩 ...
- Unity 在代码中利用Mesh实时生成圆环/空心圆柱
本篇文章主要介绍了利用Unity中的mesh 实时生成圆环的过程以及思想,我会在开头直接放出源码.如若有任何疑问,可向后继续观看详细解说~~~ (PSPSPS:Mesh生成的顺序,方式等有很多,当前代 ...
最新文章
- Android自定义View:ViewGroup(三)
- css好用吗,比较好用的 CSS 的技巧,总有一个你需要的!
- App架构设计经验谈:展示层的设计
- python如何输入多组数据_Python 中如何实现多组的输入输出
- 【转】为什么博士叫PhD?
- eclipse init 配置
- 使用git新增分支以及初始化分支等等一些列操作实战
- 20200331:每日温度(leetcode739)
- Spring Setting
- cas云计算机管理平台添加加密锁,CAS云计算管理平台安装手册.docx
- centos安装 mysql_centos下安装MySQL数据库
- 初学windows程序设计
- R | package基础 | Rstudio + devtools 创建/开发R包(初学者 指南| 简明详细流程)
- Mac 生成ico图标
- 沧海云帆服务器哪里的,天涯明月刀沧海云帆9月合服_天刀沧海云帆大区9月合服公告_3DM网游...
- 北欧计算机专业出国,留学北欧,哪个国家计算机专业比较好?
- Unity 2018之ShaderGraph使用基础
- https://github.com/Wechat-Group/WxJava 使用记录
- Etyma01 ced ceed cess
- 【19保研】保研预报名招生信息汇总!