How could one unwrap/morph/project a complex 3D mesh to a flat surface?
This script can help you to prepare the animation:



The script should be run in object mode.

The script will report UV map coordinates into a shape key, so that you can animate the shape key.

You need to prepare the mesh: mark seams and make your UV map (you may need to move rotate, scale the uv isles as you wish). If you modify the UV map, run the script again so that the shape key will be updated.

The seams are important because the script will use them to split the original mesh (so your mesh will be modified by the script).

These splits are done because we want each vertex to have only one correspondent uv vertex in the uv map.

It is commented, below, but if some more details are needed, please ask:

import bpy
import bmesh
from mathutils import Vector

print( "------------" )

shape_key_name = "test"
object_name = "Suzanne"
uv_map_name = "UVMap"

obj = bpy.data.objects[object_name]

# Prepare the shape keys

if not obj.data.shape_keys:
    obj.shape_key_add( name = "Basis" )

shape_key = obj.data.shape_keys.key_blocks.get( shape_key_name )

if shape_key:
    obj.shape_key_remove( shape_key )

shape_key = obj.shape_key_add( name = shape_key_name )

# Cut the mesh

# Get a bmesh from the object mesh
bm = bmesh.new()
bm.from_mesh( obj.data )

# Prepare the mesh
bm.verts.ensure_lookup_table()
bm.edges.ensure_lookup_table()
bm.faces.ensure_lookup_table()

# Split edges that have seam and link to 2 faces
edges = [e for e in bm.edges if e.seam and len(e.link_faces) == 2]
bmesh.ops.split_edges( bm, edges = edges )

# Give the new geometry back to the object
bm.to_mesh( obj.data )

# Get the uv map
uv_map = obj.data.uv_layers[uv_map_name]

# Assign the coordinates to the shape key
for loop, uv_data in zip( obj.data.loops, uv_map.data ):
    uv = uv_data.uv
    vertex_index = loop.vertex_index
    shape_key.data[vertex_index].co = Vector( (uv.x, 0, uv.y) )