Unity3D之Mesh(六)繪制扇形、扇面、環形


前言:

繪制了圓,就想到繪制與之相關的幾何圖形,以便更靈活的掌握Mesh動態創建模型的機制與方法。


一、分析:

首先,結合繪制圓的過程繪制環形:

圓形是由segments個等腰三角形組成的(上一篇中,將圓分為segments份,即segments個等腰三角形),圓環就是有segments個等腰梯形組成的。

那么等腰梯形由什么組成?兩個三角形(多個也是可以的)。

故:添加一個變量,內圓半徑。  :到此時此刻,我們需要根據:外半徑、內半徑、分割的數目(  當然如果是扇形或扇面,我們還需要一個角度angle來確定頂點vertices Vector3數組,以及triangles 三角形索引數組。 


 

二、繪制圓環

代碼如下:

using UnityEngine;

[RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
public class yuan : MonoBehaviour
{
    public float Radius = 6;          //外半徑  
    public float innerRadius = 3;     //內半徑
    public float angleDegree = 360;   //扇形或扇面的角度
    public int Segments = 60;         //分割數  

    private MeshFilter meshFilter;

    void Start()
    {
        meshFilter = GetComponent<MeshFilter>();
        meshFilter.mesh = CreateMesh(Radius, innerRadius, angleDegree, Segments);
    }

    Mesh CreateMesh(float radius, float innerradius,float angledegree,int segments)
    {
        //vertices(頂點):
        int vertices_count = segments* 2+2;              //因為vertices(頂點)的個數與triangles(索引三角形頂點數)必須匹配
        Vector3[] vertices = new Vector3[vertices_count];       
        float angleRad = Mathf.Deg2Rad * angledegree;
        float angleCur = angleRad;
        float angledelta = angleRad / segments;
        for(int i=0;i< vertices_count; i+=2)
        {
            float cosA = Mathf.Cos(angleCur);
            float sinA = Mathf.Sin(angleCur);

            vertices[i] = new Vector3(radius * cosA, 0, radius * sinA);
            vertices[i + 1] = new Vector3(innerradius * cosA, 0, innerradius * sinA);
            angleCur -= angledelta;
        }

        //triangles:
        int triangle_count = segments * 6;
        int[] triangles = new int[triangle_count];
        for(int i=0,vi=0;i<triangle_count;i+=6,vi+=2)   
        {
            triangles[i] = vi;
            triangles[i + 1] = vi+3;
            triangles[i + 2] = vi + 1;
            triangles[i + 3] =vi+2;
            triangles[i + 4] =vi+3;
            triangles[i + 5] =vi;
        }
        
        //uv:
        Vector2[] uvs = new Vector2[vertices_count];
        for (int i = 0; i < vertices_count; i++)
        {
            uvs[i] = new Vector2(vertices[i].x / radius / 2 + 0.5f, vertices[i].z / radius / 2 + 0.5f);
        }

        //負載屬性與mesh
        Mesh mesh = new Mesh();
        mesh.vertices = vertices;
        mesh.triangles = triangles;
        mesh.uv = uvs;
        return mesh;
    }
}

效果圖:


三、繪制扇面

其實繪制扇形面:只需要改變腳本中的參數,扇形覆蓋的角度,即:

angleDegree
效果如下:


四、繪制扇形

同理,只需要將內半徑改為0,更改扇形覆蓋的角度

 innerRadius=0;
 angleDegree
即可!效果圖如下:


總結:

靜下心,慢慢分析,很簡單,不過是初中幾何而已。


 

【歡迎轉載】

 轉載請表明出處: 樂學習

 
        


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM