How to build or rebuild a surface with pre-defined normals

Hello all, I am fairly new to grasshopper, though I’ve come to understand the basics well enough. I am trying to learn through what few resources I’ve found on the subject how to approach reverse engineering of forms to address environmental control systems in architecture, and right now I am focusing on a script for optimizing acoustics. The reduced script I have developed here generates panels that distribute sound evenly from a sound source over to a target surface, using planes that extrude downwards from a reflecting surface. I have generated a way of joining the surfaces to create a sort of wave pattern that is optimized for sound reflections, but I want to find a way of generating a continuous smooth surface that can do the same. As far as I can tell, the most straight-forward way to do this would be to somehow generate a surface or mesh which uses the vectors(which represent the reflection normal for each panel) as its normals. If I could calculate this curved surface using these predefined vectors as its normals, then in theory it would be able to evenly reflect sound from the source point to the target surface. From there, I could figure out optimizing for reflection times, reverb, etc. If I could get help figuring this out, I would really appreciate it. Doing something like this gives me ideas for a variety of different things, such as dealing with light reflections. I believe that the panels in Philharmonie de Paris work in a way similar to this.
Acoustics sharing file.gh (29.9 KB)


1 Like

You didn’t internalize your surfaces.

Sorry about that. I just updated it.

This is interesting.

Correct me if I am wrong, but i think problems like these are known to be an Optimal Transport problem. Python has some libraries that make come in use https://pythonot.github.io/. I’m interested if you can implement this

I looked into it, and I believe that finding a way to implement Sinkhorn might be the solution I’m looking for. Unfortunately, I’m not familiar with Python coding and my effort could only extend as far as Chatgpt could take me. As far as I could find, it seems that IronPython doesn’t support certain things involved with those modules, even after trying older versions of POT.

I did however discover something interesting that may or may not be a clue to figuring out this issue directly in grasshopper. I found that when I reflect points off of my initial reflecting panels, it generates points that can be made into a surface that by its nature seems capable of redirecting sound over my target surface. One picture shows how the points project from the reflecting panels shown at the bottom and are then scaled back upwards to create a smaller and more
usable surface. The other shows how the resulting surface reflects sound from the point source over my target surface. Given that this is only a roughly accurate result, does not use the precise normals I want, does not distribute evenly only to the target surface, and requires me to manually place the surface where I need it, this is not the solution I am looking for. The resulting form, however, is fairly close I believe to the result that I trying to get.



Acoustics sharing file2.gh (29.2 KB)

Its really quite a tease to see how simply that geometry is created, because I bet that it is mathematically a correct version of the shape I want. It seems that all the variables for the equation are present to produce the desired surface, though it seems there is something more complex to this concept that makes it unobtainable through typical grasshopper components or any plugins I’ve found. I think I may just begin studying some more reflection equations so I can write an expression in Grasshopper to do this.

Can you internalise the point data in the file, and resubmit the file. Just to double check what you have.

PS. Are you aware that there is the GH Python Remote component? May offer you some extended tools

1 Like

Here is the script with the main points internalized. And I’ll look into the GH Python Remote component that you mentioned, it looks like it would solve the IronPython limitation issue.
Acoustics sharing file2.gh (37.8 KB)