一、直接開始上步驟

首先繪製一個三角形

創建一個材質,以便後續使用:


1)材質使用的貼圖


2)上代碼

 

 using UnityEngine;
using System.Collections; /* ==============================================================================
* 功能描述:创建三角形Mesh
* ==============================================================================*/
[RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
public class NewBehaviourScript1 : MonoBehaviour
{
public float sideLength = ;
public float angleDegree = ;
private static readonly int ANGLE_DEGREE_PRECISION = ;
private static readonly int SIDE_LENGTH_PRECISION = ; private MeshFilter meshFilter; private TriangleMeshCreator creator = new TriangleMeshCreator(); [ExecuteInEditMode]
private void Awake()
{ meshFilter = GetComponent<MeshFilter>();
} private void Update()
{
meshFilter.mesh = creator.CreateMesh(sideLength, angleDegree);
}
void OnDrawGizmos()
{
Gizmos.color = Color.gray;
DrawMesh();
} void OnDrawGizmosSelected()
{
Gizmos.color = Color.green;
DrawMesh();
} private void DrawMesh()
{
Mesh mesh = creator.CreateMesh(sideLength, angleDegree);
int[] tris = mesh.triangles;
Gizmos.DrawLine(transformToWorld(mesh.vertices[tris[]]), transformToWorld(mesh.vertices[tris[]]));
Gizmos.DrawLine(transformToWorld(mesh.vertices[tris[]]), transformToWorld(mesh.vertices[tris[]]));
Gizmos.DrawLine(transformToWorld(mesh.vertices[tris[]]), transformToWorld(mesh.vertices[tris[]]));
} private Vector3 transformToWorld(Vector3 src)
{
return transform.TransformPoint(src);
} private class TriangleMeshCreator
{
private float _sideLength;
private float _angleDegree; private Mesh _cacheMesh;
public Mesh CreateMesh(float sideLength, float angleDegree)
{
if (checkDiff(sideLength, angleDegree))
{
Mesh newMesh = Create(sideLength, angleDegree);
if (newMesh != null)
{
_cacheMesh = newMesh;
this._sideLength = sideLength;
this._angleDegree = angleDegree;
}
}
return _cacheMesh;
} private Mesh Create(float sideLength, float angleDegree)
{
Mesh mesh = new Mesh();
Vector3[] vertices = new Vector3[]; float angle = Mathf.Deg2Rad * angleDegree;
float halfAngle = angle / ;
vertices[] = Vector3.zero;
float cosA = Mathf.Cos(halfAngle);
float sinA = Mathf.Sin(halfAngle);
vertices[] = new Vector3(cosA * sideLength, , sinA * sideLength);
vertices[] = new Vector3(cosA * sideLength, , -sinA * sideLength); int[] triangles = new int[];
triangles[] = ;
triangles[] = ;
triangles[] = ; mesh.vertices = vertices;
mesh.triangles = triangles; //Vector2[] uvs = new Vector2[vertices.Length];
//for (int i = 0; i < uvs.Length; i++)
//{
// uvs[i] = Vector2.zero;
//}
Vector2[] uvs = new Vector2[vertices.Length];
uvs[] = new Vector2(, 0.5f);
uvs[] = Vector2.one;
uvs[] = Vector2.right;
mesh.uv = uvs;
mesh.uv = uvs; return mesh;
} private bool checkDiff(float sideLength, float angleDegree)
{
return (int)((sideLength - this._sideLength) * SIDE_LENGTH_PRECISION) != ||
(int)((angleDegree - this._angleDegree) * ANGLE_DEGREE_PRECISION) != ;
}
} }

注意: 只能在运行的时候才看得到这个三角形,编辑器里看不到怎么办?

简单来讲就是在编辑器模式下,绘制辅助线框。以下三个方法是为了在编辑模式下看到三角形;

关于OnDrawGizmos和OnDrawGizmosSelected可以参考这个链接http://www.ceeger.com/Script/Gizmos/Gizmos.html

 void OnDrawGizmos()
{
Gizmos.color = Color.gray;
DrawMesh();
} void OnDrawGizmosSelected()
{
Gizmos.color = Color.green;
DrawMesh();
} private void DrawMesh()
{
Mesh mesh = creator.CreateMesh(sideLength, angleDegree);
int[] tris = mesh.triangles;
Gizmos.DrawLine(transformToWorld(mesh.vertices[tris[]]), transformToWorld(mesh.vertices[tris[]]));
Gizmos.DrawLine(transformToWorld(mesh.vertices[tris[]]), transformToWorld(mesh.vertices[tris[]]));
Gizmos.DrawLine(transformToWorld(mesh.vertices[tris[]]), transformToWorld(mesh.vertices[tris[]]));
}

3)把Mesh Renderer这个组件上的Material设为我们新建的材质。


效果:

分情況實驗:

1、

 uvs[] = new Vector2(, 0.5f);
uvs[] = Vector2.one;
uvs[] = Vector2.right;

2、

uvs[] = new Vector2(, 0.5f);
uvs[] = Vector2.one;
uvs[] = Vector2.right;

3、

 uvs[] = new Vector2(, 0.5f);
uvs[] = Vector2.one;
uvs[] = Vector2.right;

通过上面的例子,我们知道:

第二種情況下:

三处的三角形顶点对应的uv坐标是(0,0.5f),(1,1)和(1,0)。

这样我们就可以知道,uv坐标系是从0到1,从左到右,自下而上增加的坐标系。即:

賦值順序變化,会显示出不同的效果。


【欢迎转载】

转载请表明出处: 乐学习

Unity3D之Mesh(二)为三角形添加纹理的更多相关文章

  1. Unity3D之Mesh(七)绘制长方体

    前言: 从现在开始,终于感觉进入一点点正题了!动态创建三维立体模型mesh!依然从简单入手:长方体. 一.基本思路 由于是创建长方体mesh,由之前的研究得知,两个数据必须要有,即:顶点的数据:ver ...

  2. Unity3D之Mesh(一)绘制三角形

    前言: Unity自带几种简单的模型,如cube等:一般情况下,其余模型有3D建模软件生成,以合适的文件格式导入unity中:而mesh(以我目前很粗浅的了解)的一般用途就是:对现有的模型进行变形,以 ...

  3. 为什么带网格(mesh)的模型添加了刚体Rigidbody和MeshCollider,还是会从地板穿过去?

    两个Gameobject 放置在空中, 一个是Cube,一个是茄子模型 Cube的Collider 是Box Collider , 茄汁的Collider 是mesh collider, 他们都添加了 ...

  4. Unity3D之Mesh(五)绘制圆

    前言: Unity3D中Mesh的基本单位是三角形,而圆形就是由许许多多的三角形组成的.那么我们就知道了绘制圆形的Mesh需要两个变量:圆的半径  以及分割数: 一.实现过程 基本过程与之前的类似,最 ...

  5. C#/AutoCAD 2018/ObjectArx/二次开发添加删除实体的工具函数(四)

    1.添加删除实体 C# ObjectARX二次开发添加删除实体是非常容易主要代码如下: 添加实体: objId = btr.AppendEntity(entity); trans.AddNewlyCr ...

  6. 学习MongoDB 二:MongoDB添加、删除、修改

    一.简介 MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSQL数据库产品中最热门的一种.数据被分组存储在数据集中,被称为一个集合(Collenction)和对于存储在MongoDB ...

  7. C#/AutoCAD 2018/ObjectArx/二次开发添加圆对象的的例子(五)

    C#/AutoCAD 2018/ObjectArx/二次开发添加圆对象的的例子(五) 1.创建一个图形对象的步骤如下见上一篇博客(三)2.添加删除实体的工具函数见上一篇博客(四) 3.添加圆的例子(完 ...

  8. 使用Typescript重构axios(二十六)——添加HTTP授权auth属性

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  9. 使用Typescript重构axios(二十九)——添加baseURL

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

随机推荐

  1. PHP - 获取音频长度

    getID3() 是从MP3等媒体文件中提取文件信息的php类,既可以提取也能修改文件的标签信息.它能读取的文件类型非常多,例如MP3.wav等. 示例官方下载地址:http://sourceforg ...

  2. HDU 5045 5047 5050 5053(上海网络赛E,F,I,L)

    HDU 5045 5047 5050 5053 太菜了,名额差点没保住.吓尿..赶紧开刷树链抛分 5045:状压DP.压缩10个人.因为两个人不能差2以上,所以能够用01表示 5047:推推公式就可以 ...

  3. 26计算限制的异步操作01-CLR

    由CLR via C#(第三版) ,摘抄记录... 异步优点:在GUI应用程序中保持UI可响应性,以及多个CPU缩短一个耗时计算所需的时间. 1.CLR线程池基础:为提高性能,CLR包含了代码来管理他 ...

  4. 【BZOJ1109】[POI2007]堆积木Klo 二维偏序

    [BZOJ1109][POI2007]堆积木Klo Description Mary在她的生日礼物中有一些积木.那些积木都是相同大小的立方体.每个积木上面都有一个数.Mary用他的所有积木垒了一个高塔 ...

  5. Java防止XSS攻击

    方法一:转义存储:添加XssFilter 1.在web.xml添加过滤器: <!-- 解决xss漏洞 --> <filter> <filter-name>xssFi ...

  6. elasticsearch从入门到出门-01windows上安装使用

    elasticsearch 1.安装JDK,至少1.8.0_73以上版本,java -version2.下载和解压缩Elasticsearch安装包,目录结构3.启动Elasticsearch:bin ...

  7. 【题解】国家集训队礼物(Lucas定理)

    [国家集训队]礼物(扩展Lucas定理) 传送门可以直接戳标题 172.40.23.20 24 .1 答案就是一个式子: \[ {n\choose \Sigma_{i=1}^m w}\times\pr ...

  8. 默写一个socket客户端和socket服务端的基本通信,即:收发消息

    Server: import socket sk = socket.socket() sk.bind(('192.168.0.95',8898)) #把地址绑定到套接字 sk.listen() #监听 ...

  9. Apache Shiro 使用手册(五)Shiro 配置说明(转发:http://kdboy.iteye.com/blog/1169637)

    Apache Shiro的配置主要分为四部分: 对象和属性的定义与配置 URL的过滤器配置 静态用户配置 静态角色配置 其中,由于用户.角色一般由后台进行操作的动态数据,因此Shiro配置一般仅包含前 ...

  10. UDP标准模型

    伪代码 #服务端 #创建UDP服务器 ss = socket() #创建一个服务器套接字 ss.bind() #绑定服务器套接字 inf_loop: #服务器无限循环 cs = ss.recvfrom ...