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