一、直接開始上步驟

首先繪製一個三角形

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


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-Manual的学习----【语言参考】----【类型】-----【Resource 资源类型】

    2017年8月24日11:29:361.资源 resource 是一种特殊变量,保存了到外部资源的一个引用.资源是通过专门的函数来建立和使用的.2.由于资源类型变量保存有为打开文件.数据库连接.图形画 ...

  2. POJ 2187 Beauty Contest【凸包周长】

    题目: http://poj.org/problem?id=1113 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#probl ...

  3. debian dhcp配置

    1 将/etc/network/interfaces中设置成dhcp auto eth0iface eth0 inet dhcp 2 重启网络服务 /etc/init.d/networking res ...

  4. 关于UIView的hitTest:withEvent:方法的理解

    闲来无事 观摩别人的项目 常常发现对UIView的hitTest:withEvent:方法的重写,以前也查过这个方法的用法作用,但是时间一长又忘记了.今天再次看到,就记录一下. 用户触摸屏幕后事件的传 ...

  5. saltStack 证书管理

    SaltStack 使用 SSL 签证的方式进行安全认证,我们可以在 Master 端看到 Minion 端的整数签证请求 1.查看当前证书签证情况 [root@SaltStack-Master ~] ...

  6. Django之权限用法

    **记住每一个url都是一个权限** 注册 可插拔试的权限,可以先写其他的逻辑,在最后再把权限加上 将rbac组件拷贝到项目上,注册项目 修改表结构 将写好的用户表对rbac的User表进行一对一的关 ...

  7. 我的Android进阶之旅------>WindowManager.LayoutParams介绍

    本文转载于: http://hubingforever.blog.163.com/blog/static/171040579201175111031938/ 本文参照自: http://develop ...

  8. 我的Android进阶之旅------>Android视频录制小例子

    ============================首先看看官网上关于视频捕捉的介绍================================ Capturing videos Video ...

  9. Unicode Category

    Lu(letter,uppercase):大写字母. Ll(letter.lowercase):小写字母. Lt(letter,titlecase):词首字母大写的字母. Lm(letter,modi ...

  10. Django在不启动server的情况下调用方法

    from django.conf import settingsfrom django import template settings.configure() a = template.Templa ...