I've generated a 'planet' using the ANT landscapes add-on. The exact parameters don't really matter, but suffice to say that it's visually a UV sphere mesh with vertices pushed from the center to varying heights. There is a copy of the object that has had all the 'ocean' faces removed.
Project the globe onto some sort of map (the cartography kind). I'd love to have one of the (more) standard map projections, like a Winkel tripel projection or one of the really cool looking ones, like a Dymaxion or a Waterman butterfly, but I'm really just trying to get it to work.
After fooling around with modifiers until my eyes hurt, I finally decided to just bash out the following spaghetti code:
import bpy from math import * def map_sphere(bpy_obj): vert_cnt = len(bpy_obj.data.vertices) coord = *vert_cnt*3 bpy_obj.data.vertices.foreach_get('co',coord) for i in range(vert_cnt): x,y,z = coord[3*i:3*i+3] p = sqrt(x**2 + y**2 + z**2) phi = acos(z/p) theta = asin(y/(p*sin(phi))) coord[3*i:3*i+3] = [phi,theta,p] bpy_obj.data.vertices.foreach_set('co',coord)
Basically, flop the vertices into spherical coordinates and map the spherical coordinates back into the object according to ($\phi$->x, $\theta$->y, $\rho$->z). It's pretty simple, but I'm running into a few key issues:
- Huge amount of distortion around the poles
- Weird scaling factors in the X and the Y directions
- Points on the poles are unmappable. (solved by deleting them.)
Is this the best way of doing this? I feel like it's far too roundabout and there's probably some obvious solution.
If this is the best way of doing this, then how can I reduce the distortion around the poles and/or are there other easily programmable mapping schemes besides equirectangular?
Additional troubleshooting done since posting
I took a simple UV sphere and applied the program to it. The end result was a mesh with two layers literally in the same place. Perhaps I should simply cut my mesh in half and operate on each half separately?