一、直接開始上步驟

首先繪製一個三角形

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


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. 将普通用户添加至sudoers列表

    编辑/etc/sudoers文件,在尾部添加如下内容: myusername ALL=(ALL) ALL myusername ALL=(ALL) NOPASSWD: ALL 其中需要将红色部分替换成 ...

  2. IDEA 去掉 ALT + / 自动补全

    取消掉Alt + / 自动补全 setting -> keymap -> main menu -> code -> completion -> cyclic Expand ...

  3. 恢复不小心误覆盖的代码文件 (sublime编辑器)

    最新写了一个python脚本,另外在终端上运行一个shell脚本循环记录一些性能.耗时参数.取出记录的数据,使用python pyplot强大的绘图功能来可视化,易用程度仅次于matlab. 本次文件 ...

  4. PHP基础知识学习总结

    从今天开始过一遍PHP的基础知识   加油  地址:http://www.runoob.com/php/php-mail.html   该看:PHP发送电子邮件 2017年5月23日23:38:30 ...

  5. iOS tableView自定义删除按钮

    // 自定义左滑显示编辑按钮 - (NSArray<UITableViewRowAction*>*)tableView:(UITableView *)tableView editActio ...

  6. 九度OJ 1355:扑克牌顺子 (模拟)

    时间限制:2 秒 内存限制:32 兆 特殊判题:否 提交:1676 解决:484 题目描述: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^). ...

  7. VIM YCM 插件安装问题记录

    参考:https://github.com/yangyangwithgnu/use_vim_as_ide https://github.com/Valloric/YouCompleteMe 根据 ht ...

  8. ACN经典例题1

    1.韩信点兵 描述相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排.五人一排.七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了.输入3个非负整数a,b,c ,表示每种 ...

  9. LeetCode:算法特辑——二分搜索

    LeetCode:算法特辑——二分搜索 算法模板——基础 int L =0; int R =arr.length; while(L<R) { int M = (R-L)/2+L; if(arr[ ...

  10. ARM NEON 64bit 查找表替换

    没啥效果,如果表的长度在 64个uint8_t之类,应该可以提高查表速度,否则还是C来的快 #ifdef HAVE_NEON_AARCH64 void table_lookup_AArch64_neo ...