UpdateSkinnedMesh liefert Access Violation??
Verfasst: 27.05.2009, 10:31
Hallo allerseits!
Zuerst vorweg: hab versucht danach hier zu suchen - aber "UpdateSkinnedMesh" kommt angeblich zu häufig vor, nur finden tu ich es leider nicht...
Mein Problem: ich komme in Delphi mit Direct3D 9 mit den Basics ganz gut zurecht - aber: nun würd ich doch ganz gerne mal skinned Mesh Animationen erstellen - aber ich komme einfach nicht weiter.
Mein bisheriger Stand:
* erzeugen eines Meshs mit D3DXCreateMeshFVF
* füllen von VB und IB mittels der entsprechenden Get's und Lock's
Und nach diesem einmaligen Erstellen des Meshs möchte ich nun erstmal testweise EINMALIG versuchen, das Software-Skinning auszuführen. Hierzu klone ich das "mesh" zu einem "premesh", welches das nicht "deformierte" Objekt sein soll.
Hierzu bin ich so vorgegangen:
Premesh: record mit zahlreichen Daten
So - also zunächst einmal scheinen einige Dinge an obigem Code etwas merkwürdig zu sein - zunächst einmal musste ich skin_vertices, _weights und _trafos als feste, große Arrays deklarieren, weil deren tatsächliche Anzahl schwankt, aber man ja einen pointer auf die "wohlgeordneten" Daten liefern soll. Dass das nicht elegant ist und vmtl. mit GetMem und Pointern besser geht, ist mir schon klar (oder?), aber es ist ja nur ein Test... zum zweiten ist mir nicht klar, was genau bei UpdateSkinnedMesh als Matrizen übergeben werden sollen - sind das Arrays oder nicht? Pointer oder nicht? Wozu genau dient die zweite Matrix? Das wird, finde ich, nur mäßig gut im SDK erklärt, sodass ich es nicht verstanden habe... dazu kommt, dass die d3dx9 Delphi Adaptation von Tim Baumgarten & Robert Fizimayer verlangt, dass ich da TD3DXMatrix-Variablen angebe, während das SDK dort Pointer verlangt, soweit meine C++-Kenntnisse reichen...
Und das Resultat des obigen Quellcodes: alles läuft - bis auf der entscheidende Befehl "UpdateSkinnedMesh"! Dort steigt die Direct3D-Dll mit einer AccessViolation aus...
:? :? :? HIIILLLLFFEEEE!!!! :o ;)
Also ihr seht schon - ich bewege mich in einem ziemlichen Irrgarten... es wär toll, wenn mir jemand a) Fehler im Quellcode zeigen oder b) Links zu Threads, die dieses Problem diskutieren, geben oder c) einfach nur irgend einen Tipp geben könntet, woran es grundsätzlich liegen könnte bzw. was ich die ganze Zeit übersehen habe (irgend eine Initialisierung von SkinInfo oder so...???), sodass ich vieleicht doch irgendwann das ganze hinkriege...!
VIELEN DANK!!!!!!
Marcel
Zuerst vorweg: hab versucht danach hier zu suchen - aber "UpdateSkinnedMesh" kommt angeblich zu häufig vor, nur finden tu ich es leider nicht...
Mein Problem: ich komme in Delphi mit Direct3D 9 mit den Basics ganz gut zurecht - aber: nun würd ich doch ganz gerne mal skinned Mesh Animationen erstellen - aber ich komme einfach nicht weiter.
Mein bisheriger Stand:
* erzeugen eines Meshs mit D3DXCreateMeshFVF
* füllen von VB und IB mittels der entsprechenden Get's und Lock's
Und nach diesem einmaligen Erstellen des Meshs möchte ich nun erstmal testweise EINMALIG versuchen, das Software-Skinning auszuführen. Hierzu klone ich das "mesh" zu einem "premesh", welches das nicht "deformierte" Objekt sein soll.
Hierzu bin ich so vorgegangen:
Premesh: record mit zahlreichen Daten
Code: Alles auswählen
var
mesh, orgmesh: ID3DXMesh;
skin_vertices: array[0..65535] of word;
skin_weights: array[0..65535] of single;
skin_trafos: array[0..1023] of TD3DXMatrix;
pnt, pnt2: pointer;
---------------------------
D3DXCreateSkinInfoFVF( premesh.num_vertices, mesh.GetFVF, length(premesh.weights) );
mesh.CloneMeshFVF( mesh.GetOptions, mesh.GetFVF or D3DFVF_NORMAL, device, orgmesh );
for i := 0 to high( premesh.weights ) do
begin
meshcontainer.skininfo.SetBoneName(i, pChar( premesh.weights[i].name ));
for j := 0 to high( premesh.weights[i].weights ) do
begin
skin_vertices[j] := premesh.weights[i].vertices[j];
skin_weights[j] := premesh.weights[i].weights[j];
end;
meshcontainer.skininfo.SetBoneInfluence( i, length(premesh.weights[i].weights), @skin_vertices, @skin_weights ;
end;
orgmesh.LockVertexBuffer( D3DLOCK_READONLY, pnt );
mesh.LockVertexBuffer( 0, pnt2 );
// Füllen der Matrizen:
skin_trafos[0] := D3DXMatrix( 1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1 );
skin_trafos[1] := D3DXMatrix( 1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1 );
meshcontainer.SkinInfo.UpdateSkinnedMesh( skin_trafos[0], skin_trafos[10], pnt, pnt2 );
orgmesh.UnlockVertexBuffer;
mesh.UnlockVertexBuffer;
Und das Resultat des obigen Quellcodes: alles läuft - bis auf der entscheidende Befehl "UpdateSkinnedMesh"! Dort steigt die Direct3D-Dll mit einer AccessViolation aus...
:? :? :? HIIILLLLFFEEEE!!!! :o ;)
Also ihr seht schon - ich bewege mich in einem ziemlichen Irrgarten... es wär toll, wenn mir jemand a) Fehler im Quellcode zeigen oder b) Links zu Threads, die dieses Problem diskutieren, geben oder c) einfach nur irgend einen Tipp geben könntet, woran es grundsätzlich liegen könnte bzw. was ich die ganze Zeit übersehen habe (irgend eine Initialisierung von SkinInfo oder so...???), sodass ich vieleicht doch irgendwann das ganze hinkriege...!
VIELEN DANK!!!!!!
Marcel