Search Unity

Feedback Create triangle index with a for loop

Discussion in 'Scripting' started by Meaningless-Trinket, Jul 10, 2022.

  1. Meaningless-Trinket

    Meaningless-Trinket

    Joined:
    Apr 25, 2020
    Posts:
    83
    I want to share a script for creating a triangle index for clockwise sorted vertices in a convex polygon.

    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4.  
    5. public class Octagon : MonoBehaviour
    6. {
    7.     public List<Vector3> Vertices = new List<Vector3>();
    8.  
    9.     public List<int> Triangles = new List<int>();
    10.  
    11.     public List<int> Triangles2 = new List<int>();
    12.  
    13.     // Start is called before the first frame update
    14.     void Start()
    15.     {
    16.         // The Vertices go around in clockwise order
    17.  
    18.         Vertices = new List<Vector3>()
    19.         {
    20.             new Vector3(-2.000000f, 0.000000f, 0.000000f),
    21.             new Vector3(0.000000f, 0.000000f, -2.000000f),
    22.             new Vector3(2.000000f, 0.000000f, -2.000000f),
    23.             new Vector3(4.000000f, 0.000000f, 0.000000f),
    24.             new Vector3(4.000000f, 0.000000f, 2.000000f),
    25.             new Vector3(2.000000f, 0.000000f, 4.000000f),
    26.             new Vector3(0.000000f, 0.000000f, 4.000000f),
    27.             new Vector3(-2.000000f, 0.000000f, 2.000000f)
    28.         };
    29.  
    30.         // Repeating pattern in Triangles
    31.  
    32.         Triangles = new List<int>()
    33.         {
    34.             0, 7, 1,
    35.             1, 7, 6,
    36.             1, 6, 2,
    37.             2, 6, 5,
    38.             2, 5, 3,
    39.             3, 5, 4,
    40.         };
    41.  
    42.         // Create triangle index
    43.  
    44.         int r = 0;
    45.  
    46.         int i = 0;
    47.  
    48.         int h = 1;
    49.  
    50.         for (int e = 0; e < Vertices.Count - 2; e++)
    51.         {
    52.             int t1 = r;
    53.             i++;
    54.             int t2 = Vertices.Count - h;
    55.             r++;
    56.             if (i % 2 == 0)
    57.             {
    58.                 r--;
    59.                 h++;
    60.             }
    61.             i++;
    62.             int t3 = i % 2 == 0 ? r : Vertices.Count - h;
    63.             i++;
    64.  
    65.             Triangles2.Add(t1);
    66.             Triangles2.Add(t2);
    67.             Triangles2.Add(t3);
    68.         }
    69.  
    70.         GameObject OctagonMesh = new GameObject("Mesh");
    71.  
    72.         OctagonMesh.AddComponent<MeshFilter>();
    73.         OctagonMesh.AddComponent<MeshRenderer>();
    74.  
    75.         Renderer OctagonRend = OctagonMesh.GetComponent<Renderer>();
    76.         OctagonRend.material = new Material(Shader.Find("Standard"));
    77.  
    78.         Mesh mesh = OctagonMesh.GetComponent<MeshFilter>().mesh;
    79.  
    80.         mesh.SetVertices(Vertices);
    81.         mesh.SetTriangles(Triangles2, 0, true);
    82.  
    83.         mesh.RecalculateNormals();
    84.     }
    85.  
    86.     // Update is called once per frame
    87.     void Update()
    88.     {
    89.  
    90.     }
    91. }
    92.  
    This other script has a different repeating pattern.

    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4.  
    5. public class Octagon2 : MonoBehaviour
    6. {
    7.     public List<Vector3> Vertices = new List<Vector3>();
    8.  
    9.     public List<int> Triangles = new List<int>();
    10.  
    11.     public List<int> Triangles2 = new List<int>();
    12.  
    13.     // Start is called before the first frame update
    14.     void Start()
    15.     {
    16.         // The Vertices go around in clockwise order
    17.  
    18.         Vertices = new List<Vector3>()
    19.         {
    20.             new Vector3(-2.000000f, 0.000000f, 0.000000f),
    21.             new Vector3(0.000000f, 0.000000f, -2.000000f),
    22.             new Vector3(2.000000f, 0.000000f, -2.000000f),
    23.             new Vector3(4.000000f, 0.000000f, 0.000000f),
    24.             new Vector3(4.000000f, 0.000000f, 2.000000f),
    25.             new Vector3(2.000000f, 0.000000f, 4.000000f),
    26.             new Vector3(0.000000f, 0.000000f, 4.000000f),
    27.             new Vector3(-2.000000f, 0.000000f, 2.000000f)
    28.         };
    29.  
    30.         // Repeating pattern in Triangles
    31.  
    32.         Triangles = new List<int>()
    33.         {
    34.             0, 2, 1,
    35.             0, 3, 2,
    36.             0, 4, 3,
    37.             0, 5, 4,
    38.             0, 6, 5,
    39.             0, 7, 6,
    40.         };
    41.  
    42.         // Create triangle index
    43.  
    44.         for (int e = 0; e < Vertices.Count - 2; e++)
    45.         {
    46.             int t1 = 0;
    47.             int t2 = e + 2;
    48.             int t3 = e + 1;
    49.          
    50.             Triangles2.Add(t1);
    51.             Triangles2.Add(t2);
    52.             Triangles2.Add(t3);
    53.         }
    54.  
    55.         GameObject OctagonMesh = new GameObject("Mesh");
    56.  
    57.         OctagonMesh.AddComponent<MeshFilter>();
    58.         OctagonMesh.AddComponent<MeshRenderer>();
    59.  
    60.         Renderer OctagonRend = OctagonMesh.GetComponent<Renderer>();
    61.         OctagonRend.material = new Material(Shader.Find("Standard"));
    62.  
    63.         Mesh mesh = OctagonMesh.GetComponent<MeshFilter>().mesh;
    64.  
    65.         mesh.SetVertices(Vertices);
    66.         mesh.SetTriangles(Triangles2, 0, true);
    67.  
    68.         mesh.RecalculateNormals();
    69.     }
    70.  
    71.     // Update is called once per frame
    72.     void Update()
    73.     {
    74.  
    75.     }
    76. }
    77.  
     
    Last edited: Jul 15, 2022