잠시 후에 업데이트되지 않은 오래된 튜토리얼을 발견하고 1D 평면 지형을 만들기 위해 따라갔습니다. 베 지어 곡선을 사용하여 곡면을 생성 한 다음 곡면을 토지로 사용합니다.절차 적으로 생성 된 평면에 여분의 정점을 추가하려면 어떻게해야합니까?
그러나 두 세트의 꼭지점을 만듭니다 (하나는 하단에, 하나는 상단에 있습니다). 더 많은 큐브 모양을 생성하도록 패드를 덧붙이고 싶습니다. 그러나 추가 정점을 추가 할 위치가 확실하지 않습니다. 또 다른 목표는 상단과 하단 사이에 더 많은 정점을 추가하여보다 견고한 모양을 만드는 것입니다. 메쉬에 더 높은 해상도와 깊이를주는 큐브와 같은 모양을 만들기 위해 추가 정점 루프를 어디에 추가해야합니까?
using UnityEngine;
using System.Collections.Generic;
public class TerrainGenerator : MonoBehaviour
{
public Vector3[] meshPoints = null;
private Mesh _mesh = null;
public List<Vector3> vertices = new List<Vector3>();
private List<int> triangles = new List<int>();
private MeshCollider _collider;
private MeshFilter _filter;
private float terrainSize = 0.4f;
public LandTypes type;
public float lastHeight = 3;
void Awake()
{
_collider = GetComponent<MeshCollider>();
_filter = GetComponent<MeshFilter>();
}
public void GenerateMesh(float lh, LandTypes Type)
{
type = Type;
_mesh = _filter.mesh;
_mesh.Clear();
meshPoints = new Vector3[4];
switch(Type)
{
case LandTypes.Flat:
meshPoints[0] = new Vector3(terrainSize * (float)0, lh, 0f);
meshPoints[1] = new Vector3(terrainSize * (float)1, lh, 0f);
meshPoints[2] = new Vector3(terrainSize * (float)2, lh, 0f);
meshPoints[3] = new Vector3(terrainSize * (float)3, lh, 0f);
break;
case LandTypes.Up:
int typeOfUpChance = Random.Range(1, 20);
if (typeOfUpChance > 10)
{
meshPoints[0] = new Vector3(terrainSize * (float)0, lh, 0f);
meshPoints[1] = new Vector3(terrainSize * (float)1, lh + 1, 0f);
meshPoints[2] = new Vector3(terrainSize * (float)2, lh + 2, 0f);
meshPoints[3] = new Vector3(terrainSize * (float)3, lh + 3, 0f);
} else
{
meshPoints[0] = new Vector3(terrainSize * (float)0, lh, 0f);
meshPoints[1] = new Vector3(terrainSize * (float)1, lh + Random.Range(2, 3), 0f);
meshPoints[2] = new Vector3(terrainSize * (float)2, lh + Random.Range(2, 4), 0f);
meshPoints[3] = new Vector3(terrainSize * (float)3, lh + 5, 0f);
}
break;
case LandTypes.Down:
if (lh > 6f)
{
meshPoints[0] = new Vector3(terrainSize * (float)0, lh, 0f);
meshPoints[1] = new Vector3(terrainSize * (float)1, lh - 2, 0f);
meshPoints[2] = new Vector3(terrainSize * (float)2, lh - 3, 0f);
meshPoints[3] = new Vector3(terrainSize * (float)3, lh - 4, 0f);
}
else
{
meshPoints[0] = new Vector3(terrainSize * (float)0, lh, 0f);
meshPoints[1] = new Vector3(terrainSize * (float)1, lh, 0f);
meshPoints[2] = new Vector3(terrainSize * (float)2, lh, 0f);
meshPoints[3] = new Vector3(terrainSize * (float)3, lh, 0f);
}
break;
case LandTypes.Hill:
meshPoints[0] = new Vector3(terrainSize * (float)0, lh, 0f);
meshPoints[1] = new Vector3(terrainSize * (float)1, lh + 1.5f, 0f);
meshPoints[2] = new Vector3(terrainSize * (float)2, lh + 1.5f, 0f);
meshPoints[3] = new Vector3(terrainSize * (float)3, lh, 0f);
break;
}
LandController.Instance.HeightCounts.Add(meshPoints[3].y);
LandController.Instance.lastHeight = meshPoints[3].y;
int resolution = 8;
for (int i = 0; i < resolution; i++)
{
float t = (float)i/(float)(resolution - 1);
Vector3 p = CalculateBezierPoint(t, meshPoints[0], meshPoints[1], meshPoints[2], meshPoints[3]);
AddTerrainPoint(p);
}
_mesh.vertices = vertices.ToArray();
_mesh.triangles = triangles.ToArray();
_mesh.RecalculateBounds();
_mesh.RecalculateNormals();
_collider.sharedMesh = _mesh;
}
void AddTerrainPoint(Vector3 point)
{
vertices.Add(new Vector3(point.x, 0f, 0f));
vertices.Add(point);
if (vertices.Count >= 4)
{
int start = vertices.Count - 4;
triangles.Add(start + 0);
triangles.Add(start + 1);
triangles.Add(start + 2);
triangles.Add(start + 1);
triangles.Add(start + 3);
triangles.Add(start + 2);
}
}
private Vector3 CalculateBezierPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3)
{
float u = 1 - t;
float tt = t * t;
float uu = u * u;
float uuu = uu * u;
float ttt = tt * t;
Vector3 p = uuu * p0;
p += 3 * uu * t * p1;
p += 3 * u * tt * p2;
p += ttt * p3;
return p;
}
}