MOCAP PLUGIN

Členové týmu: Jan Keller, Ondřej Jamriška

Zadání

Navrhněte plugin pro aplikaci autodesk Motion Builder, který z velké části zautomatizuje čištění MoCap dat přenášených z aplikace Vicon IQ prostřednictvím formátu C3D. Vstupem bude import animovaných transformací markerů (reflexních značek), které budou odpovídat předem stanovené jmenné konvenci. Jmenná konvence by měla být konfigurovatelná. Výstupem bude korektně přiřazený objekt Actor, na který jsou v čase přenášeny transformace z markerů.

Rešerše

Stávající postup mapování markerů získaných z aplikace Vicon IQ na Actora v Motion Builderu je následující:

  1. Importování C3D souboru obsahující animované markery.
  2. Vložení Actora do scény.
  3. Změna polohy Actora(posun/rotace/změna velikosti Actora a jeho jednotlivých částí) tak, aby co nejvíce odpovídala rozmístění markerů ve scéně.
  4. Vytvoření množiny markerů.
  5. Editace vlastností markerů(nastavení stupňů volnosti, vytvoření rigidních těles ze skupiny markerů).
  6. Přiřazení jednotlivých markerů, nebo skupiny markerů odpovídajícím místům na modelu Actora.

Náš cíl:
Pomocí jazyka Python vytvoříme plug-in automatizující krok č.6. Plug-in bude obsahovat konfigurační soubor, kde bude možné měnit pomocí regulárních výrazů jmenné konvence. Pokusíme se též vymyslet způsob jak zautomatizovat krok č.3.

Studiem dokumentu Motion Builder 2011 SDK Help jsme dospěli k následujícímu postupu:

  • Získáme instanci scény pomocí scene = FBSystem().Scene.
  • Strukturu s optickými markery vybereme ze scény pomocí optical = GetOptical(scene).
  • K samotným markerům pak budeme přistupovat pomocí optical.Children.
  • Prvního actora ve scéně vybereme jako actor = scene.Actors[0].
  • Následně mu vytvoříme množinu markerů pomocí actor.MarkerSet = FBMarkerSet('markery').

Nyní máme přístup jak k optickým markerům tak k markerům actora a jejich napojení můžeme provést pomocí funkcí:

  • actor.MarkerSet.SetMarkerModel,
  • actor.MarkerSet.SetMarkerName a
  • actor.MarkerSet.SetMarkerUsed.

Implementace

Na základě našeho návrhu jsme v jazyce Python implementovali skript „bind_markers.py“. Účel skriptu je automatické napojení optických markerů na markery actora. Párovaní optických a actorových markerů se provádí podle uživatelem definováho vzoru. Tento vzor je vstup pro náš skript a je reprezentován seznamem dvojic (regulární výraz,identifikátor markeru). Optický marker jehož jméno vyhovuje danému regulárnímu výrazu je napojen na marker actora s daným identifikátorem.

Předpokládá se že uživatel vyvolá skript ručně v momentě, kdy už je do scény vložený actor a je zarovnaný s optickými markery. Seznam s párovacím vzorem je v tuto chvíli vepsán přímo do skriptu.

Vylepšená implementace

Prvotní implementaci jsme rozšířili o grafické rozhraní. Párovací vzor se načítá z jednoduchého textového souboru. Soubor je možno vybrat pomocí dialogu. Skript si pamatuje naposled vybraný soubor s párovací vzorem, a to i po ukončení a znovuspuštění MotionBuilderu. Napojení markerů se provádí nad aktuálně vybraným Actorem. Skript je možno vyvolat buď přetažením .py souboru do scény, nebo přímo z menu „Python Tools“ kliknutím na položku „Bind Opticals to MarkerSet“.

Vylepšená implementace je ke stažení v balíku bind_opticals.zip.

Screenshoty

Ukázka souboru s párovacím vzorem

example_map.txt
Head = .*hlava.*
Chest = .*hrudnik.*
Hips = .*(panev)|(bricho)|(trup).*
LeftCollar = .*l_rameno.*
RightCollar = .*r_rameno.*
LeftShoulder = .*l_paze.*
RightShoulder = .*r_paze.*
LeftElbow = .*l_ruka.*
RightElbow = .*(r_t_ruka)|(r_b_ruka).*
LeftWrist = .*l_zapesti.*         
RightWrist = .*r_zapesti.*
LeftHip = .*(l_koleno)|(l_stehno).*
RightHip = .*(r_koleno)|(r_stehno).*
LeftKnee = .*l_lytko.*
RightKnee = .*r_lytko.*
LeftFoot = .*l_chodidlo.*
RightFoot = .*r_chodidlo.*
LeftAnkle = .*l_kotnik.*
RightAnkle = .*r_kotnik.*

Co se nepodařilo

Během práce na rozšířené implementaci jsme se pokoušeli implementovat i automatické zarovnání actora s mrakem opticalů. Našim cílem bylo nalézt takovou affinní transformaci, která by minimalizovala vzdálenosti transformovaných pivotů Actora od korespondujících opticalů. Naše snaha ale selhala na tom že jsme pomocí MotionBuilder API nebyli schopni získat některé klíčové informace. Zejména šlo o výchozí lokální rotace jednotlivých částí Actora (chybějící metoda SetDefinitionRotationVector ve tříde FBActor).

Ke stažení

Skript bind_markers.py: bind_markers.zip
Testovací data: mocap_data.zip
Vylepšená implementace: bind_opticals.zip

Literatura

 
a4m39mma/7.txt · Poslední úprava: 2010/12/11 12:20 (upraveno mimo DokuWiki)
 
Kromě míst, kde je explicitně uvedeno jinak, je obsah této wiki licencován pod následující licencí: GNU Free Documentation License 1.3
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki