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

1

26.11.2008, 00:06

Morphing mit DirectX 9.0c und HLSL

Hallo Leute,

ich habe mich hier eben gerade angemeldet, weil ich bei dem oben genannten Thema ein Problem habe.
Hat jemand von euch damit schon Erfahrungen?
Ich habe es ohne Shader schon hinbekommen zwischen 2 Objekten zu morphen.
Wenn jemand denkt, dass er mir helfen kann veröffentliche ich auch den QuellCode. Das jetzt alles hier so in das kleine Fenster ohne externe Dateien erscheint mir etwas unübersichtlich.

Das Problem liegt darin, dass der Shader die Vertices bekommt (sowohl vom Start als auch vom Zielobjekt) aber die Darstellung absolut nicht passt.
Ich denke, es stimmt irgendwas nicht in der Art wie ich die Vertices / Normalen auslese... oder an meinen FVF. Leider ist das mein erstes "richtiges" Projekt und daher habe ich noch nicht so viel Erfahrung.

Gruß, Michael

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

26.11.2008, 07:31

Erstmal Willkommen im Forum!

Also wenn du einen Shader programmierst, hast du keine FVF mehr, sondern eine Vertexdeclaration.

Klingt jetzt vlt. ein wenig hart, aber probier lieber mal ein Dreieck mit einem Shader zu rendern. Da können wir dir auch eher helfen, weil in einem grösseren Programm ist das alles sehr schwer nachzuvollziehen.
Wenn das läuft, kannst du ganz einfach darauf aufbauen und merkst sofort, wenn du irgendwo einen Denkfehler hast und es nicht mehr stimmt.

3

26.11.2008, 12:12

Hallo,

ja danke... ein Dreieck habe ich schonmal hinbekommen :-)

Ich habe auch eine Vertexdeklaration.

//----------------
D3DVERTEXELEMENT9 declaration[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
{ 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 },
{ 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },

{ 1, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 1 },
{ 1, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 1 },
{ 1, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1 },
D3DDECL_END()
};

if(device->CreateVertexDeclaration(declaration, &m_pDeclaration) != D3D_OK) return 0;
//-----------

Sorry, wenn ich hier ein paar Begriffe "durcheinander bringe" oder mich nicht exakt ausdrücke.

Ich werde es heute nochmal allein versuchen... wenn dann nicht läuft kann ich es ja mal hochladen und du oder wer anders schaut es sich mal an?

Gruß

4

06.12.2008, 13:05

Hallo....
ich habe es vor ca. einer Woche hinbekommen, dass ich 2 Objekte in meine Anwendung lade und dazwischen morphe. So weit so gut!

Jetzt würde ich das gerne auf Key-Frames erweitern. Ich habe gelesen, dass das X-Format angeblich kein Morphing unterstützt? Ich habe jetzt aber in D3s Max ein Objekt erstellt und darauf den Morpher Modifier angewendet und das ganze in 3 Key Frames animiert.
Hier ein Ausschnitt aus der X-Datei:

AnimationSet Anim-1 {


Animation Anim-Box01 {

{ Box01 }

AnimationKey {
0;
2;
0;4;-1.000000,0.000000,0.000000,0.000000;;,
2400;4;-1.000000,0.000000,0.000000,0.000000;;;
}

AnimationKey {
1;
4;
0;3;1.000000,1.000000,1.000000;;,
160;3;1.000000,1.000000,1.000000;;,
1600;3;1.000000,1.000000,1.000000;;,
2400;3;1.000000,1.000000,1.000000;;;
}

AnimationKey {
2;
4;
0;3;-1.484612,0.000000,23.107712;;,
160;3;-1.484612,0.000000,23.107712;;,
1600;3;-1.484612,0.000000,23.107712;;,
2400;3;-1.484612,0.000000,23.107712;;;
}
}

Animation Anim-Box02 {

{ Box02 }

AnimationKey {
0;
2;
0;4;0.000000,-1.000000,0.000000,0.000000;;,
2400;4;0.000000,-1.000000,0.000000,0.000000;;;
}

AnimationKey {
1;
2;
0;3;1.000000,1.000000,1.000000;;,
2400;3;1.000000,1.000000,1.000000;;;
}

AnimationKey {
2;
2;
0;3;24.855389,0.000000,23.107712;;,
2400;3;24.855389,0.000000,23.107712;;;
}
}

Animation Anim-Box03 {

{ Box03 }

AnimationKey {
0;
2;
0;4;0.000000,-1.000000,0.000000,0.000000;;,
2400;4;0.000000,-1.000000,0.000000,0.000000;;;
}

AnimationKey {
1;
2;
0;3;1.000000,1.000000,1.000000;;,
2400;3;1.000000,1.000000,1.000000;;;
}

AnimationKey {
2;
2;
0;3;50.805386,0.000000,23.107712;;,
2400;3;50.805386,0.000000,23.107712;;;
}
}
}

Bei diesem Beispiel handelt es sich einfach um eine Box, die verschieden verformt wird.

Nun zu DirectX. Ich stelle mir das ganze so vor, ich lade das Objekt mit der Funktion D3DXLoadMeshHierarchyFromX. Danach habe ich ja die Frames... also die 3 Boxen. So, angenommen es sind nicht einfach nur 3 Boxen sondern komplexere Sachen und mehrere Animationen, dann kann ich nicht einfach zwischen allen Boxen morphen. Also wenn Animation 1 von KeyFrame 0 bis 20 geht und Anmation 2 von 21 bis 50 usw.
Dafür gibt es ja den AnimationController, der mir den Zugriff auf die einzelnen Animationen erlaubt.
Daher nun meine Frage...
Funktioniert das überhaupt so, wie ich es mir bisher denke? Hat jemand soetwas schon gemacht und kann mir ein Beispielprogramm zeigen?
Der AnimationController hat ja eine Methode AdvanceTime... funktioniert diese mit Morphing? Ich habe nur das Beispiel mit Skinning gesehen, was beim SDK dabei ist. So wie ich es sehe, wird es nicht gehen? Was aber doch dann gehen müsste, ist das manuelle Auslesen der AnimationKeys.

Mich würden einfach mal Tipps interessieren wie ihr das machen würdet.

Danke!

Werbeanzeige