I Think There's Something Wrong With My Normals

Or possibly my vertices. But it won’t render anything, here’s my code:

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

public class MeshControl : MonoBehaviour
{
   [SerializeField]
   private List<Vector3> grid;

   private Vector3[] vertices;
   private Vector3[] normals;
   private Mesh mesh;
   private MeshFilter mf;

   void Start()
   {
       grid = new List<Vector3>();
       BuildMesh(new Vector3(0, 0, 0), new Vector3(100, 0, 100), new Vector3(100, 0, 0));
   }

   void Update()
   {
    
   }

   void BuildMesh(Vector3 vec1, Vector3 vec2, Vector3 vec3)
   {
       vertices = new Vector3[3];
       normals = new Vector3[3];
       mesh = new Mesh();

       vertices[0] = vec1;
       vertices[1] = vec2;
       vertices[2] = vec3;

       normals[0] = new Vector3(Mathf.Sin(GetDir(new Vector2(vec1.x - vec2.x, vec1.z - vec2.z))), Mathf.Sin(GetDir(new Vector2(vec1.x - vec2.x, vec1.y - vec2.y))), Mathf.Cos(GetDir(new Vector2(vec1.x - vec2.x, vec1.z - vec2.z))));
       normals[1] = new Vector3(Mathf.Sin(GetDir(new Vector2(vec1.x - vec2.x, vec1.z - vec2.z))), Mathf.Sin(GetDir(new Vector2(vec1.x - vec2.x, vec1.y - vec2.y))), Mathf.Cos(GetDir(new Vector2(vec1.x - vec2.x, vec1.z - vec2.z))));
       normals[2] = new Vector3(Mathf.Sin(GetDir(new Vector2(vec1.x - vec2.x, vec1.z - vec2.z))), Mathf.Sin(GetDir(new Vector2(vec1.x - vec2.x, vec1.y - vec2.y))), Mathf.Cos(GetDir(new Vector2(vec1.x - vec2.x, vec1.z - vec2.z))));

       mesh.vertices = vertices;
       mesh.normals = normals;

       mf = GetComponent<MeshFilter>();
       mf.mesh = mesh;
   }

   float GetDir(Vector2 val)
   {
       if (val.y < 0)
       {
           return (Mathf.Atan(val.x / val.y) + 180);
       }
       else
       {
           return (Mathf.Atan(val.x / val.y) + 0);
       }
   }
}

You need faces/triangles too

I updated my code:

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

public class MeshControl : MonoBehaviour
{
    [SerializeField]
    private List<Vector3> grid;

    private Vector3[] vertices;
    private Vector3[] normals;
    private int[] triangles;
    private Mesh mesh;
    private MeshFilter mf;

    void Start()
    {
        grid = new List<Vector3>();
        BuildMesh(new Vector3(0, 0, 0), new Vector3(100, 0, 100), new Vector3(100, 0, 0));
    }

    void Update()
    {
      
    }

    void BuildMesh(Vector3 vec1, Vector3 vec2, Vector3 vec3)
    {
        vertices = new Vector3[3];
        normals = new Vector3[3];
        triangles = new int[3];
        mesh = new Mesh();

        vertices[0] = vec1;
        vertices[1] = vec2;
        vertices[2] = vec3;

        normals[0] = new Vector3(Mathf.Sin(GetDir(new Vector2(vec1.x - vec2.x, vec1.z - vec2.z))), Mathf.Sin(GetDir(new Vector2(vec1.x - vec2.x, vec1.y - vec2.y))), Mathf.Cos(GetDir(new Vector2(vec1.x - vec2.x, vec1.z - vec2.z))));
        normals[1] = new Vector3(Mathf.Sin(GetDir(new Vector2(vec1.x - vec2.x, vec1.z - vec2.z))), Mathf.Sin(GetDir(new Vector2(vec1.x - vec2.x, vec1.y - vec2.y))), Mathf.Cos(GetDir(new Vector2(vec1.x - vec2.x, vec1.z - vec2.z))));
        normals[2] = new Vector3(Mathf.Sin(GetDir(new Vector2(vec1.x - vec2.x, vec1.z - vec2.z))), Mathf.Sin(GetDir(new Vector2(vec1.x - vec2.x, vec1.y - vec2.y))), Mathf.Cos(GetDir(new Vector2(vec1.x - vec2.x, vec1.z - vec2.z))));

        triangles[0] = 0;
        triangles[1] = 1;
        triangles[2] = 2;

        mesh.vertices = vertices;
        mesh.normals = normals;
        mesh.triangles = triangles;

        mf = GetComponent<MeshFilter>();
        mf.mesh = mesh;
    }

    float GetDir(Vector2 val)
    {
        if (val.y < 0)
        {
            return (Mathf.Atan(val.x / val.y) + 180);
        }
        else
        {
            return (Mathf.Atan(val.x / val.y) + 0);
        }
    }
}

But it still won’t generate anything.

EDIT: getting info from this:
https://www.youtube.com/watch?v=haelMvLyqDQ

Your code works, I checked. Make sure your object also has a component MeshRenderer.

1 Like

thank you I thought a mesh renderer was optional