Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

11

29.09.2014, 16:02

Hast du mal die Multiplikationsreihenfolge vertauscht?

12

29.09.2014, 16:24

Hast du mal die Multiplikationsreihenfolge vertauscht?

Ja, aber wahrscheinlich die falsche...

Ich habe keine Ahnung, was ich da jetzt gemacht habe, aber es funktioniert nicht. Ehrlich gesagt habe ich einfach nur alles ausprobiert, was vielleicht hätte funktionieren können. Jetzt sind zwar nicht mehr alle Knochen ineinander, aber richtig ist das immer noch nicht. Die Knochen sind jetzt irgendwo, aber nicht da, wo ein Mensch sie haben sollte...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
FbxTime currTime;
currTime.SetFrame(j, FbxTime::eFrames24);

currBone->AnimationArray[i].KeyFrameArray[k].FrameNumber = k;

FbxVector4 Rotate, Scale, Translate;
                    
FbxAMatrix currentTransformOffset = Node->EvaluateGlobalTransform(currTime) * GetGeometryTransformation(Node);
FbxAMatrix GlobalTransform = currCluster->GetLink()->EvaluateLocalTransform(currTime);

                    
if (currBone->Parent){
    GlobalTransform = GlobalTransform*currBone->Parent->AnimationArray[i].KeyFrameArray[k].GlobalTransform;
}
else{
    GlobalTransform = currCluster->GetLink()->EvaluateGlobalTransform(currTime);
}

currBone->AnimationArray[i].KeyFrameArray[k].GlobalTransform = GlobalTransform;

GlobalTransform = currentTransformOffset.Inverse()*GlobalTransform;
                    
                    

Rotate = GlobalTransform.GetR();
                    
currBone->AnimationArray[i].KeyFrameArray[k].Rotate.x = Rotate.mData[0];
currBone->AnimationArray[i].KeyFrameArray[k].Rotate.y = Rotate.mData[1];
currBone->AnimationArray[i].KeyFrameArray[k].Rotate.z = Rotate.mData[2];
                    
Scale = GlobalTransform.GetS();
                    
currBone->AnimationArray[i].KeyFrameArray[k].Scale.x = Scale.mData[0];
currBone->AnimationArray[i].KeyFrameArray[k].Scale.y = Scale.mData[1];
currBone->AnimationArray[i].KeyFrameArray[k].Scale.z = Scale.mData[2];

Translate = GlobalTransform.GetT();
                    
currBone->AnimationArray[i].KeyFrameArray[k].Translate.x = Translate.mData[0];
currBone->AnimationArray[i].KeyFrameArray[k].Translate.y = Translate.mData[1];
currBone->AnimationArray[i].KeyFrameArray[k].Translate.z = Translate.mData[2];

                    

k++;


Wichtig ist eigentlich nur, dass Rotate, Scale und Translate stimmen, denn die werden ja beim Animieren zum Berechnen der jeweiligen Bone-Matrix genutzt.
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

13

29.09.2014, 16:31

Anstatt im Dunkeln zu stochern und uns mit Code zu überhäufen (den eh niemand liest), bau dir lieber - wie dir schon empfohlen wurde - ein paar einfache Testszenarien.
Z.B. ein langer Zylinder mit vielen Bones in einer Kette. Da kannst du einfacher sehen, was schief läuft.

14

29.09.2014, 16:51

Anstatt im Dunkeln zu stochern und uns mit Code zu überhäufen (den eh niemand liest), bau dir lieber - wie dir schon empfohlen wurde - ein paar einfache Testszenarien.
Z.B. ein langer Zylinder mit vielen Bones in einer Kette. Da kannst du einfacher sehen, was schief läuft.

Wenn ich mit Blender umgehen könnte, würde ich das ja machen, aber ich habe das Modell auch nur zugeschickt bekommen...

Blender lädt das Modell auch nicht korrekt... Toll...

Wenn ich herausfinde, wie ich in Blender eine Animation auswählen kann, würde ich zumindest mal probieren, ob die in Blender abgespielt wird... Das probiere ich gleich mal...

Edit: Ich glaube, Blender lädt die Animation nicht einmal. Sie müsste aber eigentlich da sein.

Und wie soll mich das weiterbringen, das mit einem Zylinder zu probieren, wenn eh etwas Grundlegendes nicht stimmt und ich nicht weiß, welche Matrizen ich denn jetzt brauche?
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Magogan« (29.09.2014, 16:57)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

15

29.09.2014, 17:11

An einem Zylinder (stell ihn dir als "Tentakel" vor) kannst du viel einfacher sehen, was schief läuft, als an einem so komplexen Objekt wie einem Menschen.
Achte darauf, dass der Zylinder entlang seiner Längsachse ausreichend unterteilt ist, sonst klappt das Skinning natürlich nicht.

16

29.09.2014, 17:44

Na ja, ich sehe ja jetzt schon, dass im Prinzip alles richtig ist bis auf die Position der Knochen. Das Rendern der gewichteten Vertexe funktioniert jedenfalls. Wenn ich eine feste Matrix für alle Bones nehme, bekomme ich sogar einen Menschen, der aus irgendeinem Grund auf dem Rücken liegt (bzw. eigentlich auf dem Bauch, weil gedreht). Jedenfalls sehe ich genau das, was ich auch nach dem Import in Blender sehe, abgesehen davon, dass ich in Blender auch Texturen sehe und da das Modell nicht Kopf steht.

Sobald ich aber irgendwie eine Animation zum Modell hinzufügen will, ist es plötzlich in der gleichen Ausrichtung wie die Unterwäsche des Modells und auch in der richtigen Größe, nur die Position der Körperteile stimmt nicht.

Soweit bin ich schon. Nun muss ich nur noch die Körperteile an der richtigen Position platzieren und da weiß ich nicht weiter. Ob das Modell nun ein Zylinder oder ein Mensch oder ein Drache ist, ist dafür vollkommen irrelevant.
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

17

29.09.2014, 18:39

Ob das Modell nun ein Zylinder oder ein Mensch oder ein Drache ist, ist dafür vollkommen irrelevant.
Das ist glaub ich aber einfacher zu überschauen, wenn du einen langen Zylinder hast! Denn wenn du nur auf eine "Stange" aufpassen musst, kannst du viel leichter erkennen, wohin sich der Bone mit Mesh fälschlicherweise gedreht/verschoben hat. Bei einem Menschen mit Armen und Beinen, hast du nich viel mehr Bones und auch das Mesh ist viel komplizierter - du kannst nicht so einfach erkennen, wo dem Typen jetzt der Arm hängt oder wie das gedreht ist... ;)

Auch das mit der Hirarchie lässt sich an einer Stange vielleichter austesten, als bei einem Menschen mit vielen komplizierten Abhängigkeiten!
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

18

29.09.2014, 18:50

Ob das Modell nun ein Zylinder oder ein Mensch oder ein Drache ist, ist dafür vollkommen irrelevant.
Das ist glaub ich aber einfacher zu überschauen, wenn du einen langen Zylinder hast! Denn wenn du nur auf eine "Stange" aufpassen musst, kannst du viel leichter erkennen, wohin sich der Bone mit Mesh fälschlicherweise gedreht/verschoben hat. Bei einem Menschen mit Armen und Beinen, hast du nich viel mehr Bones und auch das Mesh ist viel komplizierter - du kannst nicht so einfach erkennen, wo dem Typen jetzt der Arm hängt oder wie das gedreht ist... ;)

Auch das mit der Hirarchie lässt sich an einer Stange vielleichter austesten, als bei einem Menschen mit vielen komplizierten Abhängigkeiten!

Schon klar.

Was mir fehlt, ist die Matrix für die Transformation von einem Knochen zum Eltern-Knochen.

Aus einem Tutorial (http://www.gamedev.net/page/resources/_/…atrices-r3577):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
struct Frame {
    string Name; // the frame or "bone" name
    Matrix TransformationMatrix; // to be used for local animation matrix
    MeshContainer MeshData; // perhaps only one or two frames will have mesh data
    FrameArray Children; // pointers or references to each child frame of this frame
    Matrix ToParent; // the local transform from bone-space to bone's parent-space
    Matrix ToRoot; // from bone-space to root-frame space
};


Die Frage ist jetzt, wie ich die Matrix ToParent berechne. Der Rest ist "einfach" (zumindest sollte ich das hinbekommen), nur diese eine Matrix fehlt mir, glaube ich. Wissen kann ich das nur, wenn ich diese Matrix habe. Wenn es dann funktioniert, sollte ich ja dann einen Menschen sehen.
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

19

29.09.2014, 19:37

Guck dir das hier mal an:

https://github.com/assimp/assimp/blob/ma…ionOverview.png

Ich kann nicht garantieren, dass es bei dir ganz genau so aussehen wird, aber das Bild zeigt die Grundlegende Idee. Schau dir das Bild an und prüfe, ob du den Sinn von jedem Schritt verstehst, insbesondere auch was jeder Teil der Berechnung ganz unten bedeutet. Bevor du das nicht komplett durchschaut hast, macht es gar keinen Sinn mit dem Programmieren anzufangen.
Lieber dumm fragen, als dumm bleiben!

FSA

Community-Fossil

  • Private Nachricht senden

20

29.09.2014, 19:55

Ich hake mich auch mal kurz dazwischen: Der untergeordnete Knochen wird relativ zum Elternknochen transformiert, oder?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Werbeanzeige