我曾经写过一篇文章,不规则图形uv地图。(http://blog.csdn.net/itolfn/article/details/17240131)我用三角算法。但是,这种方法已经不完全,有一个指明:最优:假设任意两个凸四边形对角线三角附近形成假字。两个三角形六个内角中最小的角度不会变大。就是取四变形的最大化三角形内角去连接对角线,分组两个三角形。可是有时候不是自己想要的那一个图形,如图:


三角剖分算法会算出ABC和ACD这两个三角形,可是我们须要ABD和BCD。这时候就不能用了。我研究三角剖分不深,按他的定律去算出就是取的第二个图形,有哪位大侠知道请告诉小弟,后来我就摒弃了这个算法,重写了一套,使用面积划分的算法,这样攻克了我全部的问题,不论什么不规则多边形都会使uv贴的正好

using System.Collections;
using System.Collections.Generic;public class TriangleSubdivision  :MonoBehaviour{///三角划分原理///每划分一个三角形后。推断切割成新三角形与切割后剩余多边形的面积和是否等于切割前多边形的面积。假设等于,则表示切割有效,继续划分。否则跳过一个顶点继续推断下一个三角形,循环到剩余多边形是三角形为止。public static int[] TriangulatePolygon (Vector2[] XZofVertices , bool is3D) {int VertexCount = XZofVertices.Length;List<TriangleObj> TriangleList = new List<TriangleObj>();List<Vector2> VerticesList = new List<Vector2>();for(int i=0;i<VertexCount;i++){VerticesList.Add(new Vector2(XZofVertices[i].x,XZofVertices[i].y));}  if(VertexCount<3) return null;int testindex=0;while (VerticesList.Count>=3&&testindex<100){for (int i = 0; i < VerticesList.Count; i++){testindex++;//假设数组仅仅剩余3个节点。if(VerticesList.Count==3){TriangleObj nobj = new TriangleObj(VerticesList[0], VerticesList[1], VerticesList[2]);TriangleList.Add(nobj);VerticesList.RemoveAt(1);break;}//全部角点暂存数组List<Vector2> surplusVerticesList = new List<Vector2>();surplusVerticesList.AddRange(VerticesList);if(i+2<VerticesList.Count){//获取3个点组成一个3角形Vector2[] trianglePoint = new Vector2[3];trianglePoint[0] = VerticesList[i];trianglePoint[1] = VerticesList[i+1];trianglePoint[2] = VerticesList[i+2];//移除三角形用到的中间点,剩余的多边形点集合.surplusVerticesList.RemoveAt(i+1);Vector2[] surplusPoints = new Vector2[surplusVerticesList.Count];for(int m=0;m<surplusVerticesList.Count;m++){surplusPoints[m]=surplusVerticesList[m];}//移除前多边形点集合Vector2[] allPoints = new Vector2[VerticesList.Count];for (int n = 0; n < VerticesList.Count; n++){allPoints[n]=VerticesList[n];}bool isCrose = false;//推断该多边形的两条边是否相交for(int ii_1 = 0;ii_1<surplusPoints.Length;ii_1++){for(int ii_2 = 0;ii_2<surplusPoints.Length;ii_2++){if(ii_1 < surplusPoints.Length - 1 && ii_2 < surplusPoints.Length - 1){if((surplusPoints[ii_1].x == surplusPoints[ii_2].x && surplusPoints[ii_1].y == surplusPoints[ii_2].y)||(surplusPoints[ii_1+1].x == surplusPoints[ii_2].x && surplusPoints[ii_1+1].y == surplusPoints[ii_2].y)||(surplusPoints[ii_1].x == surplusPoints[ii_2+1].x && surplusPoints[ii_1].y == surplusPoints[ii_2+1].y)||(surplusPoints[ii_1+1].x == surplusPoints[ii_2+1].x && surplusPoints[ii_1+1].y == surplusPoints[ii_2+1].y)){continue;}if(GameObject.Find("Initial").GetComponent<ShareMethods>().CheckCrose(surplusPoints[ii_1],surplusPoints[ii_1+1],surplusPoints[ii_2],surplusPoints[ii_2+1])&&GameObject.Find("Initial").GetComponent<ShareMethods>().CheckCrose(surplusPoints[ii_2],surplusPoints[ii_2+1],surplusPoints[ii_1],surplusPoints[ii_1+1])){isCrose = true;break;}}}if(isCrose){break;}}//推断切割成新三角形与切割后剩余多边形的面积和是否等于切割前多边形的面积?if(Mathf.Abs(trPolygonArea(trianglePoint,is3D)+trPolygonArea(surplusPoints,is3D)-trPolygonArea(allPoints,is3D))<=0.001f&&!isCrose){//则表示切割有效,继续划分TriangleObj tobj = new TriangleObj(VerticesList[i], VerticesList[i+1], VerticesList[i+2]);TriangleList.Add(tobj);VerticesList.RemoveAt(i+1);i--;break;}else{//否则跳过一个顶点继续推断下一个三角形.把第一个点放到数组末尾.Vector2 zeropoint = new Vector2(VerticesList[i].x,VerticesList[i].y);VerticesList.RemoveAt(i);VerticesList.Add(zeropoint);break;}}}}int[] Triangles = new int[3 * TriangleList.Count];for (int ii1 = 0; ii1 < TriangleList.Count; ii1++){TriangleObj tempobj = TriangleList[ii1];Triangles[3 * ii1 + 1] = indexofobjfromList(tempobj.p2,XZofVertices);if(is3D){Triangles[3 * ii1+2] = indexofobjfromList(tempobj.p1,XZofVertices);Triangles[3 * ii1] = indexofobjfromList(tempobj.p3,XZofVertices);}else{Triangles[3 * ii1] = indexofobjfromList(tempobj.p1,XZofVertices);Triangles[3 * ii1+2] = indexofobjfromList(tempobj.p3,XZofVertices);}}return Triangles;}/////依据点获取多边形面积static float trPolygonArea(Vector2[] points,bool is3D){ float area = 0;if(is3D){area = GameObject.Find("Initial").GetComponent<ShareMethods>().PolygonArea(null,points);//面积公式算法}else{area = GameObject.Find("Initial").GetComponent<ShareMethods>().PolygonArea(null,points)/1000000;}return area;}static int indexofobjfromList(Vector2 point,Vector2[] points){int index = 0;for(int i=0;i<points.Length;i++){Vector2 temp=points[i];if(Mathf.Abs(point.x-temp.x)<0.001f&&Mathf.Abs(point.y-temp.y)<0.001f){index=i;break;}}return index;}
}
struct TriangleObj
{public Vector2 p1;public Vector2 p2;public Vector2 p3;public TriangleObj(Vector2 point1, Vector2 point2, Vector2 point3){p1 = point1; p2 = point2; p3 = point3;}
}

这种方法没什么修改,仅仅是算法我改了一下。还是这个类。还是传你全部的点。会返回你的Mesh.triangles,这样就就完美的使自己的mesh依据点贴上自己想要的图形状uv该

版权声明:本文博客原创文章,博客,未经同意,不得转载。

unity多边形uv地图相关推荐

  1. 【Unity】Unity添加真实地图的方法探索

    Unity添加真实地图的方法探索 当前技术现状 环境配置过程 STEP 1:配置Unity及项目环境 下载Unity Hub 下载Unity Editor 创建项目 STEP 2:配置Unity SD ...

  2. Unity接入高德地图

    第一步:Unity保存user.keystore文件 File→Build Settings→Player Settings 找到Publishing Settings,点击Create a new ...

  3. 【Unity】六边形地图格子基础

    这里的六边形地图,指SLG游戏中的大世界地图,用六边形的网格进行平铺.例如文明,以及部分SLG手游. 这里介绍六边形地图格子的基本概念,以及具体数学实现代码. 1.基本概念 这里强制规定,所有的格子都 ...

  4. Tiled结合Unity实现瓦片地图

    前段时间应公司需求做瓦片地图,cocos与瓦片地图的结合案例很多,但unity的却少之又少,做瓦片地图少不了Tiled Map Editor(下载地址),这个教程很多,也自带例子,关于怎么拼地图,这里 ...

  5. Tiled结合Unity实现瓦片地图——Unity实战篇

    本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢. http://blog.csdn.net/lzhq1982/article/details/75425915 上文说道,Ti ...

  6. [Unity]Roguelike随机地图生成(一)

    初步随机地图生成 基础房间生成 房间门的判断 基础房间生成 首先需要确定每次房间生成都是在上一个房间的哪个方向上生成,为此需要声明一个枚举值来记录上下左右四个方向 创建脚本RoomGenerator, ...

  7. Unity Shader UV动画之高光材质加上透明材质与UV动画

    理解,UV动画实质是对UV的坐标进行变化,从而使纹理产生动态变化 例子:从高光材质进行修改 1,加上透明材质的标签以及混合模式,再使用带透明通道的贴图,可以实现:不透明部分的图案,材质是高光材质,透明 ...

  8. android 高德地图 删除多边形,高德地图多边形覆盖物添加、获取、删除

    最近在做有关地图的项目 汇总一下 方便以后使用 上图是覆盖物绘制完成之后的编辑状态 引入高德地图js P.s. plugin后跟的是地图插件 1.覆盖物绘制 map.plugin(["AMa ...

  9. Tiled结合Unity实现瓦片地图——Tiled2Unity篇

    本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢. http://blog.csdn.net/lzhq1982/article/details/75356478 前段时间应公司 ...

最新文章

  1. “;“分号空语句的使用
  2. invalidate () 方法
  3. hdu -4284 Travel(状态压缩)
  4. 从fastjson的TypeReference用法,推导如何实现泛型反射
  5. Ext.Net ASP.NET
  6. ES6新特性_ES6扩展运算符的应用---JavaScript_ECMAScript_ES6-ES11新特性工作笔记014
  7. fckeditor出现the server didn't send back a proper XML response问题的解决(因为使用了“主题”)...
  8. 经济学人重磅:数据经济虽好,可是仍需补钙
  9. 常用编程语言介绍和特点
  10. “大数据”查询平台利用抖音导流,存个人信息泄露或倒卖风险
  11. 视频分辨率,什么叫几K,什么叫几P?
  12. Graphics2D类基本使用
  13. python 灰度图像_Python灰度图像到3个通道
  14. puzzle(1321)时间旅人
  15. 还原/修改XP任务栏
  16. PySpark | SparkSQL入门 | DataFrame入门
  17. ue4网格转地形_UE4 山脉风景地形模型
  18. 高老师谈网络工程师之路
  19. 基于双参数蜜蜂算法解决车辆路径问题(Matlab代码实现)
  20. Solidworks鼠标功能和常用快捷键

热门文章

  1. sql索引的填充因子多少最好,填充因子的作用?
  2. ecshop添加商品选择品牌时如何按拼音排序
  3. 实施质量成本管理的五项注意
  4. Django实战(10):单元测试
  5. ASP/COM+组件开发辅助软件之补充
  6. HTML知识积累及实践(四) - 表单元素
  7. 数据结构笔记(三)-- 链式实现顺序表
  8. matlab vision hdl,MATLAB下载,MATLAB购买,MATLAB试用,MATLAB介绍,MATLAB评价
  9. 加一条平行于y轴的直线_为什么龙门式桁架机器人采用V型导向滚轮直线导轨
  10. python predict_对Keras中predict()方法和predict_classes()方法的区别说明