标签:origin uv Vector2 float 生成 圆形 顶点 图片
unity中Image组件的uv形状为矩形,要显示圆形的图片可以使用遮罩、使用形状为矩形但是实际所有像素点的形状为圆形的图片等方法,这些方法各有优劣,这里使用脚本继承Image组件并重写其中的OnPopulateMesh方法将uv改为圆形
public class CircleImage : Image { //圆形由多少扇形(实际上是近似扇形的三角形)拼成 private int segements = 100; protected override void OnPopulateMesh(VertexHelper vertexHelper) { //清除继承的image的原有的图片绘制信息 vertexHelper.Clear(); //获取uv信息,四维向量uv的四个坐标分别代表图片矩形框左下角和右上角顶点的横纵坐标 Vector4 uv = overrideSprite == null ? Vector4.zero : DataUtility.GetOuterUV(overrideSprite); //获取图片宽高和uv的宽高 float imageWidth = rectTransform.rect.width; float imageHeigh = rectTransform.rect.height; float uvWidth = uv.z - uv.x; float uvHeigh = uv.w - uv.y; //获取uv的中心点位置 Vector2 uvCenter = new Vector2(uvWidth * 0.5f, uvHeigh * 0.5f); //求得图片像素和uv方框的换算比例 Vector2 converRatio = new Vector2(uvWidth / imageWidth, uvHeigh / imageHeigh); //求得每个扇形弧度 float radian = (2 * Mathf.PI) / segements; //规定半径 float radius = imageWidth * 0.5f; //生成初始顶点(原点),并给初始顶点赋值 UIVertex origin = new UIVertex(); origin.color = color; origin.position = Vector2.zero; //使用前面计算的图片像素和uv方框的换算比例计算顶点uv对应的图片点位置 origin.uv0 = new Vector2(origin.position.x * converRatio.x + uvCenter.x, origin.position.y * converRatio.y + uvCenter.y); //添加顶点 vertexHelper.AddVert(origin); //循环遍历生成并添加其他顶点信息 float curRadian = 0; for(int i = 0;i <= segements; i++) { //计算顶点坐标 float x = Mathf.Cos(curRadian) * radius; float y = Mathf.Sin(curRadian) * radius; curRadian += radian; //生成并添加顶点信息 UIVertex vertexTemp = new UIVertex(); vertexTemp.color = color; vertexTemp.position = new Vector2(x,y); vertexTemp.uv0 = new Vector2(vertexTemp.position.x * converRatio.x + uvCenter.x, vertexTemp.position.y * converRatio.y + uvCenter.y); vertexHelper.AddVert(vertexTemp); } //遍历生成所有的三角形面片 int id = 1; for (int i = 0; i < segements; i++) { //三个参数代表三角形的三个顶点,注意顶点顺序,面片的前后遵循左手定则(即叉乘结果的方向为前方) vertexHelper.AddTriangle(id, 0, id + 1); id++; } } }
标签:origin,uv,Vector2,float,生成,圆形,顶点,图片 来源: https://www.cnblogs.com/movin2333/p/14320909.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。