Fehler in Animation mit Assimpt und OpenGL

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Andy90
Beiträge: 63
Registriert: 08.10.2023, 13:02

Fehler in Animation mit Assimpt und OpenGL

Beitrag von Andy90 »

Hallo, ich habe mich heute mal daran gemacht und versucht eine Animation mit OpenGL zu rendern. Leider ohne wirklichen Erfolg. Ich habe folgendes Resultat erhalten. Wenn ich den Animator nicht update, dann wird das Model ganz normal gerendert.
Screenshot 2024-03-12 181626.png
Edit
-------
Habe das Project auf Github geladen: https://github.com/Andy16823/Animation- ... 1/Form1.cs
Benutzeravatar
Jonathan
Establishment
Beiträge: 2371
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Fehler in Animation mit Assimpt und OpenGL

Beitrag von Jonathan »

Ja ist nervig, aber da muss man halt irgendwie durch.

Grundsätzlich ist die Idee, erstmal beim einfachst möglichen Fall zu beginnen und dann sich in der Komplexität langsam hochzuarbeiten bis man sieht, was genau das Problem ist.
Du kannst z.b. auch die Transformationsmatrizen auch erstmal per Hand setzen um zu schauen, ob nur das Skinning funktioniert. Danach kannst du probieren, die Matrizen aus den Animationen zu berechnen um zu schauen ob es dann immer noch geht, usw.

Ganz allgemein erhöht sich die Chance auf gute Antworten, wenn man spezifischere Fragen stellen. Ich glaub nicht dass irgendjemand deinen ganzen Code runterladen und debuggen wird.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
Schrompf
Moderator
Beiträge: 4857
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Fehler in Animation mit Assimpt und OpenGL

Beitrag von Schrompf »

Könnte sein, dass:

* Die Vertizes von gar keinen Joints beeinflusst werden
* Die erste Joint Transform Matrix irgendwie Null wird

Kann z.B. sein, dass die Animation, die Du abspielst, einen bestimmten Joint nie berührt, und dann steht da vielleicht anstatt der Einheitsmatrix ne Alles-Nullen-Matrix drin. Das würde dann dafür sorgen, dass die Vertizes eines bestimmten Bones alle im Objekt-Ursprung landen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Andy90
Beiträge: 63
Registriert: 08.10.2023, 13:02

Re: Fehler in Animation mit Assimpt und OpenGL

Beitrag von Andy90 »

Ja du hast sicher recht, was die fragen betrifft. Nur leider weiß ich nicht mal, wo genau der Fehler liegen könnte. Ist es der Shader, sind es eventuell die bone weights. Ist schwierig eine spezifische frage zu stellen, wenn ich nicht genau weiß, was falsch sein könnte. Aber das mit den Matrizen einzel zu setzen könnte ein erster ansatz sein.

----
Edit: habe nun herausgefunden, dass mit den Assimp nodes auch das mesh mit in die Liste der NodeInformations aufgenommen wurde und somit auch dort die Transformation festgelegt wurde. Ich habe in der animation nun den rootnode auf den ersten bone gesetzt und folgendes ergebniss erhalten

https://streamable.com/bdt5dr
Andy90
Beiträge: 63
Registriert: 08.10.2023, 13:02

Re: Fehler in Animation mit Assimpt und OpenGL

Beitrag von Andy90 »

Also ich habe jetzt herausgefunden, dass aus welchem Grund auch immer, nur der Bone mit dem index 0 transformiert wird. Hier wird der Bone richtig transformiert

Code: Alles auswählen

animator.Transformations[0] = mat4.Translate(-100, 100, 100);
for (int i = 0; i < animator.Transformations.Count -1; i++)
{
	var bmat = animator.Transformations[i];
	gl.UniformMatrix4fv(gl.GetUniformLocation(program, "finalBonesMatrices[" + i.ToString() + "]"), 1, false, bmat.ToArray());
}
und wenn ich z.b. den Bone an dem Index 1 transformieren möchte, passiert nichts. Das Model bleibt in der T Position.

Code: Alles auswählen

animator.Transformations[1] = mat4.Translate(-100, 100, 100);
for (int i = 0; i < animator.Transformations.Count -1; i++)
{
	var bmat = animator.Transformations[i];
	gl.UniformMatrix4fv(gl.GetUniformLocation(program, "finalBonesMatrices[" + i.ToString() + "]"), 1, false, bmat.ToArray());
}
Benutzeravatar
Schrompf
Moderator
Beiträge: 4857
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Fehler in Animation mit Assimpt und OpenGL

Beitrag von Schrompf »

Was es mit dem UniformMatrix4fv auf sich hat, weiß ich nicht. Das kann Dir vielleicht jemand Anderes hier sagen. Ich glaube aber, dass das animator.Transformations.Count - 1 der Grund ist, warum manche Teile des Modells im Nullpunkt versinken.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Andy90
Beiträge: 63
Registriert: 08.10.2023, 13:02

Re: Fehler in Animation mit Assimpt und OpenGL

Beitrag von Andy90 »

hab das geändert, aber leider noch immer das selbe Ergebnis. Nur der eine Bone bewegt sich.
Andy90
Beiträge: 63
Registriert: 08.10.2023, 13:02

Re: Fehler in Animation mit Assimpt und OpenGL

Beitrag von Andy90 »

Das ist das, was an den Shader geht :) Ich denke es hat etwas mit den Nan zu tun

Code: Alles auswählen

Sending matrix @index 0 GlmSharp.mat4
0,9997501 -0,001909232 0,0222681 -90,64088
0,000456234 0,9978808 0,06505901 -0,8729491
-0,02234504 -0,06503344 0,997633 24,48377
0 0 0 1
Sending matrix @index 1 GlmSharp.mat4
0,9997501 0,002553983 0,02220339 -90,64845
0,000456234 0,9909077 -0,1345383 1,807382
-0,02234504 0,1345141 0,9906597 24,19969
0 0 0 1
Sending matrix @index 2 GlmSharp.mat4
0,9897068 0,05528267 0,1320016 -91,28743
-0,06134058 0,9972206 0,04227093 1,436958
-0,1292978 -0,04993382 0,990348 25,74569
0 0 0 1
Sending matrix @index 3 GlmSharp.mat4
0,9805682 0,0176588 0,1953815 -89,43277
-0,1603501 0,6459194 0,7463745 17,45252
-0,1130205 -0,7632016 0,6361994 78,93707
0 0 0 1
Sending matrix @index 4 GlmSharp.mat4
0,8696797 0,416294 0,2652467 -108,1161
-0,1094236 0,6865749 -0,7187782 19,00002
-0,4813338 0,5960834 0,6426534 -70,10811
0 0 0 1
Sending matrix @index 5 GlmSharp.mat4
0,8696797 0,4745554 0,1358437 -106,497
-0,1094236 0,4536987 -0,8844116 21,6536
-0,4813338 0,7542914 0,4465006 -67,78608
0 0 0 1
Sending matrix @index 6 GlmSharp.mat4
0,9336056 0,2573343 0,2493175 -103,5306
0,07151484 0,547998 -0,8334171 17,9636
-0,3510916 0,7959133 0,4932112 -69,99468
0 0 0 1
Sending matrix @index 7 GlmSharp.mat4
0,8687279 0,0004795492 0,4952888 -87,29626
0,06343773 0,9916553 -0,1122292 -19,85889
-0,4912091 0,1289164 0,8614491 -25,52888
0 0 0 1
Sending matrix @index 8 GlmSharp.mat4
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
Sending matrix @index 9 GlmSharp.mat4
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
Sending matrix @index 10 GlmSharp.mat4
0,7276676 -0,6588252 0,1909157 12,44197
0,6671296 0,7444758 0,02635129 58,49911
-0,1594923 0,1081912 0,9812527 -32,94674
0 0 0 1
Sending matrix @index 11 GlmSharp.mat4
0,5658495 -0,8001602 0,1988929 16,21867
0,8133022 0,581313 0,02482649 106,3826
-0,1354836 0,1477125 0,9797066 -36,39001
0 0 0 1
Sending matrix @index 12 GlmSharp.mat4
0,6583094 -0,7197885 0,2203036 13,94823
0,7332198 0,6793857 0,02873016 79,61212
-0,1703501 0,1426181 0,9750083 -39,85483
0 0 0 1
Sending matrix @index 13 GlmSharp.mat4
0,8285147 -0,5034893 0,2450758 -2,533417
0,5066878 0,8603945 0,05468172 21,18078
-0,2383931 0,07887316 0,9679604 -37,16101
0 0 0 1
Sending matrix @index 14 GlmSharp.mat4
0,2946791 -0,936017 0,1924463 3,581085
0,9553486 0,2931547 -0,0370173 176,6192
-0,02176668 0,1947618 0,9806087 -29,57532
0 0 0 1
Sending matrix @index 15 GlmSharp.mat4
0,588517 -0,7779714 0,2200176 13,97221
0,7974589 0,6033739 0,0004040524 103,0626
-0,1330663 0,1752179 0,9754954 -40,44726
0 0 0 1
Sending matrix @index 16 GlmSharp.mat4
0,9141468 -0,2970655 0,2758384 -28,18698
0,2945235 0,9542499 0,05161218 -19,94096
-0,2785505 0,03406077 0,9598172 -34,28894
0 0 0 1
Sending matrix @index 17 GlmSharp.mat4
0,05783909 -0,9764777 0,2077095 -20,38994
0,9952911 0,04019121 -0,08820522 225,5933
0,07778367 0,2118327 0,9742059 -19,63128
0 0 0 1
Sending matrix @index 18 GlmSharp.mat4
0,5647013 -0,7962466 0,2170307 13,41281
0,8190088 0,5730718 -0,02851694 111,8011
-0,1016665 0,1938539 0,9757488 -39,45085
0 0 0 1
Sending matrix @index 19 GlmSharp.mat4
0,9458713 -0,1153833 0,3033365 -55,95393
0,107014 0,9932778 0,04412946 -49,16814
-0,3063889 -0,009278506 0,9518618 -30,10717
0 0 0 1
Sending matrix @index 20 GlmSharp.mat4
0,9762924 -0,1265337 -0,1756172 -44,66888
0,1106211 0,9890535 -0,09765568 -45,07877
0,1860518 0,0759147 0,9796029 12,4253
0 0 0 1
Sending matrix @index 21 GlmSharp.mat4
0,9761332 -0,1707684 -0,1341712 -38,00658
0,1588134 0,9826958 -0,0953289 -38,5135
0,148129 0,07174659 0,9863625 8,644175
0 0 0 1
Sending matrix @index 22 GlmSharp.mat4
0,9180766 -0,2774297 0,2831385 -31,69711
0,2272548 0,9535984 0,1974977 -29,20492
-0,3247918 -0,1169724 0,9385244 -13,51993
0 0 0 1
Sending matrix @index 23 GlmSharp.mat4
0,9400601 -0,2738316 0,2032308 -29,05063
0,2737468 0,9613619 0,02909376 -23,63915
-0,2033448 0,02828488 0,9786987 -24,30849
0 0 0 1
Sending matrix @index 24 GlmSharp.mat4
0,867883 -0,4485977 0,2133962 -6,335083
0,4729334 0,8775879 -0,07857263 11,023
-0,1520259 0,169115 0,9738007 -43,309
0 0 0 1
Sending matrix @index 25 GlmSharp.mat4
0,656909 -0,4472495 -0,6069902 -19,68697
0,1930231 0,8779913 -0,4380337 -6,164246
0,7288432 0,1705861 0,6630896 9,735441
0 0 0 1
Sending matrix @index 26 GlmSharp.mat4
0,9990621 -0,02724972 0,03363378 -82,30094
0,04234787 0,7762513 -0,6289996 7,174683
-0,008967984 0,6298351 0,7766771 -88,72232
0 0 0 1
Sending matrix @index 27 GlmSharp.mat4
-0,6066769 -0,1079158 -0,7875885 42,52162
0,09070269 0,9748754 -0,2034458 -40,91603
0,7897546 -0,1948617 -0,5816469 27,23271
0 0 0 1
Sending matrix @index 28 GlmSharp.mat4
-0,5974591 -0,1336793 -0,7906775 45,79776
0,05075486 0,9777255 -0,2036552 -36,57968
0,8002893 -0,1618057 -0,5773671 20,3301
0 0 0 1
Sending matrix @index 29 GlmSharp.mat4
-0,5412144 -0,1285644 -0,8309978 38,04025
0,07363798 0,9771993 -0,1991425 -39,15593
0,8376525 -0,1689711 -0,5194079 17,52615
0 0 0 1
Sending matrix @index 30 GlmSharp.mat4
-0,568814 -0,2952522 -0,7676439 69,62055
-0,1803953 0,955403 -0,2337982 -3,280304
0,8024364 0,005492331 -0,5967106 -9,511063
0 0 0 1
Sending matrix @index 31 GlmSharp.mat4
-0,6219808 -0,2013561 -0,7567007 60,11378
-0,03554355 0,9726352 -0,2296006 -24,18248
0,7822237 -0,1159104 -0,6121187 13,80299
0 0 0 1
Sending matrix @index 32 GlmSharp.mat4
-0,6789387 -0,01298822 -0,7340802 34,71561
0,229686 0,9458987 -0,2291691 -51,67853
0,6973415 -0,3241986 -0,639225 59,77074
0 0 0 1
Sending matrix @index 33 GlmSharp.mat4
-0,3997625 -0,485646 -0,7773909 80,40345
-0,4660555 0,8379893 -0,2838394 55,97397
0,7892897 0,2488395 -0,5613353 -50,45248
0 0 0 1
Sending matrix @index 34 GlmSharp.mat4
-0,5941083 -0,2790635 -0,7544257 69,71928
-0,1146552 0,9576939 -0,2639616 -9,551956
0,7961701 -0,07032216 -0,6009704 3,569061
0 0 0 1
Sending matrix @index 35 GlmSharp.mat4
-0,6962698 0,1436313 -0,7032627 9,733139
0,4476781 0,8527532 -0,2690638 -61,52861
0,5610635 -0,5021753 -0,6580473 107,1307
0 0 0 1
Sending matrix @index 36 GlmSharp.mat4
-0,2120762 -0,5897712 -0,7792263 73,91556
-0,6507235 0,6801102 -0,3376503 107,54
0,7290949 0,4354537 -0,5280139 -74,83692
0 0 0 1
Sending matrix @index 37 GlmSharp.mat4
-0,5668899 -0,3234992 -0,7576175 73,5601
-0,1382624 0,9439856 -0,2996219 -3,047974
0,8121064 -0,06510156 -0,5798646 0,3341751
0 0 0 1
Sending matrix @index 38 GlmSharp.mat4
-0,6810499 0,2764072 -0,6780633 -15,21078
0,6082615 0,7291031 -0,3137274 -59,24593
0,4076617 -0,6261026 -0,6646845 147,0968
0 0 0 1
Sending matrix @index 39 GlmSharp.mat4
-0,4107283 0,09212949 -0,9070914 -12,41213
0,4975453 0,8563393 -0,138312 -67,78189
0,7640364 -0,508126 -0,397562 80,77205
0 0 0 1
Sending matrix @index 40 GlmSharp.mat4
-0,4383483 0,06280196 -0,8966087 -4,589417
0,454228 0,8762729 -0,1606926 -65,7505
0,7755822 -0,4777028 -0,4126396 74,68159
0 0 0 1
Sending matrix @index 41 GlmSharp.mat4
-0,5068079 0,1061534 -0,8554986 -4,382168
0,4410167 0,88462 -0,151497 -65,72128
0,7407088 -0,4540679 -0,4951483 75,66654
0 0 0 1
Sending matrix @index 42 GlmSharp.mat4
-0,5962156 -0,005459383 -0,8028058 23,44842
0,2637905 0,9431222 -0,2023216 -55,10789
0,7582482 -0,3323989 -0,5608647 54,31659
0 0 0 1
Sending matrix @index 43 GlmSharp.mat4
-0,2110536 0,1236484 -0,9696223 -37,84026
-0,1180217 0,9814858 0,1508505 -22,98994
0,9703222 0,1462748 -0,1925536 -49,59743
0 0 0 1
Sending matrix @index 44 GlmSharp.mat4
0,9095559 0,1218038 -0,397331 -105,2161
-0,1690928 0,9818323 -0,08609587 -20,04813
0,3796262 0,1454955 0,9136268 -13,22254
0 0 0 1
Sending matrix @index 45 GlmSharp.mat4
0,9758143 -0,2182047 -0,0131497 -48,14434
0,160508 0,756033 -0,6345475 9,585342
0,1484034 0,6170903 0,7727713 -88,34827
0 0 0 1
Sending matrix @index 46 GlmSharp.mat4
0,9893592 0,05454884 0,1348723 -98,81867
-0,04633038 0,9969157 -0,06334347 -39,34048
-0,1379116 0,05642188 0,9888355 16,49406
0 0 0 1
Sending matrix @index 47 GlmSharp.mat4
0,9983815 -0,02613595 0,05049339 -82,59852
0,04752819 0,8710501 -0,488889 -10,5925
-0,03120447 0,4904989 0,8708828 -64,06544
0 0 0 1
Sending matrix @index 48 GlmSharp.mat4
0,9984899 -0,03931428 0,03835806 -80,14583
0,05467232 0,7785023 -0,6252559 6,939713
-0,005280113 0,6264098 0,779476 -88,05779
0 0 0 1
Sending matrix @index 49 GlmSharp.mat4
0,997725 -0,002396512 0,06737001 -86,25056
0,04491276 0,7688989 -0,6377906 8,52005
-0,05027205 0,639366 0,7672573 -90,23478
0 0 0 1
Sending matrix @index 50 GlmSharp.mat4
0,9947153 0,03273309 0,09730907 -91,06681
0,03873416 0,7581165 -0,6509677 9,996368
-0,09507959 0,6512973 0,7528426 -91,88249
0 0 0 1
Sending matrix @index 51 GlmSharp.mat4
0,9325523 0,07939742 0,352196 -97,20753
0,04610591 0,9413408 -0,334292 -13,7907
-0,3580784 0,327983 0,8741894 -50,23045
0 0 0 1
Sending matrix @index 52 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 53 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 54 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 55 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 56 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 57 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 58 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 59 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 60 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 61 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 62 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 63 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 64 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 65 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 66 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 67 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 68 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 69 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 70 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 71 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 72 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 73 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 74 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 75 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 76 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 77 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 78 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 79 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 80 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 81 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 82 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 83 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 84 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 85 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 86 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 87 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 88 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 89 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 90 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 91 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 92 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 93 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 94 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 95 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 96 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 97 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 98 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Sending matrix @index 99 GlmSharp.mat4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Andy90
Beiträge: 63
Registriert: 08.10.2023, 13:02

Re: Fehler in Animation mit Assimpt und OpenGL

Beitrag von Andy90 »

Ich habe nun herausgefunden, dass es bei manchen quats (warum auch immer) zu fehlern kommen kann.
Screenshot 2024-03-13 214611.png
wie hier zu sehen, sind die werte darin etwas komisch. Außerdem ist der Scalefactor in der slerp funktion 0.

Edit
--------
Ich habe nun auch den fehler gefunden, dass nur der eine Bone Animiert wird. Es liegt an glVertexAttribIPointer :D ich hatte glVertexAttribPointer

nun habe ich folgendes resultat
Screenshot 2024-03-13 225151.png
Benutzeravatar
Jonathan
Establishment
Beiträge: 2371
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Fehler in Animation mit Assimpt und OpenGL

Beitrag von Jonathan »

Animationen sind kompliziert, weil es eine lange Pipeline ist. Du musst das Ding irgendwo modellieren, dann musst du es mit irgendeinem Exporter in irgendein Format speichern, dann musst du es durch Assimp importieren, dann musst du die Assimp Datenstruktur in deine Eigenen kopieren, das Zeug korrekt auf die GPU kriegen und dann mit dem korrekten Shader transformieren. An absolut jeder Stelle kann etwas kaputt gehen, solange du immer nur auf das Endergebnis schaust hast du keine Chance irgendetwas zu erreichen.

Wie schon gesagt, deine einzige Chance ist es, alles systematisch zu simplifizieren. Ich hab damals mit einem 3D Modell mit 2 Knochen und ~10 Vertexen angefangen. Mit einem Textbasierten 3D Format, wenn ich mich richtig erinnere. Weil ich so sehen kann, ob alles stimmt. Und auch vielleicht erstmal nur Rotationen zulassen, keine Skalierung etc.. Du musst zu einem Zustand mit minimalen Features kommen, in dem alles funktioniert, und dich dann langsam hocharbeiten und bei jedem Schritt Debuggen was gerade kaputt gegangen ist. Das ist natürlich mühsam und nervig, aber es ist ein systematischer Ansatz der funktioniert und den man abarbeiten kann. Die Alternative ist, ein komplexes System für einen unüberschaubar langen Zeitpunkt zu debuggen, solange bis es zufällig funktioniert oder man keinen Bock mehr hat und aufgibt.

Ich meine, man sieht das sehr schön in deinem letzten Post. Manche Quads gehen (mehr oder weniger) andere nicht. Was ist das Problem? Das du vermutlich 1000 Quads hast. Fang an mit einem. Wenn das geht mit 2. Dann 10.
Und dann: "Die Werte sind komisch". Was ist das eigentliche Problem? Dass du keine Ahnung hast, was die Werte eigentlich sein sollten. Weil dein Testfall zu komplex ist, um ihn per Hand durchzurechnen. Wenn du weißt, was rauskommen muss, kannst du herausfinden, wo es schief geht.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Andy90
Beiträge: 63
Registriert: 08.10.2023, 13:02

Re: Fehler in Animation mit Assimpt und OpenGL

Beitrag von Andy90 »

Naja eigenlich habe ich das nach dem Tutorial von https://learnopengl.com/Guest-Articles/ ... -Animation aufgebaut. Da haben die dieses Model genutzt. Leider ist es wohl so, dass das tutorial voller fehler war / ist, wenn man so kommentare ließt. Ich hätte auch gerne mit was einfacheren angefangen aber es gab leider nichts.
NytroX
Establishment
Beiträge: 364
Registriert: 03.10.2003, 12:47

Re: Fehler in Animation mit Assimpt und OpenGL

Beitrag von NytroX »

Versuch doch mal das hier, vielleicht klappt das besser bzw. hat weniger Fehler:
https://www.youtube.com/watch?v=GZQkwx10p-8
Da gibt es ein komplettes Repository inkl. aller Modelle dazu und auch eine Visual Studio Datei.
Andy90
Beiträge: 63
Registriert: 08.10.2023, 13:02

Re: Fehler in Animation mit Assimpt und OpenGL

Beitrag von Andy90 »

Ich denke ich bin schon auf dem richtigen weg, wenn auch die Animation etwas komisch ausschaut.
Screenshot 2024-03-13 225151.png
nur wüsste ich gerne woran das liegen kann. Ich denke, dass die matrizen falsch berechnet werden.
Andy90
Beiträge: 63
Registriert: 08.10.2023, 13:02

Re: Fehler in Animation mit Assimpt und OpenGL

Beitrag von Andy90 »

Also, ich habe das Projekt komplett neu erstellt und einige Änderungen vorgenommen. Zum Beispiel nutze ich jetzt ein Vertex-Array für das Rendern des Modells. Außerdem speichere ich die Bone-Gewichte nicht mehr in einem Array, sondern als vec4, und die Bone-IDs als ivec4. Dadurch sieht die Animation nun korrekt aus. Ob diese Änderungen dazu geführt haben, dass die Animation nun richtig dargestellt wird, kann ich leider nicht mit Sicherheit sagen.

Hier ist das Ergebnis: https://streamable.com/8kuzlv und hier ist das GitHub-Repo des Projekts: https://github.com/Andy16823/OpenGL-Animation-CSharp.

Außerdem habe ich etwas Hilfe von einem Reddit-Nutzer erhalten, der einige Unsauberkeiten gefunden hatte. Hier ist der entsprechende Reddit-Post: https://www.reddit.com/r/opengl/comment ... t_working/

Ich werde der sache weiter auf den grund gehen. Aber es ist erstmal schön zu sehen, dass es auf dem richtigem weg ist. Danke nochmal an alle für die Hilfen :)
Benutzeravatar
Jonathan
Establishment
Beiträge: 2371
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Fehler in Animation mit Assimpt und OpenGL

Beitrag von Jonathan »

Ok, das sieht ja jetzt schon richtig cool aus, herzlichen Glückwunsch!

Das Projekt komplett neu zu erstellen war nicht, was ich gemeint habe. Man kann ja durchaus auch das bestehende debuggen, bis es funktioniert. Das eigentliche Problem, speziell bei Animationen, ist die Länge der Datenpipeline, d.h. man hat diese vielen Schritte und überall passiert irgendetwas und man sieht erst ganz am Ende, ob entweder alles korrekt war, oder irgendwo ein Fehler ist (ohne dann zu wissen wo). Deshalb ist die einzige Lösung das irgendwie aufzubrechen und auch schon zwischendrin zu verstehen, ob bis hier hin alles richtig war - weil man dadurch den Fehler eingrenzen und vom ziellosen Rumprobieren wegkommt.

Aber gut, wenns jetzt läuft ist ja alles gut. Es gibt halt auch einfach Fehler, für die man Tage braucht sie zu finden, und dann lernt man nichtmal irgendetwas daraus. Deswegen lohnt es sich leider nicht immer, extra Zeit darein zu investieren um zu verstehen, weshalb jetzt etwas plötzlich funktioniert (wobei man das generell natürlich schon gerne immer will).
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Andy90
Beiträge: 63
Registriert: 08.10.2023, 13:02

Re: Fehler in Animation mit Assimpt und OpenGL

Beitrag von Andy90 »

Vielen Dank :)

Ich habe einige Änderungen vorgenommen, wie zum Beispiel die Verwendung einer Vertex-Struktur für die Vertices im neuen Projekt. Ob dies der Grund für die Veränderungen ist, kann ich nicht mit Sicherheit sagen. In der Theorie habe ich ein grundlegendes Verständnis dafür entwickelt, wie die Animation gerendert wird.

Dabei werden eine Reihe von Matrizen, die die Transformationen der jeweiligen Keyframes darstellen, an den Shader gesendet. Der Shader verwendet diese Matrizen, um die neuen Positionen der Vertices zu berechnen, wobei die Berechnungen unter Berücksichtigung der Bone-Weights erfolgen.

Außerdem habe ich festgestellt, das Slerp NaN werte zurück gibt, wenn der wert zu klein ist, darum habe ich folgendes bei der Rotation Interpolation hinzugefügt

Code: Alles auswählen

private mat4 InterpolateRotation(float animationTime)
        {
            if (1 == NumRotations)
            {
                var rotation = Rotations[0].orientation.Normalized;
                return rotation.ToMat4;
            }

            int p0Index = GetRotationIndex(animationTime);
            int p1Index = p0Index + 1;
            float scaleFactor = GetScaleFactor(Rotations[p0Index].timeStamp, Rotations[p1Index].timeStamp, animationTime);
            quat finalRotation = quat.SLerp(Rotations[p0Index].orientation, Rotations[p1Index].orientation, scaleFactor);
            finalRotation = finalRotation.Normalized;

            if (glm.IsNaN(finalRotation.Length))
            {
                var rotation = Rotations[p0Index].orientation.Normalized;
                return rotation.ToMat4;
            }

            return finalRotation.ToMat4;
        }
Es wird überprüft, ob die Länge der finalen Rotation NaN ist. Falls dies der Fall ist, greife ich auf die Rotation des vorherigen Keyframes zurück. Dies geschieht, da der Scalefaktor vermutlich 0 ist, was darauf hinweist, dass die Animation zu diesem Zeitpunkt genau oder sehr nahe an diesem Keyframe liegt.

Alles in allem finde ich das Arbeiten mit Assimp sehr gut :) habe gesehen @Schrompf hat wohl auch an Assimp gearbeitet, in der Vergangenheit.
Antworten