Sorry about the delay, I wanted to check with Ubisoft's management before sharing more stuff! Turns out they're fine with it.
Yep. Ubisoft's cinematic team used it for morph targets, FarCry2 artists used it for modeling and I use it myself for skinning. It's very handy.
I usually start my scripts by figuring out the easiest way to get that result manually. To snap 2 objects manually I'd always start by finding a vertex that is obviously in the same topological position on both mesh, like the tip of their noses. On object 1 that vertex might connected to a few edges like this:
Edge1 = Up
Edge2 = Down
Edge3 = Left
But on the second model the same vertex might be connected like this:
Edge3 = Up
Edge1 = Down
Edge2 = left
At this point it is rather easy to figure out which edges are related, even if their vertices don't share the same index or even if they are not anywhere near each others... I just snap edges based on their angles. The newly snapped vertices are turned into new starting points and I can keep doing this until everything has been snapped. That's it. The scale or the position of each object is irrelevant since I only care about topology and edge flow. The script works like that because thats how I do it myself.
In a script you can find angle of an edge like this:
normalize(Vertex1.pos - Vertex2.pos)
And you can find if 2 angles are similar by doing a dot product:
(dot Angle1 Angle2)
You should get a number somewhere between -1.0 and 1.0 where:
1 = The angles are identical
-1 = The angles are opposite
That's pretty much all the math you need. In my script I ask the artist to pick starting vertices himself, so all I have to do is grab the list of edges that are connected to them, find their angles and match them to the other object's based on which angles are closest. There's also some stuff to workaround small difference in topologies but nothing fancy. Vertices that are not connected to the same number of edges on both models are simply skipped so the script usually 'wrap' around them. It works really well right now, but perhaps the system could be improved even more by also using the concept of edge rings & edge loops?
I have a confession to make :scared: In my presentation it looks like the 'smart symmetry' takes like 5 seconds to run on a rather high-resolution head. It does run that quickly on in-game characters, but on high-res data it takes a minute or two. So the results are real but I shortened the 'processing time' for that one; I couldn't wait that long with only 30 minutes to show everything.
edit: MoP I'll answer your questions later after work