Unity3D之Mesh(二)为三角形添加纹理

一、直接開始上步驟

首先繪製一個三角形

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


 

1)材質使用的貼圖


 

2)上代碼

 

  1 using UnityEngine;
  2 using System.Collections;
  3 
  4 /* ============================================================================== 
  5  * 功能描述:创建三角形Mesh 
  6  * ==============================================================================*/
  7 [RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
  8 public class NewBehaviourScript1 : MonoBehaviour
  9 {
 10     public float sideLength = 2;
 11     public float angleDegree = 100;
 12     private static readonly int ANGLE_DEGREE_PRECISION = 1000;
 13     private static readonly int SIDE_LENGTH_PRECISION = 1000;
 14 
 15     private MeshFilter meshFilter;
 16 
 17     private TriangleMeshCreator creator = new TriangleMeshCreator();
 18 
 19     [ExecuteInEditMode]
 20     private void Awake()
 21     {
 22 
 23         meshFilter = GetComponent<MeshFilter>();
 24     }
 25 
 26     private void Update()
 27     {
 28         meshFilter.mesh = creator.CreateMesh(sideLength, angleDegree);
 29     }
 30     void OnDrawGizmos()
 31     {
 32         Gizmos.color = Color.gray;
 33         DrawMesh();
 34     }
 35 
 36     void OnDrawGizmosSelected()
 37     {
 38         Gizmos.color = Color.green;
 39         DrawMesh();
 40     }
 41 
 42     private void DrawMesh()
 43     {
 44         Mesh mesh = creator.CreateMesh(sideLength, angleDegree);
 45         int[] tris = mesh.triangles;
 46         Gizmos.DrawLine(transformToWorld(mesh.vertices[tris[0]]), transformToWorld(mesh.vertices[tris[1]]));
 47         Gizmos.DrawLine(transformToWorld(mesh.vertices[tris[0]]), transformToWorld(mesh.vertices[tris[2]]));
 48         Gizmos.DrawLine(transformToWorld(mesh.vertices[tris[1]]), transformToWorld(mesh.vertices[tris[2]]));
 49     }
 50 
 51     private Vector3 transformToWorld(Vector3 src)
 52     {
 53         return transform.TransformPoint(src);
 54     }
 55 
 56     private class TriangleMeshCreator
 57     {
 58         private float _sideLength;
 59         private float _angleDegree;
 60 
 61         private Mesh _cacheMesh;
 62         public Mesh CreateMesh(float sideLength, float angleDegree)
 63         {
 64             if (checkDiff(sideLength, angleDegree))
 65             {
 66                 Mesh newMesh = Create(sideLength, angleDegree);
 67                 if (newMesh != null)
 68                 {
 69                     _cacheMesh = newMesh;
 70                     this._sideLength = sideLength;
 71                     this._angleDegree = angleDegree;
 72                 }
 73             }
 74             return _cacheMesh;
 75         }
 76 
 77         private Mesh Create(float sideLength, float angleDegree)
 78         {
 79             Mesh mesh = new Mesh();
 80             Vector3[] vertices = new Vector3[3];
 81 
 82             float angle = Mathf.Deg2Rad * angleDegree;
 83             float halfAngle = angle / 2;
 84             vertices[0] = Vector3.zero;
 85             float cosA = Mathf.Cos(halfAngle);
 86             float sinA = Mathf.Sin(halfAngle);
 87             vertices[1] = new Vector3(cosA * sideLength, 0, sinA * sideLength);
 88             vertices[2] = new Vector3(cosA * sideLength, 0, -sinA * sideLength);
 89 
 90             int[] triangles = new int[3];
 91             triangles[0] = 0;
 92             triangles[1] = 1;
 93             triangles[2] = 2;
 94 
 95             mesh.vertices = vertices;
 96             mesh.triangles = triangles;
 97 
 98             //Vector2[] uvs = new Vector2[vertices.Length];
 99             //for (int i = 0; i < uvs.Length; i++)
100             //{
101             //    uvs[i] = Vector2.zero;
102             //}
103             Vector2[] uvs = new Vector2[vertices.Length];
104             uvs[0] = new Vector2(0, 0.5f);
105             uvs[1] = Vector2.one;
106             uvs[2] = Vector2.right;
107             mesh.uv = uvs;
108             mesh.uv = uvs;
109 
110             return mesh;
111         }
112 
113         private bool checkDiff(float sideLength, float angleDegree)
114         {
115             return (int)((sideLength - this._sideLength) * SIDE_LENGTH_PRECISION) != 0 ||
116                 (int)((angleDegree - this._angleDegree) * ANGLE_DEGREE_PRECISION) != 0;
117         }
118     }
119 
120 
121 }

 

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

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

关于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[0]]), transformToWorld(mesh.vertices[tris[1]]));
        Gizmos.DrawLine(transformToWorld(mesh.vertices[tris[0]]), transformToWorld(mesh.vertices[tris[2]]));
        Gizmos.DrawLine(transformToWorld(mesh.vertices[tris[1]]), transformToWorld(mesh.vertices[tris[2]]));
    }

 

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


 效果:

分情況實驗:

1、

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

2、

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

3、

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

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

第二種情況下:

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

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

 

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


 

【欢迎转载】

 转载请表明出处: 乐学习

posted on 2016-11-21 14:25  乐学习  阅读(2411)  评论(1编辑  收藏  举报

导航