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该
版权声明:本文博客原创文章,博客,未经同意,不得转载。
unity多边形uv地图的更多相关文章
- GJM:Unity导入百度地图SDK [转载]
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作
刚进公司给安排的任务就是Unity接入高德地图,算是踩了不少坑总算做出来了,抽点时间写个博客记录一下 废话不多说 先上效果图 获取定位并根据手机朝向显示周边信息 使用的Unity ...
- Unity 制作RPG地图2(自己控制地图上图标)
上一次用Unity摄像机方式实现了地图的制作,现在介绍另一种实现地图的方式: 自己通过代码实现小地图NCP图标的显示和隐藏 制作地图的步骤: 1. 根据游戏人物的3D坐标转换成2D平面坐标,根据距离显 ...
- Tiled结合Unity实现瓦片地图——Tiled2Unity篇
本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢. http://blog.csdn.net/lzhq1982/article/details/75356478 前段时间应公司 ...
- Unity 随机房间地图生成
无论是在迷宫还是类似于地牢的游戏地图中,利用程序来生成每次都不一样的地图是一件叫人兴奋不已的事. 这时我们需要解决两个非常重要的随机事件: 1.在一定范围内随机出各不相同但又不能互相重叠的房间 2.优 ...
- unity之uv贴图画圆弧,圆弧面,不规则图形
由于最近一直没有时间,所以这篇博客一直没发,下面我说说uv画圆弧,圆面,不规则面拼接. 先来两张效果图 图截的不咋滴,凑合着看吧,画圆弧主要用的贝塞尔曲线画的,我感觉这个比较简单,当然大家也可以使用圆 ...
- 【Unity 3D】学习笔记29:游戏的例子——简单的小制作地图
无论学习.只看不练是坏科学. 因此,要总结回想这怎么生产MMROPG小地图的游戏.于MMROPG游戏类,在游戏世界中行走时导致各地,通常在屏幕的右上角,将有一个区域,以显示当前的游戏场景微缩.在游戏世 ...
- Unity Critter地图导出到server配置
普通情况下,从Critter导出的地图会与Unity自带的Navigation洪培出的地图会有比較大的差异.须要耐心调整Critter的參数才干够. 以下是我调的參数,与Unity导出的地图基本相似. ...
- 如何利用excel中的数据源制作数据地图
关于这个问题,制作数据地图的方法已不新奇,总体来说有这么几类方案: 一类方案:直接在excel里制作 优势:个人小数据量应用较为方便简单 缺点:需要熟悉VBA,且更强大的功能对VBA水平要求较高 1. ...
随机推荐
- 找呀志_ContentResolver操作ContentProvider数据
当需要外部的应用ContentProvider该数据被添加.删.修改和查询操作.可以使用ContentResolver 类完成 要得到ContentResolver 物,可以使用Activity提供g ...
- SQL Server中TempDB管理(version store的逻辑结构)
原文:SQL Server中TempDB管理(version store的逻辑结构) 原文来自: http://blogs.msdn.com/b/sqlserverstorageengine/arch ...
- 引用:初探Sql Server 执行计划及Sql查询优化
原文:引用:初探Sql Server 执行计划及Sql查询优化 初探Sql Server 执行计划及Sql查询优化 收藏 MSSQL优化之————探索MSSQL执行计划 作者:no_mIss 最近总想 ...
- Android MotionEvent事故响应机制
于android于.主要活动包括点击.按.拖累.滑动等操作,这些构成了Android事件响应,总体而言,,所有事件由例如以下三部分构成的基础: 按(action_down),搬家(action_mov ...
- 最具体的历史centos下一个 postfix + extmail + dovecot + maildrop 安装注意事项2014更新
这篇文章原本是2008年发表的,近期几天照此笔记又安装了一遍系统.这里更新一下记录. 作者:wangdy 本文发表于 http://blog.csdn.net/aryang/article/deta ...
- JS封深入了解
1. javascript 语言理解闭包 js变量的范围分成两个:全局变量.局部变量.在全局变量的函数外声明变量,内部功能可以直接调用全局变量.声明变量里面的函数必须使用var 命令,否则,它里面的函 ...
- ACdream 1427 Nice Sequence
主题链接:http://115.28.76.232/problem? pid=1427 Nice Sequence Time Limit: 12000/6000MS (Java/Others)Memo ...
- 【日常学习】【欧拉功能】codevs2296 荣誉的解决方案卫队的一个问题
转载请注明出处 [ametake版权全部]http://blog.csdn.net/ametake欢迎来看看 题目来源:SDOI2008 文章被剽窃非常严重啊 所以以后都带上版权信息 先上题目 题目描 ...
- Jplayer小样
最近应公司要求需要一个MP3播放的插件,网上找了很多插件,看来看去还是jPlayer用着最舒服也最容易扩展.所以就找了个资料研究了下,简单做了个小DEMO.支持实时控制列表,常见的播放器功能. jPl ...
- 在SurfaceView中自由书写和擦除
/////////继承SurfaceView 的类 public class PaintView extends SurfaceView implements Runnable,SurfaceHold ...