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.01.2004, 23:00

Animationen (jaja, nochmal :p)

da irgendwie von david's seite nichts tutorial-mäßiges kommt und niemand im thread antwortet, hab ich schonmal angefangen, animationen mit bones in meine "engine" einzubaun.

im prinzip isses sogar mir mittlerweile klar geworden, wie das theoretisch funktioniert.
nur eine sache nicht:
ich hab ja meine liste mit vertices und wieviel die von welchem bone beeinflusst werden. allerdings hab ich es bis jetzt so implementiert, dass in jedem frame für jeden bone eine matrix für jeden vertex erstellt wird, wie stark er rotiert, sklatiert und transliert wird. ich kann leider keinen praxistest machen, aber is das nicht ein BISSCHEN langsam?
sollte man diese matrizen schon vorher ausrechnen und cachen?
oder hab ich jetzt nen völlig falschen ansatz verfolgt?

super viel thx im voraus, neonew :)
stay tight, project universe comes back!
### project earth <> 2004 ###

2

27.01.2004, 10:00

kenn mich mit bone animation leider nicht aus, hab aber eine andere frage:
hast du das dateiformat für deine Modele zur Boneanimation selbst geschrieben???

3

27.01.2004, 12:29

hi,

ähm, in der theorie ja.
leider liegt mein milkshape-exporter auf nem andern rechner, deswegen kann ich auch keine praxistests machen. allerdings ist es soo leicht, einen exporter für milkshape zu schreiben, dass das vllt noch ne arbeit von 1h ist :D

ps: zum thema: hatte glaub ich gestern ein bisschen zu lange programmiert. mittlerweile ist mir klar geworden, dass ich nur für jeden bone eine matrix erstelle und dann mit jedem vertex multipliziere, der davon beeinflusst ist.
is das jetzt richtig so?

cya, neonew
stay tight, project universe comes back!
### project earth <> 2004 ###

4

28.01.2004, 15:56

rolf,

irgendwie klappt das bei mir mit den weights noch nicht so. ich habe die worldmatrix des bones m (die wird richtig berechnet) und einen weight-faktor w. aber irgendwie ist es egal, welchen wert f hat,
v * m' = v * m
das kann doch nicht sein ?!?

Quellcode

1
2
m' = m * w
v' = v * m'


meine funktion zum multiplizieren eines vectors mit einer matrix:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
neoVector3D neoVector3D::operator *(const neoMatrix &m) const
{
    float X = x * m.m11 + y * m.m21 + z * m.m31 + m.m41;
    float Y = x * m.m12 + y * m.m22 + z * m.m32 + m.m42;
    float Z = x * m.m13 + y * m.m23 + z * m.m33 + m.m43;
    float W = x * m.m14 + y * m.m24 + z * m.m34 + m.m44;

    if (fabs(W) < (1.0e-5f))
        return neoVector3D(0.0f, 0.0f, 0.0f);

    return neoVector3D(X/W, Y/W, Z/W);
}


wäre nett, wenn mir jemand helfen könnte.

bis dann, neonew :)
stay tight, project universe comes back!
### project earth <> 2004 ###

5

29.01.2004, 12:33

*push*

also, bei der einheitsmatrix sieht es zb so aus (ober matrix mit Weight = 1.0f, untere mit Weight = 0.2f):

Quellcode

1
2
3
4
5
6
7
8
9
1.00 0.00 0.00 0.00 
0.00 1.00 0.00 0.00 
0.00 0.00 1.00 0.00 
0.00 0.00 0.00 1.00 
---
0.20 0.00 0.00 0.00 
0.00 0.20 0.00 0.00 
0.00 0.00 0.20 0.00 
0.00 0.00 0.00 0.20

wenn beide matrizen jetzt (separat voneinander) mit nem vector(1.0f, 1.0f, 1.0f) multipliziert werden, wird ja immer eine spalte aufsummiert und mit der summe der letzten spalte dividiert.
im oberen beispiel also immer 1.0f / 1.0f = 1.0f, d.h. der vector bleibt unverändert (wie es bei einer einheitsmatrix sein sollte), genauso wie bei der unteren, was soweit ja auch richtig ist.

wenn die matrix jetzt allerdings rotiert wird, dann sehen die matrizen zb so aus:

Quellcode

1
2
3
4
5
6
7
8
9
1.00 0.00 0.00 0.00 
0.00 0.80 0.60 0.00 
0.00 -0.60 0.80 0.00 
0.00 0.00 0.00 1.00 
---
0.20 0.00 0.00 0.00 
0.00 0.16 0.12 0.00 
0.00 -0.12 0.16 0.00 
0.00 0.00 0.00 0.20

x-koordinate ist uninteressant, aber wenn man die y-spalte bei matrix1 aufsummiert, kommt ja 0.20f raus (0.8-0.6), bei matrix2 0.04.
der wert von m1 wird dann durch 1.0f rechnet, bleibt der wert gleich (0.2f). den wert der zweiten matrix (0.04f) wird durch 0.2 geteilt, was das gleiche ist als wenn man mal 5 rechnet, also kommt auch 0.2f raus.
somit werden beide vektoren trotz unterschiedlicher gewichte gleich rotiert.

und genau das ist doch total komisch, weil der gewichtsfaktor gar keine rolle mehr spielt ?!?

kann es vielleicht sein, dass man das matrixfeld m44 auf 1.0 setzen muss?? eigentlich ja nicht, weil dann könnte ich ja gleich den vector mit dem gewichtsfaktor multiplizieren ?!?

wäre froh wenn mir jemand helfen könnte (zb david), dieses problem bringt mich echt auf die palme.

super big thx, neonew
stay tight, project universe comes back!
### project earth <> 2004 ###

6

29.01.2004, 16:01

na lol,

ich hab mich jetzt doch zu der variante entschieden, für jeden vertex jeden bone zu durchlaufen und eine bonematrix zu erstellen, die dann den vertex anpasst (das geht dann auch leichter mit den weights :)).

ich dachte ja zuerst, dass das sehr langsam sein würde, allerdings teste ich hier gerade mit nem 800mhz p3 und ner geforce4mx 200 rum.
ok, es wird nur eine pyramide mit 5 vertices und einem testbone angezeigt, aber immerhin verwendet ein frame etwa 1.29 millisekunden, wovon nur 0.07-0.08 ms für die berechnung der vertices verwendet wird. ich muss mal gucken, wie das bei größeren objekten mit zb 1000 vertices wird.

sollte mein weg irgendwie falsch sein oder es schneller gehen, sofort bescheid sagen!

cya, neonew
stay tight, project universe comes back!
### project earth <> 2004 ###

7

29.01.2004, 17:36

lol, ist das ein selbstgespräch?! :-D

Na wenigstens ist es sehr informativ, hab mir das eine oder ander schon abgeguckt

:roll: :-D :-D

8

29.01.2004, 17:56

das ist ja schon fast göttlich, eine antwort.

:)
stay tight, project universe comes back!
### project earth <> 2004 ###

Werbeanzeige