SkinnedMesh & 3dsmax exporter



  • Hi Leute!

    Ich hab hier ein relativ heftiges Problem mit dem erstellen meines eigenen Model-Formates.
    Derzeit läuft das so ab:

    ---3dsmax---
    Im Exporter werden relative Bonematrizen ( = relativ zum Parentbone ), die für SkinnedMesh benötigt werden, exportiert.

    ---meine engine----
    Hier wird die Datei eingelesen, korrekt eingelesen wohlgemerkt. Dann werden, wie bei Skinned Mesh üblich, die realtiven BoneMatrizen multipliziert ( absoluteBoneMatrix = absoluteParentMatrix * realtivBoneMatrix ).
    Die entstehende absolute BoneMatrix ( die auch animationen enthält ) wird dann mit der inversen absoluten BoneMatrize multipliziert. Die entstehende Matrize wird dann mit den Koordinaten der Vertices multipliziert. Ganz einfach oder? 😃
    Wenn keine Animation stattfindet gibt das ganze dann eine Einheitsmatrize, es findet also keine Translation der Vertices statt. Aber während eine Animation verschiebt sich dann das ganze, aber falsch. Normalerweise sollten sich die Vertices bei einer Rotation des zuhgehörigen Bones um dessen Standpunkt drehen, stattdessen drehen sie sich aber um den Weltkoordinatenursprung (0,0,0)

    So meine Frage nun: Was mach ich falsch.

    mfg Zacharias

    PS: ich weiß, das is ein bisschen viel und kompliziert.... 🙄


  • Mod

    vielleicht multiplizierst du die matrizen in der falschen reihenfolge.

    rapso->greets();



  • Nein sie werden in der richtigen Reihenfolge multipliziert. Das Problem wird irgendwo bei den Matrizen der Animation zu finden sein, aber ich weiß nicht wo.



  • Zacharias schrieb:

    Nein sie werden in der richtigen Reihenfolge multipliziert. Das Problem wird irgendwo bei den Matrizen der Animation zu finden sein, aber ich weiß nicht wo.

    Du bist dir auch sicher, dass du vor dem drehen, die Objekte immer wieder auf
    den Punkt (0|0|0) verschiebst?



  • Nein daran wird es nicht liegen. Hier mal ein Codeschnippsel wo du den Fehler vermutest, vielleicht fällt euch was ins Auge:

    // Die Funktion ist rekursiv, wird also für jedes Bone angewendet
    // bone->pParent->matAbsolute ist beim ersten Durchgang die Weltmatrix
    D3DXMATRIX matTemp; //DirectX Matrixklasse
    matTemp = bone->matRelativ * bone->Animation.GetMatrix(Time); // Animation.GetMatrix(Time) gibt die Rotationsmatrize zurück, die Animation also
    bone->matAbsolute = matTemp * bonde->pParent->matAbsolute;
    // Nun wird zum Child weitergegangen also: bone=bone->child;
    // Danach wird wie oben fortgefahren, bis zum letzten bone
    


  • Also zwei Dinge:

    1.) Was ist bone->matRelativ? ist das nicht das gleiche wie bonde->pParent->
    matAbsolute?

    2.) Warum machst du das alles per Matrizen? Du kannst doch auch Koordinaten-
    systeme für jedes Child erstellen. Da gibt es Formeln aus der Roboterforschung.
    Hab leider gerade keine Zeit, sonst würde ich dir das raussuchen. Such mal
    nach Koordinaten, Roboter, Gelenke, etc.



    bone->pParent->matAbsolute is die Absolute matrix des Parent.
    bone->matRelativ ist die Matrize dieses bones relativ zu bone->pParent->matAbsolute

    2. Könnte ich, aber Matrizen sind schneller und somit effizienter. Alle Daten bekomm ich von 3dsmax als Matrizen, DirectX braucht wiederum auch nur Matrizen. Da wäre es nur umständlich die Matrizen aufzulösen, mit Koordinaten etc rechnen und dann das ganze wieder in ne Matrize umzuwandeln.



  • Gibts denn niemanden der mir helfen kann/will ????


Log in to reply