대칭적인 메쉬 만들기

16564 단어 polyhedronUnity

소개



Unity에서 스크립트에서 mesh를 만들어 대칭성이 있는 객체를 그리려고 한 비망록

환경: Unity 2020.3.12f1

대칭적인 물건 만들기



Quaternion으로 미리
축에 대해 대칭이되는 회전 시스템을 준비한다.

이것에, 중심으로부터 조금 떨어진 위치에 있는 좌표를 곱하는 것으로, 구면상의 어딘가의 점을 취하게 된다.

잘 안쪽 구와 외부 구의 크기와 각도를 조정하면
다면체나 별형 다면체 등의 대칭성이 있는 형태가 나타날 것.

흐름



우선 하나
삼각형 다각형을 그리며,
앞뒤로 미러하고
위아래로 미러하고

그리고, X축, Y축에 90도씩 비틀어진 형태로 회전하면서 복제하고 있습니다.

스크립트



MakePolyhedron.cs
using System.Collections.Generic;
using UnityEngine;

public class MakePolyhedron : MonoBehaviour
{
    //  3軸対象
    readonly Quaternion[] _qs3S = {Quaternion.Euler(0, 0, 0), Quaternion.Euler(0, 90, 90), Quaternion.Euler(90, 0, 90)};

    //  前後対象
    readonly Quaternion[] _qfbs = {Quaternion.Euler(0, 0, 0), Quaternion.Euler(0, 180, 0)};

    //  上下対象
    readonly Quaternion[] _qtbts = {Quaternion.Euler(0, 0, 0), Quaternion.Euler(0, 0, 180)};

    private readonly List<Vector3> _vertices = new List<Vector3>();

    private Mesh _mesh;

    private void Start()
    {
        GetComponent<Renderer>().material.SetColor("_Color",
            new Color(Random.Range(0.25f, 0.85f), Random.Range(0.25f, 0.85f), Random.Range(0.25f, 0.85f)));

        _mesh = new Mesh();

        TriangleSetUp();

        var meshFilter = GetComponent<MeshFilter>();
        meshFilter.mesh = _mesh;
    }

    private void TriangleSetUp()
    {
        foreach (var qs3 in _qs3S)
        {
            foreach (var qfb in _qfbs)
            {
                foreach (var qtbt in _qtbts)
                {
                    for (int i = 0; i < 3; i++)
                    {
                        //  頂点を用意
                        _vertices.Add(Quaternion.Euler(Random.Range(0, 45), Random.Range(0, 45), Random.Range(0, 45)) *
                                      new Vector3(0, 1, 0));
                    }
                }
            }
        }

        //  頂点登録
        _mesh.SetVertices(_vertices);

        var triangles = new List<int>();

        for (int i = 0; i < _vertices.Count; i++)
        {
            triangles.Add(i);
        }

        _mesh.SetTriangles(triangles, 0);
    }


    private void Update()
    {
        TriangleSeed(1 + Mathf.Sin(Time.timeSinceLevelLoad), 1, 45 + Mathf.Sin(Time.timeSinceLevelLoad) * 45);
        _mesh.SetVertices(_vertices);
        _mesh.RecalculateBounds();
        _mesh.RecalculateNormals();
    }

    private void TriangleSeed(float l1, float l2, float fa)
    {
        var id = 0;

        foreach (var qs3 in _qs3S)
        {
            foreach (var qfb in _qfbs)
            {
                foreach (var qtbt in _qtbts)
                {
                    //  頂点を用意
                    _vertices[id++] = qtbt * qfb * qs3 * Quaternion.Euler(0, 0, 0) * new Vector3(0, l1, 0);
                    _vertices[id++] = qtbt * qfb * qs3 * Quaternion.Euler(90, fa, 0) * new Vector3(0, l2, 0);
                    _vertices[id++] = qtbt * qfb * qs3 * Quaternion.Euler(90, -fa, 0) * new Vector3(0, l2, 0);
                }
            }
        }
    }
}

메쉬 드로잉을 위한 구성 요소





MeshFilter와 MeshRenerer가 필요한 것 같습니다.

조금 복제하는 방법을 바꾸어 본다


    //  前後対象 -> 4回回転対称
    readonly Quaternion[] _qfbs = {Quaternion.Euler(0, 0, 0), Quaternion.Euler(0, 90, 0), Quaternion.Euler(0, 180, 0), Quaternion.Euler(0, 270, 0)};

좋은 웹페이지 즐겨찾기