Reversed engineered reflections

This is the result of a Grasshopper program that I wrote to reverse engineer the reflection of an object from a curved mirror. I wanted to make a distorted object whose reflection in the curved mirror looked normal. Fun to work on. The brass colored object and distorted blue box in front of the mirror are 3D shapes and can be 3D printed.



I figured out how to reflect solids by reflecting the control points of the individual surfaces that make up a solid (BREP).


Fun. I still wonder how your workflow is de-reflecting each control point.

Attached is the Grasshopper definition and a Rhino file with a double curved mirrored surface and a torus to reflect.

First, the object whose shape you want to morph is placed behind the mirror, on the opposite side from the viewer. Basically what the program then does is to draw a line between each surface control point and the cameras target point. Each of these lines is intersected by the curved mirror surface. From the intersection point a plane is constructed normal to the surface. That plane is then used to reflect the original control point. The points are then reconstructed back into surfaces. The surfaces are finally grouped back together to form the new, warped shape.

There are three inputs you need to make. One for the mirror surface, one for the object you want to reflect and a boolean switch to set the camera target point. The switch is very important since the reflections are very view dependent. You have to set the switch every time you move the view. It would be nice to figure out how to get the camera target point to update automatically.

The slider up front is used to control the number control points for each of the BREP’s surfaces. More points make for a better looking reflected solid but sometimes too few as well as too many seem to cause problems.

There is a definite relationship between the mirror, the geometry and the camera location in order to make it work. I usually go through a lot of iterations to get a decent shape for a result. It is real easy to get something that either doesn’t work at all or to miss judge what the reflection really looks like. I have found the the objects distance from the mirror is crucial as well.

My computer is powerful enough to allow me to adjust the mirror shape and the objects location real time while the grasshopper program is working. This can really be helpful trying to get a usable output.

Enjoy and let me know what you come up with, especially any improvements to the Grasshopper definition.

Reversed Reflections for Solids.3dm (14.1 MB) Curved Mirror Reflections of Solid (14.0 KB)


Hi Chris! This is really interesting. I am doing a project modelling distorted object in real life that looks normal in a convex mirror, so this is exactly what i need! However, when i try to run the grasshopper script you sent, one battery has a fault.

I really wish I could help but I have no idea what the error message means. Sorry.


No worries! Did this also appear when you were running the script? I wonder whether it has to do with different versions of software. May I ask what versions of rhino and grasshopper and pufferfish you used?

It’ not an error I have seen before. I used Rhino 7 and the latest version of Grasshopper and Pufferfish at the time I made the program.

Sorry I can’t help.


Thank you for replying. I will try to figure out.

Please let me know what you find out.


I have found out the problem. It is really stupid but I put the camera and the object on the same side.

Funny but good to find it was a simple mistake :grinning: