How to read the normal of a mesh in Grasshopper in C#, and flip the mesh if the normals are facing the wrong way.
Creating city buildings in Rhino
I recently revisited the task of generating cities in Rhino using Elk. One of the problems with this original solution was that I had no fast way of generating the roofs of the buildings. The most obvious solution to generate the building roofs was to use the ‘patch’ function of Rhino using the building outline as input. But surfaces are data- and processor-heavy, and files at the city scale would crash the computer. So I left the roofs out…
Meshes are much lighter data structures than surfaces, and should be used where possible where performance is an issue. In this post, meshes were created by casting curves to meshes.
This works well, but the output meshes do have rendering issues. All mesh faces have a direction (a front and a back) and Rhino renders the mesh differently depending on what side it thinks it’s looking at. It is apparently quite random whether the above meshing trick generates a mesh which faces upwards or downwards.
Flip backwards meshes
The solution is to ‘flip’ the offending meshes so that all meshes are facing the same way. The challenge lies in detecting the meshes which are facing the wrong way, and then to find a way to flip these meshes. The tidiest way is to do this with a C# component.
private void RunScript(object x, object y, ref object A)
Mesh mesh = (Mesh) x;
for(int i = 0; i < mesh.Faces.Count; i++)
var normal = mesh.Normals;
if(normal.Z < 0)
mesh.Flip(true, true, true);
A = mesh;
The result is that the roofs now are all the same colour. The red lines, representing the normals of the mesh faces, are all now facing the same direction.