전문가용 물결무늬 스타일(루프)

13975 단어 Unity
유닛으로 망상물을 스크립트로 프로시저를 만드는 방법을 몇 번에 걸쳐 쓴다.
  • 첫 번째 유니티 전문 이쑤시개 스타일링(삼각형, 사각형, 정다각형) - Qita
  • 제2회 Unity 카페(평면)-Qita
  • 제3회 카페(장방체)-Qita
  • 제4회 Unity 카페(원통)-Qita
  • 제5회 카페-Qita
  • 제6회 Unity에서 전문적인 파문 모형
  • 이번에는 트러스트.

    Torus.cs
    using UnityEngine;
    
    [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
    public class Torus : MonoBehaviour
    {
        [SerializeField] private float majorRadius = 3f;
        [SerializeField] private float minorRadius = 1f;
        [SerializeField] private int thetaSegments = 8;
        [SerializeField] private int phiSegments = 8;
    
        private void Awake()
        {
            Mesh mesh = new Mesh();
            GetComponent<MeshFilter>().mesh = mesh;
    
            Vector3[] vertices = new Vector3[thetaSegments * phiSegments];
            int[] triangles = new int[thetaSegments * phiSegments * 2 * 3];
    
            float thetaStep = Mathf.PI * 2.0f / thetaSegments;
            float phiStep = Mathf.PI * 2.0f / phiSegments;
            int vi = 0;
            for (int hi = 0; hi < thetaSegments; hi++)
            {
                Quaternion rot = Quaternion.AngleAxis(hi * thetaStep * Mathf.Rad2Deg, Vector3.up);
                for (int pi = 0; pi < phiSegments; pi++)
                {
                    float phi = pi * phiStep;
                    vertices[vi++] = rot * new Vector3(majorRadius + minorRadius * Mathf.Cos(phi), minorRadius * Mathf.Sin(phi), 0);
                }
            }
    
            int ti = 0;
            for (int hi = 0; hi < thetaSegments; hi++)
            {
                int hj = hi != thetaSegments - 1 ? hi + 1 : 0; 
                for (int pi = 0; pi < phiSegments; pi++)
                {
                    int pj = pi != phiSegments - 1 ? pi + 1 : 0;
                    int v00 = pi + hi * phiSegments;
                    int v10 = pj + hi * phiSegments;
                    int v01 = pi + hj * phiSegments;
                    int v11 = pj + hj * phiSegments;
                    ti = MakeQuad(triangles, ti, v00, v10, v01, v11);
                }
            }
    
            mesh.vertices = vertices;
            mesh.triangles = triangles;
            mesh.RecalculateNormals();
        }
    
        private int MakeQuad(int[] triangles, int ti, int v00, int v10, int v01, int v11)
        {
            triangles[ti] = v00;
            triangles[ti + 1] = triangles[ti + 5] = v01;
            triangles[ti + 2] = triangles[ti + 4] = v10;
            triangles[ti + 3] = v11;
            return ti + 6;
        }
    }
    
    majorRadius에서는 도넛의 동그라미 크기를, minorRadius에서는 도넛의 굵기를 지정할 수 있다.또한 thetaSegments 도넛의 분할 수를 phiSegments로 지정하고 굵은 부분의 분할 수를 지정합니다.
    메쉬의 정점과 삼각형은 다음과 같이 구성되어 있다.
    정점 위치를 직접 계산하기 어려우므로 xy평면에 한 번 배치한 다음에 이산화티타늄에서 y축에 비해 회전하여 적당한 값으로 만든다.

    트러스트는 바닥과 위가 연결된 원통으로 볼 수 있기 때문에 삼각형의 구조는 원통과 같다.원통의 망상물이전 기사에 대해 설명하였으니 참고하시기 바랍니다.

    좋은 웹페이지 즐겨찾기