So I’ve been following Sebastian Lague’s tutorial series on how to generate planets but created a problem once I wanted to add a mesh collider to it, being that I need to use Convex however convex bridges mountains and stuff like that so I decided that splitting a lower resolution mesh into different objects and meshes but I did it way wrong and am not the best with this type of thing so if someone could show me what’s wrong and how to fix it, that would be great!
Sebastian Lague’s tutorial series on how to generate planets:
PlanetTerrainFace Script:
using System.Collections.Generic;
using UnityEngine;
using Utitity;
public class PlanetTerrainFace
{
GameObject meshObj;
PlanetShapeGenerator shapeGenerator;
Mesh mesh;
int resolution;
int colRes;
Vector3 localUp;
Vector3 axisA;
Vector3 axisB;
public PlanetTerrainFace(GameObject meshObj, PlanetShapeGenerator shapeGenerator, Mesh mesh, int resolution, int colRes, Vector3 localUp)
{
this.meshObj = meshObj;
this.shapeGenerator = shapeGenerator;
this.mesh = mesh;
this.resolution = resolution;
this.colRes = colRes;
this.localUp = localUp;
axisA = new Vector3(localUp.y, localUp.z, localUp.x);
axisB = Vector3.Cross(localUp, axisA);
}
public void ConstructMesh(bool createCollision = false)
{
Vector3[] vertices = new Vector3[resolution * resolution];
int[] triangles = new int [(resolution - 1)*(resolution - 1)*6];
int triIndex = 0;
for(int y = 0; y < resolution; y++)
{
for(int x = 0; x < resolution; x++)
{
int i = x+y*resolution;
Vector2 percent = new Vector2(x, y) / (resolution - 1);
Vector3 pointOnUnitCube = localUp + (percent.x - 0.5f) * 2 * axisA + (percent.y - 0.5f) * 2 * axisB;
Vector3 pointOnUnitSphere = pointOnUnitCube.normalized;
vertices[i] = shapeGenerator.CalculatePointOnPlanet(pointOnUnitSphere);
if(x!=resolution-1 && y!=resolution-1)
{
triangles[triIndex] = i;
triangles[triIndex+1] = i+resolution+1;
triangles[triIndex+2] = i+resolution;
triangles[triIndex+3] = i;
triangles[triIndex+4] = i+1;
triangles[triIndex+5] = i+resolution+1;
triIndex += 6;
}
}
}
mesh.Clear();
mesh.vertices = vertices;
mesh.triangles = triangles;
mesh.RecalculateNormals();
triIndex = 0;
if(createCollision)
{
List<Vector3> colVertices = new List<Vector3>(1);
List<int> colTriangles = new List<int>(1);
for(int i = 0; i < 8; i++)
{
GameObject colObj = new GameObject("ColOBJ_"+i.ToString());
colObj.transform.parent = meshObj.transform;
Mesh colMesh = new Mesh();
//Vector3[] colVertices = new Vector3[(int)(colRes / 6f) * (int)(colRes / 6f)];
//int[] colTriangles = new int [(colRes - 1)*(colRes - 1)*6];
//colVertices.RemoveRange(0, colVertices.Count);
//colTriangles.RemoveRange(0, colTriangles.Count);
colVertices.Clear();
colTriangles.Clear();
colVertices.Capacity = 1;
colTriangles.Capacity = 1;
for(int iy = 0; iy < (int)(colRes / 8); iy++)
{
for(int ix = 0; ix < (int)(colRes / 8); ix++)
{
//int iz = ((((i+1)*ix)+((i+1)*iy))*colRes);
int iz = (ix+iy)*colRes;
//Vector2 percent = new Vector2((i+1)*ix, (i+1)*iy) / (colRes - 1);
Vector2 percent = new Vector2((ix*(i+1)), iy*(i+1)) / (colRes - 1);
Vector3 pointOnUnitCube = localUp + (percent.x - 0.5f) * 2 * axisA + (percent.y - 0.5f) * 2 * axisB;
//Vector3 pointOnUnitCube = localUp * 2 * axisA * 2 * axisB;
Vector3 pointOnUnitSphere = pointOnUnitCube.normalized;
//colVertices[iz+1] = shapeGenerator.CalculatePointOnPlanet(pointOnUnitSphere);
colVertices.Add(shapeGenerator.CalculatePointOnPlanet(pointOnUnitSphere));
if(ix/(i+1)!=colRes-1 && iy/(i+1)!=colRes-1)
{
colTriangles.Add(iz);
colTriangles.Add(iz+1);
if(iz + 2 < colRes)
{
colTriangles.Add(iz-1);
}
else
{
colTriangles.Add(iz+2);
}
/*
colTriangles.Add(iz);
colTriangles.Add(iz+colRes+1);
colTriangles.Add(iz+colRes);
colTriangles.Add(iz);
colTriangles.Add(iz+1);
colTriangles.Add(iz+colRes);
*/
/*
colTriangles[triIndex] = iz;
colTriangles[triIndex+1] = iz+colRes+1;
colTriangles[triIndex+2] = iz+colRes;
colTriangles[triIndex+3] = iz;
colTriangles[triIndex+4] = iz+1;
colTriangles[triIndex+5] = iz+colRes+1;
triIndex += 6;
*/
}
}
}
colMesh.Clear();
colMesh.vertices = colVertices.ToArray(); //MeshUtilities.ClearVertBlanks(colVertices.ToArray(), colTriangles.ToArray());
colMesh.triangles = colTriangles.ToArray(); //MeshUtilities.ClearTriBlanks(colVertices.ToArray(), colTriangles.ToArray());
//colMesh.vertices = colVertices;
//colMesh.triangles = colTriangles;
//colMesh = MeshUtilities.ClearBlanksVertTri(colMesh);
colMesh.RecalculateNormals();
colMesh.name = "ColMesh_"+i.ToString();
MeshCollider colMeshCol = colObj.AddComponent<MeshCollider>();
colMeshCol.sharedMesh = colMesh;
colMeshCol.convex = true;
Rigidbody colRb = colObj.AddComponent<Rigidbody>();
colRb.isKinematic = false;
colRb.constraints = RigidbodyConstraints.FreezeAll;
}
}
}
public Mesh GetMesh()
{
return this.mesh;
}
}
Thanks in advance!