- Home /
Question by
Joshaba · Aug 24, 2018 at 02:34 PM ·
meshmeshesmesh manipulation
Code Generated Plane Mesh
So I have the code that is almost entirely from the unity wiki page on how to generate meshes. However the plane mesh always is a square, even when different values are placed into scales for X & Y. I don't want to change the meshes transform scale as this will affect the density and other items tied in with this mesh I want to use. Any Ideas on how to get this to properly scale in the x & y direction instead of always producing a square?
using System.Collections;
using System.Collections.Generic;
using JetBrains.Annotations;
using UnityEngine;
public class MeshGenerator : MonoBehaviour
{
public int xDensity = 1;
public int yDensity = 1;
public float ylength = 1f; //1 unity unit == 10f
public float xwidth = 1f; //1 unity unit == 10f
// Use this for initialization
void Start () {
// You can change that line to provide another MeshFilter
MeshFilter filter = gameObject.AddComponent< MeshFilter >();
Mesh mesh = filter.mesh;
mesh.Clear();
float length = ylength;
float width = xwidth;
int resX = xDensity; // 2 minimum
int resZ = yDensity;
#region Vertices
Vector3[] vertices = new Vector3[ resX * resZ ];
for(int z = 0; z < resZ; z++)
{
// [ -length / 2, length / 2 ]
float zPos = ((float)z / (resZ - 1) - .5f) * length;
for(int x = 0; x < resX; x++)
{
// [ -width / 2, width / 2 ]
float xPos = ((float)x / (resX - 1) - .5f) * width;
vertices[ x + z * resX ] = new Vector3( xPos, 0f, zPos );
}
}
#endregion
#region Normales
Vector3[] normales = new Vector3[ vertices.Length ];
for( int n = 0; n < normales.Length; n++ )
normales[n] = Vector3.up;
#endregion
#region UVs
Vector2[] uvs = new Vector2[ vertices.Length ];
for(int v = 0; v < resZ; v++)
{
for(int u = 0; u < resX; u++)
{
uvs[ u + v * resX ] = new Vector2( (float)u / (resX - 1), (float)v / (resZ - 1) );
}
}
#endregion
#region Triangles
int nbFaces = (resX - 1) * (resZ - 1);
int[] triangles = new int[ nbFaces * 6 ];
int t = 0;
for(int face = 0; face < nbFaces; face++ )
{
// Retrieve lower left corner from face ind
int i = face % (resX - 1) + (face / (resZ - 1) * resX);
triangles[t++] = i + resX;
triangles[t++] = i + 1;
triangles[t++] = i;
triangles[t++] = i + resX;
triangles[t++] = i + resX + 1;
triangles[t++] = i + 1;
}
#endregion
mesh.vertices = vertices;
mesh.normals = normales;
mesh.uv = uvs;
mesh.triangles = triangles;
mesh.RecalculateBounds();
mesh.RecalculateTangents();
mesh.RecalculateNormals();
transform.gameObject.AddComponent<BoxCollider>();
}
}
Comment
Your answer
Follow this Question
Related Questions
DrawMesh slowing FPS 0 Answers
How to add vertex points to a mesh 1 Answer
Does mesh compression increase performance ? 1 Answer
Dynamically creating a mesh with a hole in it from two lists of vertices 0 Answers
Materials on an imported mesh 1 Answer