夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Unity C#でスクリプトからメッシュを作成する その② 六角形のポリゴンを作る

本日はUnity実験枠です。

普段はBlenderなどでメッシュを作成しShaderを使用することで描画を行っていますが、このメッシュを今回はC#で作成していきます。

〇六角形のメッシュの作成

昨日は3つの頂点から構成される基本的なポリゴンを作成しました。

redhologerbera.hatenablog.com

本日は昨日より複雑なメッシュを作成していきます。

エフェクトなどを想定しているので、六角形のポリゴンを作成します。

①頂点の座標を知るためにBlenderで円メッシュを作成し、頂点数を6に指定します。

②各頂点の座標を控えます。

③原点を含む各頂点の座標をVector3型でVector3の配列に定義します。

   Vector3[] vertex= new Vector3[]
        {
            new Vector3(0, 0, 0),
            new Vector3(0, 1f, 0),
            new Vector3(0.866025f, 0.5f, 0),
            new Vector3(0.866025f, -0.5f, 0),
            new Vector3(0, -1f, 0),
            new Vector3(-0.866025f, -0.5f, 0),
            new Vector3(-0.866025f, 0.5f, 0),
        };

今回は各頂点を次のように順番に定義しました

次にインデックスですが、今回は原点の頂点から順に次のようにポリゴンを作成します。

  int[] trianglesIndex = new int[] 
        {
            0, 1, 2,
            0, 2, 3,
            0, 3, 4,
            0, 4, 5,
            0, 5, 6,
            0, 6, 1,
        };

かく改行毎にポリゴンが定義されています。

これによって六角形のポリゴンが作られるようになりました。

ワイヤフレーム表示で見ると正しくポリゴンが張られていることがわかります。

〇スクリプト

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CreateHex : MonoBehaviour
{
    private MeshFilter _meshFilter;
    private MeshRenderer _meshRenderer;
    private Mesh output;

    [SerializeField] private int _hexSize;
    [SerializeField] private Material _material;
    // Start is called before the first frame update
    void Start()
    {

        if (_meshFilter == null)
            _meshFilter = this.GetComponent<MeshFilter>();
        if (_meshRenderer == null)
            _meshRenderer = this.GetComponent<MeshRenderer>();
        output = new Mesh();

            CreateMesh();

        output.RecalculateBounds();
        output.RecalculateNormals();
        //set Mesh
        _meshFilter.sharedMesh = output;

        _meshRenderer.material = _material;
    }


    void CreateMesh()
    {

        Vector3[] vertex= new Vector3[]
        {
            new Vector3(0, 0, 0),
            new Vector3(0, 1f, 0),
            new Vector3(0.866025f, 0.5f, 0),
            new Vector3(0.866025f, -0.5f, 0),
            new Vector3(0, -1f, 0),
            new Vector3(-0.866025f, -0.5f, 0),
            new Vector3(-0.866025f, 0.5f, 0),
        };
        
        
        for (int i = 1; i < _hexSize; i++)
        {
            #region Hex1
            float addposx1 = (i*0.866025f);
            float addposy1 = (i*1.5f);
            Vector3[] vertex2 = new Vector3[]
            {
                new Vector3(0+addposx1, 0+addposy1, 0),
                new Vector3(0+addposx1, 1f+addposy1, 0),
                new Vector3(0.866025f+addposx1, 0.5f+addposy1, 0),
                new Vector3(0.866025f+addposx1, -0.5f+addposy1, 0),
                new Vector3(0+addposx1, -1f+addposy1, 0),
                new Vector3(-0.866025f+addposx1, -0.5f+addposy1, 0),
                new Vector3(-0.866025f+addposx1, 0.5f+addposy1, 0),
            };
            int hexVertexLength= vertex.Length;
            Array.Resize(ref vertex, vertex.Length + vertex2.Length);
            Array.Copy(vertex2, 0, vertex, hexVertexLength, vertex2.Length);
            #endregion
            #region Hex2
            float addposx3 = (i*-0.866025f);
            float addposy3 = (i*-1.5f);
            Vector3[] vertex3 = new Vector3[]
            {
                new Vector3(0+addposx3, 0+addposy3, 0),
                new Vector3(0+addposx3, 1f+addposy3, 0),
                new Vector3(0.866025f+addposx3, 0.5f+addposy3, 0),
                new Vector3(0.866025f+addposx3, -0.5f+addposy3, 0),
                new Vector3(0+addposx3, -1f+addposy3, 0),
                new Vector3(-0.866025f+addposx3, -0.5f+addposy3, 0),
                new Vector3(-0.866025f+addposx3, 0.5f+addposy3, 0),
            };
            hexVertexLength= vertex.Length;
            Array.Resize(ref vertex, vertex.Length + vertex3.Length);
            Array.Copy(vertex3, 0, vertex, hexVertexLength, vertex3.Length);
            #endregion
            #region Hex3
            float addposx4 = (i*-0.866025f);
            float addposy4 = (i*1.5f);
            Vector3[] vertex4 = new Vector3[]
            {
                new Vector3(0+addposx4, 0+addposy4, 0),
                new Vector3(0+addposx4, 1f+addposy4, 0),
                new Vector3(0.866025f+addposx4, 0.5f+addposy4, 0),
                new Vector3(0.866025f+addposx4, -0.5f+addposy4, 0),
                new Vector3(0+addposx4, -1f+addposy4, 0),
                new Vector3(-0.866025f+addposx4, -0.5f+addposy4, 0),
                new Vector3(-0.866025f+addposx4, 0.5f+addposy4, 0),
            };
            hexVertexLength= vertex.Length;
            Array.Resize(ref vertex, vertex.Length + vertex4.Length);
            Array.Copy(vertex4, 0, vertex, hexVertexLength, vertex4.Length);
            #endregion
            #region Hex4
            float addposx5 = (i*0.866025f);
            float addposy5 = (i*-1.5f);
            Vector3[] vertex5 = new Vector3[]
            {
                new Vector3(0+addposx5, 0+addposy5, 0),
                new Vector3(0+addposx5, 1f+addposy5, 0),
                new Vector3(0.866025f+addposx5, 0.5f+addposy5, 0),
                new Vector3(0.866025f+addposx5, -0.5f+addposy5, 0),
                new Vector3(0+addposx5, -1f+addposy5, 0),
                new Vector3(-0.866025f+addposx5, -0.5f+addposy5, 0),
                new Vector3(-0.866025f+addposx5, 0.5f+addposy5, 0),
            };
            hexVertexLength= vertex.Length;
            Array.Resize(ref vertex, vertex.Length + vertex5.Length);
            Array.Copy(vertex5, 0, vertex, hexVertexLength, vertex5.Length);
            #endregion
            #region Hex5
            float addposx6 = (i*0.866025f*2);
            float addposy6 = (0);
            Vector3[] vertex6 = new Vector3[]
            {
                new Vector3(0+addposx6, 0+addposy6, 0),
                new Vector3(0+addposx6, 1f+addposy6, 0),
                new Vector3(0.866025f+addposx6, 0.5f+addposy6, 0),
                new Vector3(0.866025f+addposx6, -0.5f+addposy6, 0),
                new Vector3(0+addposx6, -1f+addposy6, 0),
                new Vector3(-0.866025f+addposx6, -0.5f+addposy6, 0),
                new Vector3(-0.866025f+addposx6, 0.5f+addposy6, 0),
            };
            hexVertexLength= vertex.Length;
            Array.Resize(ref vertex, vertex.Length + vertex6.Length);
            Array.Copy(vertex6, 0, vertex, hexVertexLength, vertex6.Length);
            #endregion
            #region Hex6
            float addposx7 = (i*0.866025f*-2);
            float addposy7 = (0);
            Vector3[] vertex7 = new Vector3[]
            {
                new Vector3(0+addposx7, 0+addposy7, 0),
                new Vector3(0+addposx7, 1f+addposy7, 0),
                new Vector3(0.866025f+addposx7, 0.5f+addposy7, 0),
                new Vector3(0.866025f+addposx7, -0.5f+addposy7, 0),
                new Vector3(0+addposx7, -1f+addposy7, 0),
                new Vector3(-0.866025f+addposx7, -0.5f+addposy7, 0),
                new Vector3(-0.866025f+addposx7, 0.5f+addposy7, 0),
            };
            hexVertexLength= vertex.Length;
            Array.Resize(ref vertex, vertex.Length + vertex7.Length);
            Array.Copy(vertex7, 0, vertex, hexVertexLength, vertex7.Length);
            #endregion

        }

        int[] trianglesIndex = new int[] 
        {
            0, 1, 2,
            0, 2, 3,
            0, 3, 4,
            0, 4, 5,
            0, 5, 6,
            0, 6, 1,
        };

        for (int i = 1; i < _hexSize; i++)
        {
            #region Hex1
            int x = i *7;
            int[] trianglesIndex2 = new int[]
            {
                0+x, 1+x, 2+x,
                0+x, 2+x, 3+x,
                0+x, 3+x, 4+x,
                0+x, 4+x, 5+x,
                0+x, 5+x, 6+x,
                0+x, 6+x, 1+x,
            };
            int hexIndexLength = trianglesIndex.Length;
            Array.Resize(ref trianglesIndex,trianglesIndex.Length + trianglesIndex2.Length);
            Array.Copy(trianglesIndex2,0,trianglesIndex,hexIndexLength,trianglesIndex2.Length);            

            #endregion
            #region Hex2
            int x2 = i*2 *7;
            int[] trianglesIndex3 = new int[]
            {
                0+x2, 1+x2, 2+x2,
                0+x2, 2+x2, 3+x2,
                0+x2, 3+x2, 4+x2,
                0+x2, 4+x2, 5+x2,
                0+x2, 5+x2, 6+x2,
                0+x2, 6+x2, 1+x2,
            };
            hexIndexLength = trianglesIndex.Length;
            Array.Resize(ref trianglesIndex,trianglesIndex.Length + trianglesIndex3.Length);
            Array.Copy(trianglesIndex3,0,trianglesIndex,hexIndexLength,trianglesIndex3.Length);            

            #endregion
            #region Hex3
            int x3 = i*3 *7;
            int[] trianglesIndex4 = new int[]
            {
                0+x3, 1+x3, 2+x3,
                0+x3, 2+x3, 3+x3,
                0+x3, 3+x3, 4+x3,
                0+x3, 4+x3, 5+x3,
                0+x3, 5+x3, 6+x3,
                0+x3, 6+x3, 1+x3,
            };
            hexIndexLength = trianglesIndex.Length;
            Array.Resize(ref trianglesIndex,trianglesIndex.Length + trianglesIndex4.Length);
            Array.Copy(trianglesIndex4,0,trianglesIndex,hexIndexLength,trianglesIndex4.Length);            

            #endregion
            #region Hex4
            int x4 = i*4 *7;
            int[] trianglesIndex5 = new int[]
            {
                0+x4, 1+x4, 2+x4,
                0+x4, 2+x4, 3+x4,
                0+x4, 3+x4, 4+x4,
                0+x4, 4+x4, 5+x4,
                0+x4, 5+x4, 6+x4,
                0+x4, 6+x4, 1+x4,
            };
            hexIndexLength = trianglesIndex.Length;
            Array.Resize(ref trianglesIndex,trianglesIndex.Length + trianglesIndex5.Length);
            Array.Copy(trianglesIndex5,0,trianglesIndex,hexIndexLength,trianglesIndex5.Length);            

            #endregion
            #region Hex5
            int x5 = i*5 *7;
            int[] trianglesIndex6 = new int[]
            {
                0+x5, 1+x5, 2+x5,
                0+x5, 2+x5, 3+x5,
                0+x5, 3+x5, 4+x5,
                0+x5, 4+x5, 5+x5,
                0+x5, 5+x5, 6+x5,
                0+x5, 6+x5, 1+x5,
            };
            hexIndexLength = trianglesIndex.Length;
            Array.Resize(ref trianglesIndex,trianglesIndex.Length + trianglesIndex6.Length);
            Array.Copy(trianglesIndex6,0,trianglesIndex,hexIndexLength,trianglesIndex6.Length);            

            #endregion
            #region Hex6
            int x6 = i*6 *7;
            int[] trianglesIndex7 = new int[]
            {
                0+x6, 1+x6, 2+x6,
                0+x6, 2+x6, 3+x6,
                0+x6, 3+x6, 4+x6,
                0+x6, 4+x6, 5+x6,
                0+x6, 5+x6, 6+x6,
                0+x6, 6+x6, 1+x6,
            };
            hexIndexLength = trianglesIndex.Length;
            Array.Resize(ref trianglesIndex,trianglesIndex.Length + trianglesIndex7.Length);
            Array.Copy(trianglesIndex7,0,trianglesIndex,hexIndexLength,trianglesIndex7.Length);            

            #endregion

        }
        Debug.Log(vertex[6]);
        Debug.Log(vertex.Length);
        Debug.Log(trianglesIndex.Length);
        output.SetVertices(vertex);  //set vertex;
        output.SetTriangles(trianglesIndex,0);

    }
}