Unity C# generated mesh is offset why is it not in the correct location?

c#, mesh, unity-game-engine

Solution

The hitpoints you're getting from the raycasts are global. You can either:

1) Make sure the mesh is in a gameobject that is positioned at 0,0,0. Whenever I create a dynamic mesh based on ray hitpoints I usually create a new parent-less gameobject at 0,0,0 and add the mesh to it. (instead of getting a container GameObject externally)

2) Call lightmeshholder.transform.InverseTransformPoint on the hitpoints from the raycast before building the mesh

Problem

I am attempting to generate a mesh in unity from script. The mesh is generated by raycasting out in a particular direction. Then getting the vertices from the hit point or from where the ray terminates. The mesh generates fine and is working well, however the mesh generates approximately 5 to 10 unity units above the location of the object with the attached script. I will attach me script below. ``` using UnityEngine; using System.Collections; using System.Collections.Generic; public class Torch : MonoBehaviour { public GameObject lightmeshholder; private int RaysToShoot = 128; private float distance = 50; private Vector3[] vertices; private Vector2[] vertices2d; private int[] triangles; private Mesh mesh; private Texture2D texture; private int screenwidth; private int screenheight; private int grab = 0; private RaycastHit hit; // Use this for initialization void Start () { screenwidth = Screen.width; screenheight = Screen.height; texture = new Texture2D (screenwidth, screenheight, TextureFormat.RGB24, false); vertices = new Vector3[RaysToShoot]; vertices2d = new Vector2[RaysToShoot]; triangles = new int[(RaysToShoot) +1 ]; mesh= lightmeshholder.GetComponent<MeshFilter>().mesh; } // Update is called once per frame void Update () { float angle =0; for(int i=0;i<RaysToShoot;i++){ float x = Mathf.Sin(0); x=-5; if(Input.GetKey(KeyCode.P)){ x = 5; } float y = Mathf.Cos(angle); if (angle <= 90){ angle += 2*Mathf.PI/RaysToShoot; } Vector3 dir = new Vector3(x,y,0); if (Physics.Raycast (this.transform.position, dir,out hit, distance)) { Debug.DrawLine (this.transform.position, hit.point,new Color(1,1,0,1)); Vector3 tmp = lightmeshholder.transform.InverseTransformPoint(hit.point); vertices2d[i] = new Vector2(tmp.x,tmp.y); }else{ Vector3 tmp = lightmeshholder.transform.InverseTransformPoint(this.transform.position + dir*distance); vertices2d[i] = new Vector2(tmp.x,tmp.y); Debug.DrawLine(this.transform.position,dir * distance,Color.red,0); } } // build mesh Vector2[] uvs = new Vector2[vertices2d.Length +1]; Vector3[] newvertices = new Vector3[vertices2d.Length+1]; for (int n = 0; n<newvertices.Length-1 ;n++) { if(n==0){ newvertices[0]=this.transform.position; newvertices[1] = vertices2d[0]; uvs[0] = new Vector2(this.transform.position.x,this.transform.position.y); uvs[1] = vertices2d[0]; }else{ newvertices[n+1] = vertices2d[n]; uvs[n+1] = vertices2d[n]; } if(n==0){ triangles[0] = 0; triangles[1] = 1; triangles[2] = 2; }else if(n<newvertices.Length/3){ triangles[n*3] = 0; triangles[1+n*3] = n+1; triangles[2+n*3] = n+2; } } Mesh mesh = new Mesh(); GetComponent<MeshFilter>().mesh = mesh; mesh.Clear(); mesh.vertices = newvertices; mesh.uv = uvs; mesh.triangles = triangles; mesh.RecalculateNormals(); } } ```

Original source