Hey guys, I am looking to find the direction the mesh is facing at a point so I can spawn objects on it properly.
I tried to find the normals along the mesh verticies but that was no help, my attempt:
Mesh mesh = obj.GetComponent<MeshFilter>().mesh;
Vector3 normals = mesh.normals;
var triangles = mesh.triangles;
for (int i = 0; i < normals.Length; i++)
//GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
//cube.transform.position = mesh.vertices;
P1 = normals[triangles[triangles _* 3]];_
P2 = normals[triangles[triangles * 3 + 1]];
P3 = normals[triangles[triangles * 3 + 2]];
faceNormal = ((P1 + P2 + P3) / 3);
Thanks for your help!
Hi, your code is nearly correct! You need to iterate on the faces,not on the normals: change the “for” to go from 0 to (triangle.Length / 3), and with increment “i += 3” to iterate triangle by triangle (as each triangle is composed of 3 indexes to 3 vertices/normals/uv etc…)
Then, for each triangle, you will want to get the average of the 3 normals using
faceNormal = (normals[ triangle[i+0] ] + normals[ triangle[i+1] ] + normals[ triangle[i+2] ]) / 3.0f;
Then, as this “average” is an approximation, you’ll need to re-normalize the result using faceNormal.Normalize().
In fact, the result will not always be correct. It depends how the normals are defined = if the object is a smooth sphere it should be ok, but it will not work with all kind of geometry (imagine a cube with half of the vertices with “smooth” normals and the other half with normals perpendicular to each faces)
To have safer result, I suggest you compute the normal using the face vertices + a cross product: there is some documentation about this here: http://docs.unity3d.com/Manual/ComputingNormalPerpendicularVector.html. The code to do this is quite similar to the one here.
Edit: check this post: http://forum.unity3d.com/threads/how-do-i-get-the-normal-of-each-triangle-in-mesh.101018/