Sharon Giselle
Sharon Giselle

Reputation: 121

Why when using gizmos the drawing is not fitting?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Grid : MonoBehaviour
{
    private MeshFilter meshf;
    private Mesh mesh;
    private Vector3[] vertices;

    private void Start()
    {
        StartCoroutine(GenerateOrigin()); 
    }

    private IEnumerator GenerateOrigin()
    {
        // You can change that line to provide another MeshFilter
        meshf = GetComponent<MeshFilter>();
        mesh = new Mesh();
        meshf.mesh = mesh;
        mesh.Clear();

        #region Vertices

        WaitForSeconds wait = new WaitForSeconds(0.05f);
        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);
                yield return wait;
            }
        }
        #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();
    }

    private void OnDrawGizmos()
    {
        Gizmos.color = Color.black;
        for (int i = 0; i < vertices.Length; i++)
        {
            Gizmos.DrawSphere(vertices[i], 0.1f);
        }
    }
}

I'm using WaitForSeconds and return Wait. And what i'm getting in the end after it's creating the vertices one by one is this: The mesh the red is not on the vertices not in place. Maybe it's fine i'm not sure. I thought it should be on it on the vertices.

Mesh

Upvotes: 0

Views: 45

Answers (1)

You're not taking into account the object's location in space. You have it offset from the origin, but the vertices are being drawn relative to the origin, ignoring that offset.

If your object was instead placed at (0,5,0) this line is where the vertices show up:

vertices[x + z * resX] = new Vector3(xPos, 0f, zPos);

Note the 0 in the y coordinate for the vertex. 0 != 5

You need to add in the offset for the object's worldspace location.

vertices[x + z * resX] = new Vector3(xPos + transform.position.x, transform.position.y, zPos + transform.position.z);

Upvotes: 1

Related Questions