본문 바로가기
반응형

개발/Unity235

유니티 - 절차적 메시로 3D 복셀 만들기 (Make 3D Voxels with Procedural Mesh) Unity 전체 링크 참고 - 절차적 메시로 정점이 24개인 큐브 만들기 - 절차적 메시로 2D 복셀 만들기 2D 복셀을 3D 복셀로 확장해보자. 먼저 voxelData가 2차원 int[,]에서 3차원 int[,,]로 변경된다. 2D에서 [z, x]를 그대로 유지하기 위해 [y, z, x]로 확장한다. 아래의 좌표는 위의 그림에 있는 피라미드가 된다. int[,,] voxelData = new int[,,] { // [y, z, x] { // y = 0 { 1, 1, 1, 1, 1 }, // => x { 1, 0, 0, 0, 1 }, // ↓ z { 1, 0, 1, 0, 1 }, { 1, 0, 0, 0, 1 }, { 1, 1, 1, 1, 1 }, }, { // y = 1 { 0, 0, 0, 0, 0 },.. 2022. 11. 7.
유니티 - 절차적 메시로 2D 복셀 만들기 (Make 2D Voxels with Procedural Mesh) Unity 전체 링크 참고 - 절차적 메시로 정점이 24개인 큐브 만들기 픽셀(Pixel)은 2차원 그림을 구성하는 사각형의 점이자 기본 단위이다. 복셀(Voxel)은 2차원 픽셀을 3차원 형태로 구현한 것이다. (Volume + Pixel) 절차적 메시를 이용하여 2차원 좌표를 보고 2차원 Voxels를 만들어보자. 단순히 큐브로 복셀을 그리는 경우 알파벳 A를 복셀로 표현하면 아래와 같다. 절차적 메시를 이용하여 큐브를 만들 수 있기 때문에 입력된 좌표를 바탕으로 큐브를 만들면 된다. 하지만 동그라미로 표시된 큐브의 6개의 면은 모두 그릴 필요가 없다. 다른 큐브에 의해 가려지기 때문이다. 큐브마다 모든 면에 대해 메시를 그리면 GPU 성능에 무리가 간다. 따라서 Voxels를 그릴 때는 6면의 큐브.. 2022. 11. 7.
유니티 - 절차적 메시로 정점이 24개인 큐브 만들기 (Make 24 Vertices Cube with Procedural Mesh) Unity 전체 링크 참고 - 절차적 메시로 정점이 8개인 큐브 만들기 절차적 메시를 이용해서 정점이 24개인 큐브를 만들어보자. Vector3.forward가 (0, 0, 1)이므로 아래와 같이 방향을 정의한다. 그리고 이 방향 순서대로 쿼드를 6개 만든다. public enum Direction { FORWARD, // (0, 0, +1) RIGHT, // (+1, 0, 0) UP, // (0, +1, 0) BACK, // (0, 0, -1) LEFT, // (-1, 0, 0) DOWN // (0, -1, 0) } 위의 방향을 기준으로 정점에 번호를 매기면 아래와 같다. 따라서 faceNumber는 아래와 같이 정의해둔다. public int[][] faceNumber = { new int[] {0,.. 2022. 11. 6.
유니티 - 메시의 로컬 좌표를 월드 좌표로 변환하기 (How to Transform Local or World Position of Mesh Vertices) Unity 전체 링크 쿼드를 아래와 같이 (0, 0, 0)에 배치하고 각 정점에 자식으로 Sphere를 배치하자. Sphere는 총 4개가 필요하고 (± 0.5, ± 0.5, 0)의 좌표를 가진다. 자식 오브젝트의 좌표는 아래와 같으며, Mesh의 Vertices 순서대로 배치하였다. ContextMenu를 이용하면 인스펙터에서 함수를 호출할 수 있다. [ContextMenu("Show Position")] void saveMesh() { string log = string.Empty; foreach (Vector3 v in mesh.vertices) log += v.ToString() + " "; Debug.Log(log + " 2022. 11. 6.
유니티 - 절차적 메시로 만든 메시 저장하기 (Save Procedural Mesh) Unity 전체 링크 절차적 메시로 만든 메시를 저장해서 Asset 폴더에 남겨보자. 절차적 메시로 정다각뿔, 원뿔 그리기 개선에서 사용한 스크립트를 수정한다. 아래의 코드만 추가하면 된다. #if UNITY_EDITOR using UnityEditor; #endif #if UNITY_EDITOR [ContextMenu("SaveMesh")] void saveMesh() { string path = "Assets/MyMesh.asset"; AssetDatabase.CreateAsset(mesh, AssetDatabase.GenerateUniqueAssetPath(path)); AssetDatabase.SaveAssets(); } #endif ContextMenu를 이용하면 유니티 인스펙터에서 함수를 실행.. 2022. 11. 6.
유니티 - 절차적 메시로 정점이 8개인 큐브 만들기 (Make 8 Vertices Cube with Procedural Mesh) Unity 전체 링크 유니티 큐브의 정점의 개수를 출력하면 24개임을 알 수 있다. 큐브를 8개로 정점으로 만들면 어떻게 되는지 알아보자. ProceduralCube8.cs는 정점을 8개만 만들고 나서 시계방향으로 각각의 면에 삼각형을 두 개씩 만들어주었다. using System.Collections; using System.Collections.Generic; using UnityEngine; [RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))] public class ProceduralCube8 : MonoBehaviour { Mesh mesh; Vector3[] vertices; int[] triangles; void Start() { mes.. 2022. 11. 6.
유니티 - 절차적 메시로 정다각기둥, 원기둥 그리기 개선 (Make Regular Prism, Cylinder with Procedural Mesh 2) Unity 전체 링크 절차적 메시로 정다각기둥, 원기둥 그리기에서 정점의 개수를 줄여보자. ProceduralRegularPrismUpgrade.cs를 추가하고 ProceduralRegularPrism.cs를 복사한 후 코드를 수정한다. 옆면 생성 코드를 개선하면 된다. 밑면의 정점을 먼저 만들고 윗면의 정점을 추가한다. 그리고 해당 정점 2 * N개만 triangles에 배치한다. (이전 코드는 4 * N개였다.) /* -------------------- 옆면 + 개선 -------------------- */ vIdx = 2 * polygon + 2; for (int i = 1; i 0 || polygon >= 3 || height > 0) { setMeshData(size, polygon); cr.. 2022. 11. 6.
유니티 - 절차적 메시로 정다각기둥, 원기둥 그리기 (Make Regular Prism, Cylinder with Procedural Mesh) Unity 전체 링크 절차적 메시로 정다각뿔, 원뿔 만들기를 확장하여 정다각기둥, 원기둥을 만들어보자. 높이를 설정할 height 변수를 public으로 선언한다. 여기서도 높이의 절반이 오브젝트의 기준점이 된다. public float height = 1.0f; vertices는 정다각형이 하나 더 추가되므로 polygon + 1개가 추가되고, 정다각형 사이의 사각형이 polygon 만큼 추가되므로 정점의 개수 4를 곱한 값을 더한다. vertices = new Vector3[(polygon + 1) + (polygon + 1) + (polygon * 4)]; 위와 마찬가지로 triangles는 아래와 같이 크기가 변한다. triangles = new int[(3 * polygon) + (3 * pol.. 2022. 11. 6.
유니티 - 절차적 메시로 정다각뿔, 원뿔 그리기 개선 (Make Regular Pyramids, Cone with Procedural Mesh 2) Unity 전체 링크 절차적 메시로 정다각뿔, 원뿔 그리기에서 정점의 개수를 줄여보자. ProceduralRegularPyramidsUpgrade.cs를 추가하고 ProceduralRegularPyramids.cs를 복사한다. 뿔의 옆면 생성 코드를 개선하면 된다. 윗부분의 꼭지점을 먼저 만들고 다각형의 정점을 다시 배치한다. 그리고 해당 정점 2 * N개만 triangles에 배치한다. (이전 코드는 4 * N개였다.) 따라서 vertices크기가 4N + 1 개에서 2N + 2개로 줄어든다. vertices = new Vector3[polygon + 1 + (polygon + 1)]; 뿔을 만드는 꼭지점을 먼저 vertices에 추가하고 한번 더 정다각형의 꼭지점을 vertices에 넣는다. 그리고 .. 2022. 11. 6.
반응형