Unity3D 터널 격자 생 성 방법
수요
최근 터널 의 골조 그리드 생 성 이 필요 하 다.현재 생각 나 는 방법 은 터널 격자 를 얻 고 하나의 알고리즘 을 통 해 내부 상자 와 외곽 상 자 를 분리 하 는 것 이다.
그 다음 에 외곽 틀 과 내부 틀 의 점선 을 통 해 깊이 를 통 해 내외 두 개의 고리 의 서열 을 우선 검색 하여 골조 격자 를 실현 할 수 있다.
2.터널 생 성 알고리즘
터널 은 원호 와 직선 으로 구성 되 어 있 기 때문에 알고리즘 은 다음 과 같다.
1.원심 0,0,0,원 의 반지름 벡터\underset{OB}{\rightarrow} ,z 축 을 감 고 회전 벡터\\underset{OB}{\rightarrow}원 의 점 을 가 져 오 면 외곽 상자 의 점 이 같 습 니 다.
2.안팎 틀 의 점 을 평평 하 게 옮 기 고 z 축 에 편리 함 을 더 해 터널 의 다른 한 끝 에 있 는 점 을 얻는다.
3.인접 한 외곽 상자 의 점 과 이동 후의 네 개의 점 을 취하 여 두 개의 삼각형 을 생 성 한다.안 테 두 리 는 같은 이치 로 얻 을 수 있다.
3.효 과 는 다음 과 같다.
4.실현:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MeshCreater : MonoBehaviour
{
Mesh mesh;
public Material mat;//mesh
public GameObject game;
// Start is called before the first frame update
void Start()
{
mesh = new Mesh();
mesh.Clear();
SetVertivesUV();
SetTriangles();
mesh.vertices = vertices.ToArray();
mesh.triangles = triangles;
GameObject obj_cell = new GameObject();
obj_cell.name = "cell";
mesh.RecalculateNormals();//
mesh.RecalculateBounds(); //
obj_cell.AddComponent<MeshFilter>().mesh = mesh;
obj_cell.AddComponent<MeshRenderer>();
obj_cell.GetComponent<MeshRenderer>().material = mat;
MeshCaluate mesh_caluate = new MeshCaluate();
mesh_caluate.CalculateMesh(mesh);
}
// Update is called once per frame
void Update()
{
}
public List<Vector3> vertices = new List<Vector3>();
private float angle = 10;
private float max_angle = 120;
//
void SetVertivesUV()
{
Vector3 dir1 = new Vector3(Mathf.Sqrt(3f), -1, 0);
Vector3 dir2 = dir1 * 0.8f;
List<Vector3> points1 = new List<Vector3>();
List<Vector3> points2 = new List<Vector3>();
int count = (int)((360 - max_angle) / angle);
for (int i = 0; i < count; i++)
{
Quaternion q= Quaternion.AngleAxis(i * angle, Vector3.forward);
Vector3 point1 = q* dir1;
Vector3 point2 = q* dir2;
points1.Add(point1);
points2.Add(point2);
}
points1.Add(points1[0]);
points2.Add(points2[0]);
for (int i = 0; i < points1.Count; i++)
{
var v1 = points1[i];
var v2 = points2[i];
var v3 = points1[i];
v3.z = 10;
var v4 = points2[i];
v4.z = 10;
vertices.Add(v1);
vertices.Add(v3);
vertices.Add(v2);
vertices.Add(v4);
}
}
private int[] triangles;//
//
void SetTriangles()
{
triangles = new int[vertices.Count * 3];
int c = 0;
for (int i = 0; i < triangles.Length -12 ; i += 12)
{
var v1 = c;
var v2 = c + 1;
var v3 = c + 4;
var v4 = c + 5;
var v5 = c + 2;
var v6 = c + 3;
var v7 = c + 6;
var v8 = c + 7;
triangles[i] = v4;
triangles[i + 1] = v2;
triangles[i + 2] = v1;
triangles[i + 3] = v3;
triangles[i + 4] = v4;
triangles[i + 5] = v1;
triangles[i + 6] = v5;
triangles[i + 7] = v6;
triangles[i + 8] = v8;
triangles[i + 9] = v5;
triangles[i + 10] = v8;
triangles[i + 11] = v7;
c += 4;
}
}
}
결함UV 가 계산 되 지 않 았 기 때문에 스티커 를 사용 할 때 문제 가 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Unity 공부 일지~블렌드 셰이프 조작 방법 그 ①게임을 만들고 싶다 ~라고 생각하고 마지막 날부터 Unity를 만지기 시작했습니다 HITOMI2236입니다. 이번 블렌드 셰이프에 대해 조사했으므로 여기에 기록하려고 합니다. 개인용 메모입니다만, 만약 같은 곳에서 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.