- Home /
Set Y points of vertices on ground.
I'm trying to create a grid tile and set it on the ground. Here is my script so far:
Mesh mesh = new Mesh();
Vector3[] vertices = new Vector3[4];
vertices[0] = new Vector3(-tileWidth/4, 0, tileWidth/4); //top-left
vertices[1] = new Vector3(tileWidth/4, 0, tileWidth/4); //top-right
vertices[2] = new Vector3(-tileWidth/4, 0, -tileWidth/4); //bottom-left
vertices[3] = new Vector3(tileWidth/4, 0, -tileWidth/4); //top-right
mesh.vertices = vertices;
int[] triangles = new int[6]{0,1,2,3,2,1};
mesh.triangles = triangles;
Vector2[] uvs = new Vector2[4]; // setting UVs
uvs[0] = new Vector2(0,1); //top-left
uvs[1] = new Vector2(1,1); //top-right
uvs[2] = new Vector2(0,0); //bottom-left
uvs[3] = new Vector2(1,0); //bottom-right
mesh.uv = uvs;
When setting the vertices, instead of setting y to 0, I would like to cast a ray from each vertex in the -Vector3.up
direction and set the vertex's y
to hit.point.y
in global space.
How do I achieve this?
Comment
Best Answer
Answer by zach-r-d · Jul 25, 2015 at 10:51 AM
Easiest way to do that would be to create a function to do the raycast for a single XZ position:
Vector3 getVertexPosFromXZ(float x, float z) {
RaycastHit hit;
if (Physics.Raycast(new Vector3(x, 99999f, z), -Vector3.up, out hit)) {
return new Vector3(x, hit.point.y, z);
} else {
return new Vector3(x, 0f, z); // or whatever the default should be
}
and then call it four times:
vertices[0] = getVertexPosFromXZ(-tileWidth/4, tileWidth/4); //top-left
vertices[1] = getVertexPosFromXZ(tileWidth/4, tileWidth/4); //top-right
vertices[2] = getVertexPosFromXZ(-tileWidth/4, -tileWidth/4); //bottom-left
vertices[3] = getVertexPosFromXZ(tileWidth/4, -tileWidth/4); //top-right