3D Forum > Cinema 4D (Baukasten Charakter animieren/riggen)

Cinema 4D (Baukasten Charakter animieren/riggen)

22.06.2012 02:54
 
EternalPainFr. 22 Jun. 2012, 02:54 Uhr
Cinema 4D (Baukasten Charakter animieren/riggen)

Ich habe folgenes Problem,
Ich habe ein joint-skelett für ein 'Baukasten' Charakter,
dieser enthält bereits passend vorgefertigt alle Joints für
jede mögliche interaktion mit dem aus dem Baukasten erstellten
Charakter...

Nun zu den Charakter, der besteht aus verschiedenen teilen eben
so das man ihn verhältnismässig individuell gestalten kann, kopf,
arme, füsse, ober-/unterkörper, verschiedene kleidung, waffen ect...

Aus logischen gründen sind daher im skellet keine Weights bei den Joints

Die Weights sind in den jeweiligen Modelteilen

Also ein Modelteil in C4D ist ein Array/Nullobjekt, das bereits richtig positioniert ist und beinhaltet das/die Mesh(es) sowie die Joints (Jointnamen) die dann vom
Skelett beinflusst werden/werden sollen, diese haben aber nur position (0,0,0) und haben NUR die Weight informationen die das skelett braucht um die teile zu 'bewegen'

Nun die Frage, wie kann ich die Bewegungsjoints vom Skellet mit den WeightJoints vom Model verbinden/verschmelzen das daraus EIN joint (also der skelletjoint) wird der dann die richtige position vom skelett als auch die weight information vom model enthält???



Hier ein kleiner screenshot, links im Bild sieht man die Objekte die bereits Joints und Weights beinhalten, rechts habe ich dann das skelet geladen, wo ich nun die Model Joints mit den Skelett Joint 'verbinden' möchte

Für jede Hilfe dankbar smile


Das hilfreichste Tutorial das ich zu den Thema finden konnte bisher, war das hier:
http://www.youtube.com/playlist?list=PL37295E49564BF9D3&feature=plcp

Leider hilft mir das so auch nicht bei dem Problem
gruss
mp5gosuFr. 22 Jun. 2012, 09:34 Uhr
Das ist nicht ohne weiteres möglich.
Das hat folgenden Grund: Pro Polyobjekt hast Du eine bestimmte Anzahl Punkte. Jeder dieser Punkte hat einen Index, damit C4D die Punkteverknüpfungen usw. intern regeln kann.

Verbindest Du nun 2 Objekte, stimmen die Indizes nicht mehr. Diese werden jedoch verwendet, um die Wichtungen festzulegen und den einzelnen Verts zuzuordnen.

Die beiden einzigen Möglichkeiten, die ich da sehe:
1.) VAMP - Wichtungen übertragen (s. Hilfe). Dürfte aber eher unzuverlässig sein.
2.) Neu wichten. Die einfachere Methode. Das Model sieht auch so aus, als würd's recht schnell und einfach gehen. Vorteil: Es funktioniert. smile
EternalPainFr. 22 Jun. 2012, 10:35 Uhr
Das hat folgenden Grund: Pro Polyobjekt hast Du eine bestimmte Anzahl Punkte. Jeder dieser Punkte hat einen Index, damit C4D die Punkteverknüpfungen usw. intern regeln kann.


Das mag ja richtig sein, aber was hat es mit dem Problem ansich? Ob ich ein Mesh, eine Meshgruppe habe und wieviele vertices die haben sollte ziemlich egal sein und sollte ein Joint erstmal nicht interessieren....
Aus diesem Grund sind ja bereits Joints mit im Nullobjekt drin, die die notwendige Wichtung für genau dieses Mesh bzw Meshgruppe enthält... Das Mesh ist mit denen verbunden und wenn ich diese selektiere kann man sehen das diese ordentlich gewichtet sind... (haben aber alle 0,0,0 als position)

VAMP hab ich probiert, scheint als würde da NICHTS passieren, sieht nicht aus als würde da ein austausch stattfinden, mag aber sein das ich was falsch mache dabei...

Neu Wichten hab ich mal versucht, ist aufwendig und das ergebnis ist unschön bisher, ausserdem
sollte genau diese arbeit ja erspart bleiben (letztenendes brauch ich nur die animationsdaten vom skelett)

Ein weiterer Gedanke kam mir als ich mir ein Basics Tutorial über XPresso angesehen habe, da lassen sich eine Menge verschiedenster Daten 'übergeben' gäbe es da nicht eine möglichkeit evtl?

Eigentlich möchte ich nur das fertige skelett mit der figur nutzen um Animationsphasen zu erstellen und zu sehen wie sich diese auf mein Charakter auswirken, später will ich dieses
Skelett und die erstellten animationsphasen in meiner eigenen Anwendung eben wieder geneu so mit diesen Charakterteilen 'zusammensetzen'

Ich kann doch nicht für jeden 'versuch' einer Animation neu wichten, obwohl alle notwendigen Daten doch da sind, sie müssen nur richtig zusammengefügt werden, kann doch nicht so schwer sein, nach 2 Tagen versuchen googlen, lesen, tutorials gucken fang ich an an der leistung von C4D zu zweifeln....

Wenn ich meine Objekte mit den Skelett verbinde müssen doch nur die Wichtungen mit übernommen, übergeben oder verlinkt werden....



mp5gosuFr. 22 Jun. 2012, 15:46 Uhr
Ach, da hab ich mich verlesen. Dachte, Du willst vorher alles zu einem Objekt verbinden. Sorry. Dann bringt ja auch Vamp nichts.

Wenn ich Dich richtig verstehe, willst Du also einfach nur ein Mocap-File auf Dein bestehendes Rig übertragen?
Dann nimm einfach Constraints.
Retarget fällt aus, da die Hierachie zu stark abweicht.
EternalPainFr. 22 Jun. 2012, 19:39 Uhr
Ich habe doch schon ALLE daten da -.-
EIN OBJEKT -> Screen


Enthält das Mesh sowie die Joints mit identischen Namen wie die Joints im Skelett
Nur sind im Objekt keine Hierachie und die Joints haben NUR die Wichtung!!!

Hier hab ich das Skelett


Die Wichtung von den Joints aus 'Objekt' müssen nun NUR auf dieses Skelett übertragen werden

Ich weiss nicht was, wie und wo ich noch fragen könnte, es is nu der dritte tag, alle daten sind da und bewegen tut sich nichts, keine hiflreichen tutorials, keine hilfreichen tipps zu finden

langsam ist es zum verzweifeln...
TilesFr. 22 Jun. 2012, 20:46 Uhr
Ich kenne mich halt in Cine nicht aus. Aber hat das nicht auch Vertexgruppen fürs Weighting? Kann man die nicht irgendwie anders verlinken?
mp5gosuFr. 22 Jun. 2012, 23:23 Uhr
Ich glaub, so langsam versteh ich.
Die Joints von "Objekt" liegen alle bei [0,0,0]. Das macht faktisch schon mal keinen Sinn.
Zuerst musst Du die entsprechenden Joints genau an dieselben Positionen wie die ausm Skelett setzen.
Die Hierarchie sollte hierbei egal sein.

Dann kommt VAMP zum Einsatz. Bei der Evaluierung musste dann halt sehen, was am besten funktioniert. "Nearest Surface" o.ä. bringt mMn. die besten Ergebnisse. (Deshalb müssen auch die Joints mit den Wichtungen vorher an die korrekte Stelle verschoben werden - auch auf die Ausrichtung achten!)

Dann lassen sich die Wichtungen recht einfach übertragen.

Alternativ (weiß aber nicht genau, ob das noch geht) kannst Du auch einfach das Skin-Objekt bzw. die betroffenen Jointverknüpfungen austauschen (vorher auch die Joints an die entsprechenden Positionen setzen).
Das genügt eventuell, denn dann sollten die Wichtungen automatisch übernommen werden, lediglich die Joints müssten dann in der Hierarchie ausgetauscht werden. Macht vielleicht ein wenig mehr Arbeit, ist aber zuverlässiger.

So. Hoffe, ich habs jetzt gerafft. smile


P.S.: Das Skelett, ist das eigentlich ein Mocap-File? Falls ja, dann wurde das falsch importiert.
EternalPainFr. 22 Jun. 2012, 23:33 Uhr
Nein das ist ein 'externes' Format (Binary Skeleton) ebenfalls die Objekte die per PlugIn eingelesen werden konnten...

ABER, erstmal danke für Deinen Vorschlag, auch das werde ich mal in erwähgung ziehen... bin aber doch nach endlosen probieren (und fluchen) einer Lösung 'nahe' (glaube ich)

Ich habe folgenes gemacht, ich wähle den Joint aus dem Model (mit der korrekten wichtung) und üebergebe diesem das Charakter Tag "Constraint' -> bei Basis 'Überobjekt' und dann im Überobjekt-Tab als Ziel den jeweiligen Joint im Skelett

Hab mit der Methode jetzt erstmal ein paar Joints 'übergeben' und jene die übergeben wurden lassen sich mittels dem Skelett nun richtig drehen und bewegen...

Jetzt nächster schritt... ich habe hier knapp 200 Bones, manche mehrfach vergeben (je nach objekten)
Kann man mittels Python/COFFEE/XPresso irgendwie was machen das er diese Operationen auf alle Automatisch zuweist? es muss ja im prinzip nur der Jointname vom Model mit den Jointnamen im Skelett 'verglichen' werden wenn gleich dann Operation so ausführen.. Tag setzen, überobjekt, ziel...

Das wäre dann genau das um anständig arbeiten zu können
EternalPainSa. 23 Jun. 2012, 07:10 Uhr
Nach über drei Tagen (oder waren es mehr nächte)
Hab ichs dann doch noch geschafft (und nebenher auch noch etwas Python gelernt)

[code]
#1019364 //Contraint Expression
#1018074 //Constraint
import c4d
#Welcome to the world of Python
from c4d import BaseTag

global skelettname
global meshname

def nextjoint(joint):
if joint == None:
return None
if joint.GetDown():
return joint.GetDown()
elif joint.GetNext():
return joint.GetNext()
else:
while 1:
joint = joint.GetUp()
if joint.GetNext():
return joint.GetNext()


def findjoint(jointname):
skelettname = "Bip01" #op.GetName()
skelett = doc.SearchObject(skelettname)

joint = skelett

while 1:
joint = nextjoint(joint)
if joint != None:
#print joint.GetName()
if joint.GetTypeName() == "Joint" and joint.GetName() == jointname:
return joint
else:
break

def main():
pass #put in your code here
c4d.StopAllThreads()

meshname = doc.GetActiveObject()
meshname = meshname.GetName()

#"Hands" #c4d.gui.InputDialog("Meshname")

mesh = doc.SearchObject(meshname)
if mesh != None:
mesh = mesh.GetDown()

while mesh != None:
while 1:
if mesh != None:
if mesh.GetTypeName() != "Joint":
mesh = mesh.GetNext()
else:
break
else:
break

if mesh != None:
if mesh.GetFirstTag() == None:
#print mesh.GetName()
bone = findjoint(mesh.GetName())

print mesh.GetName()
print bone.GetName()

# Add Tag
NewTag = c4d.BaseTag(1019364) #1019364 //Contraint Expression
NewTag[c4d.ID_CA_CONSTRAINT_TAG_PARENT]=True
mesh.InsertTag(NewTag)
NewTag[30001] = bone #30001 Target/Ziel
NewTag[30004] = True #// Pos ON
NewTag[30005] = True #// Scale ON
NewTag[30006] = True #// Rot ON
else:
#print "allready set"
break
else:
print "No Joint Found."

mesh = mesh.GetNext()
[/code]

Ist noch nicht sehr schön gelöst aber mit dem Skript geb ich die kontrolle ans skelett und kann endlich mit Animieren anfangen (oder es wenigstens mal probieren)
 

 


 
 
© 3D-Ring - deutsche 3D Software Community, Archiv 2001 - 2006