unity多边形uv地图

我曾经写过一篇文章,不规则图形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该

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

时间: 2024-10-07 23:02:22

unity多边形uv地图的相关文章

unity多边形uv贴图

以前我写过一篇文章,不规则图形uv贴图的,(http://blog.csdn.net/itolfn/article/details/17240131)当时用的三角剖分的算法,但是那个算法有所不完整,有一条这么规定的:最优性:任意两个相邻三角形形成的凸四边形的对角线如果可以互换的话,那么两个三角形六个内角中最小的角度不会变大.就是取四变形的最大化三角形内角去连接对角线,分组两个三角形,但是有时候不是自己想要的那一个图形,如图: 三角剖分算法会算出ABC和ACD这两个三角形,但是我们需要ABD和BC

Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

刚进公司给安排的任务就是Unity接入高德地图,算是踩了不少坑总算做出来了,抽点时间写个博客记录一下 废话不多说 先上效果图 获取定位并根据手机朝向显示周边信息            使用的Unity版本为5.5,Androad Studio 2.3.1 接下来开始讲具体操作 首先是Androad Studio的基本配置 1.创建工程,空白的就行,反正也用不到界面布局 等待创建完成 2.新建库模块: 切换到Project视图 右击你的项目 新建一个库模块-用来负责与Unity交互 当然你也可以不

unity普通的3D地图+人物行走demo

unity3D 五个面板: scene(场景视图) 整个游戏视图的概览 Game(游戏视图)是主摄像机照射 整体地图 所显示的区域 Hierarchy(层级视图) 存放scene视图 所用到的gameObjects Project(工程视图) 存放游戏图片材质的(可引入untiy自带的材质库) Inspector(监视视图) 主要用于设置对象属性的 位置 旋转 颜色,脚本,材质等组件 Hierarchy 层次视图下面的main Camera 为主摄像机 在Hierarchy 下面创建一个地形,T

Unity Critter地图导出到server配置

普通情况下,从Critter导出的地图会与Unity自带的Navigation洪培出的地图会有比較大的差异.须要耐心调整Critter的參数才干够. 以下是我调的參数,与Unity导出的地图基本相似.希望能帮到那些正在用Critter为server导出地图而发愁的同学. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Cen

Unity Critter地图导出到服务器配置

一般情况下,从Critter导出的地图会与Unity自带的Navigation洪培出的地图会有比较大的差异.需要耐心调整Critter的参数才可以.下面是我调的参数,与Unity导出的地图基本相似.希望能帮到那些正在用Critter为服务器导出地图而发愁的同学. 版权声明:本文为博主原创文章,未经博主允许不得转载.

如何利用excel中的数据源制作数据地图

关于这个问题,制作数据地图的方法已不新奇,总体来说有这么几类方案: 一类方案:直接在excel里制作 优势:个人小数据量应用较为方便简单 缺点:需要熟悉VBA,且更强大的功能对VBA水平要求较高 1.绘制地图图形 + VBA宏语言 思路:用插入图形"任意多边形"绘制地图:每一个"任意多边形"赋予正确名称:对"任意多边形"赋值:利用VBA对"任意多边形"的值进行操作, 例如上色. 先准备一张所需要的地图图片,网上都有,可以下载

百度地图API画多边型,测面积

效果: 脚本: [javascript] view plaincopy <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" 

【Unity 3D】学习笔记二十九:游戏实例——简单小地图制作

任何的学习,光看不练是学不好的.所以这次就总结回顾下怎么制作MMROPG类游戏中的小地图.在MMROPG类游戏里,主角在游戏世界里走动时,一般在屏幕右上角都会有一个区域来显示当前游戏场景的小地图.主角在游戏世界里走动,小地图里代表着主角的小标记也会随之移动.那怎么实现咧? 首先需要确定两个贴图,第一个是右上角的小地图背景贴图,应该是从Y轴俯视向下截取主角所在的位置大地图.第二个就是主角的位置大贴图.在本例中,因为没有学习unity地图制作,所以地图用一个面对象代替,主角用立方体代替,使用GUI来

Unity 简记(1)--TileMap

## Tilemap是unity中自带的快速构建2D场景的工具,优点是省时省力, 1 使用方法 在场景创建一个Tilemap 打开TilePalette ? 3.创建一个新的Palette,将地图切割好拉进去,点一下要画的格子,再点一下笔,就可以开始画了 2. 要点 1.若画的图片小于方格 则可在Grid的cell size处更改方格大小 若还存在缝隙问题可见下面分享博文 2.绑定碰撞体,给Grid的Tilemap添加Tilemap collider2D和rigidbody 2D组件,然后为了让