From Robinson projection map to globe (Geometry Nodes)
All of your meshes are composed of one big n-gon face. This can't work well with deformations. I won't be treating this problem, which isn't the initial question. Feel free to open another question about it.
I went a bit overboard and tried a mathematical approach. I'm using this Wikipedia article on Robinson projection as a reference. I've simplified the math behind it, so I'm not a 100% sure my solution is exact. Either way, it looks visually right.
1. Mathematical formulation
I won't go into much details, please refer to the wiki article. I've simplified as much as possible the 2 formulas for latitude and longitude.
- Latitude is simply equal (or proportionnal) to y-position on the map. In our case, meshes being upwards, it will be the z-position in the geometry nodes.
- Longitude needs the XY table to be computed. We'll see in the next section how to get it.
2. XY table
The Robinson projection uses an XY table. We are supposed to interpolate this table to get any value between 0° latitude and 90° latitude. If drawn as a graph, it would look something like that :
Conveniently, Curves in Blender can easily be interpolated by changing the curve type. No math required, which is nice. Keep in mind that this interpolation doesn't match what is usually recommended for this projection type.
So, we can build a Poly curve ("1" in next image) then change the curve type to obtain a smoother curve ("2" in next image). Below is a visualization just for 3 points.
3. Scene setup
First we want to follow this conditions :
- Center meshes on origin. We don't need to center along the y-axis, but we need to center the meshes along x and z axis. I've used an image as reference to align. X-axis should be aligned with the equator.
- Apply scale for all meshes : A, then Ctrl+A > Apply Scale.
- Apply rotation for all meshes : A, then Ctrl+A > Apply Rotation.
The meshes are ready, and we already know the maximum z positions (which correspond to the on-map y coordinate).
4. Geometry Nodes
Let's see first the latitude nodes. Note that we need to add the position of the current object to get a global position (from the origin of the scene). The idea is to map the global z-position to the latitude, which means in our case mapping as follows : $( -1.3 , 1.3 ) \rightarrow (\pi, -\pi)$.
Then for the longitude, it works the same way :
But we need to extract the X value from the XY table. The setup is as follows :
The left block generates the curve with the provided XY table, for 19 points. Then we set the x and y positions to match the XY table, and we change the curve type to Catmull Rom (feel free to experiment here, but I didn't see any difference on the final result).
The right block samples the curve at the exact current point. We again map the z position to the (0,1) interval, interval which is used as factor on the curve.
For the XY table, I've manually filled a Index Switch node from the wiki article.
We can finally create spherical coordinates based on the latitude and longitude (used as rotation). I'm starting with the vector (0,-1,0) and rotating it first along the x-axis (latitude), then along the z-axis (longitude)
I've linked both the scale and position to an empty Globe transform so that you can easily move and scale your globe.
5. Duplicate Geometry Nodes
You can copy the Geometry Nodes to all meshes as follows :
- Select all meshes A
- Have the mesh with the GN being active
- Copy to Selected
6. Final result and blend file
Here is a preview of the result, alongside the blend file. Let me know if something it not clear.
7. Unresolved issue
As said at the beginning, your meshes are bad for deformation. N-gon faces work for flat surfaces, but you need more geometry to have nice deformations. Here is an example where this is quite visible.
Blender can't know what should happen with the surface if there isn't any vertex besides the outer ones.
I encourage you not to try to solve this issue in this question. If you need help about it, open a new one.