Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 05:50

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 31 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 08, 2006 14:53 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

also ich komm leider net wirklich weiter.. wobei das aber evtl auch an anderen dingen liegt :)
Deswegen erklär ich nochmal die gesammte problematik.

Das Programm wofür ich das PlugIn (Maya) mache hat eine SmoothBind-Methode.. also Skelett-Animation :)

Wenn ich jetzt eine kugel habe und 3 Knocken reinstecke wird die kugel von diesen 3 Knochen deformiert.. kennt ja jeder denke ich mal.

Was ich jetzt brauche ist eine Matrix für jeden Vertex der mir die deformation wieder rausrechnet, so das ich wieder eine Kugel rausbekomme.

Daher dachte ich, ich könnte einfach eine Matrix aus den ganzen Joint-Rotationen (Joint = Knochen/Bone) (mit Weighting) etc erstellen und die dann invertiert anwenden.. funktioniert soweit auch, allerdings nur solange das Weighting komplett auf einem Joint ist.. sobald 2 oder mehr joints sich den Vertex teilen geht es nichtmehr :(

Und da hänge ich zur Zeit fest.. ich probier rum ohne ende, aber komme net wirklich weiter :(



Eine sache die ich eben mal getestet habe:
Maya deformiert die kugel und ich wende dann meine InvertierteMatrix drauf an.. hab dann ein komisches gebilde.. *g*
Als nächstes habe ich mal erst meine invertierteMatrix angewendet und dann das ding von Maya deformieren lassen, und das merkwürde.. es kommt ein anderes komisches gebilde raus..

Kann das richtig sein??
Ich meine, sagen wir ich habe eine Matrix die ein Objekt Rotiert und bewegt.
Wenn ich jetzt diese Matrix auf ein Objekt anwende und anschließend die gleiche Matrix invertiert nocheinmal anwende.. dann müßte das Objekt ja wieder an der Ausgangsposition sein, oder??
Aber macht es da nen unterschied in welcher reihenfolge ich das mache?? Also ob erst Normale und dann Invertierte oder erst Invertierte und dann Normale?? Müßte da nicht das ergebniss gleich sein??

Hoffe man versteht noch was ich mit dem post hier sagen will *grinst unsicher* Wenn nicht, einfach nochmal nachhaken bitte :)

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 08, 2006 15:08 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Könntest du vielleicht paar kleine Bildchen posten, die den ist zustand dokumentieren? Hilft dem ein oder anderen vielleicht deine Ideen zu verfolgen ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 08, 2006 15:24 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

ok, hier is nen bild dazu :)
Bild

Ist das soweit verständlich??

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 08, 2006 15:58 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich denke jetzt kann man verstehen, um was es geht. ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 08, 2006 16:45 
Offline
DGL Member

Registriert: Di Sep 06, 2005 20:40
Beiträge: 26
Wohnort: Aarhus, Denmark
base:=IdentityMatrix;
applyMatrix(base, Matrix1, 0.2);
applyMatrix(base, Matrix2, 0.5);
applyMatrix(base, Matrix3, 0.3);

inversematrix(base);

Ist das nicht nur was sie wünschen oder habe ich ihre frage missverstanden?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 08, 2006 17:01 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
JSoftware hat geschrieben:
base:=IdentityMatrix;
applyMatrix(base, Matrix1, 0.2);
applyMatrix(base, Matrix2, 0.5);
applyMatrix(base, Matrix3, 0.3);

inversematrix(base);

Ist das nicht nur was sie wünschen oder habe ich ihre frage missverstanden?


Ja, an und für sich schon.. nur das ergebniss was ich rausbekomme stimmt halt noch nicht :(
Hier steht wie Maya seine Matrix errechnet:
http://www.alias.com/glb/eng/support/kn ... emId=3005+
bzw berechnen die da leider keine Matrix sondern wenden es direkt auf die punkte an..

Und was ich halt brauche ist eine Matrix die ich auf die punkte anwenden kann, so das Maya's Smooth-Bind aufgehoben wird.. Also wenn Maya's SmoothBind ein Vertex um 5 verschieben will, muß ich es davor um -5 verschieben.. so das es dannach +/- 0 ist (siehe bild oben)

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 08, 2006 18:15 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi nochmal :)

Auch mit der gefahr das ich evtl nerve *g*
Aber ich hab grad ne idee wie ich es erkläre und wir nochmal von vorn anfangen und alles bisherige vergessen was ich gesagt hab ;)

Zitat:
Each point P is assigned a set of weights {w1,w2,...,wn}, one weight for each
of the 'n' influence objects affecting the skin, with the default weight value
being 0. Typically, the following holds:

w1 + w2 + ... + wn = 1.0

Let Ti be the current transformation matrix of influence 'i' and Bi be the
world transformation matrix of the same influence at the time of the bind.

If W(p) is the world position of P at the time of the bind, then we compute
Li(p) to be the position of point P in the local coordinate system of influence
i:

Li(p) = Bi^(-1) * W(p)

We then compute what the world position of the point would be if it was
"parented" under transform 'i':

Ni(p) = Ti * Li(p)

We multiply this world position by the corresponding weight for influence i and
get:

Mi(p) = wi * Ni(p)

We now add up all the Mi(p) to get the deformed position of the point in world
space:

NewWorldPos(p) = M1(p) + M2(p) + ... + Mn(p)


Das ist ja der normale weg wie man die einzelnen Punkte berechnet...
Was ich jetzt brauche ist das was am ende bei NewWorldPos rauskommt als Matrix und nicht als Punkt.

Also so das ich die Matrix am ende dann auf P anwenden kann und das selbe rauskommt als würde ich das ganze so wie oben ausrechnen.
Geht das??

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 08, 2006 19:48 
Offline
DGL Member

Registriert: Di Sep 06, 2005 20:40
Beiträge: 26
Wohnort: Aarhus, Denmark
aha.
BiI=Inverse Worldtransform
Bi=Worldtransform
Ti=Bonetransform
w=weight
m = Bi^(-1)*matrix(slerp(Bi, Ti, w))

Ich weiss nicht ob es richtig ist.. Ich kann nur von dieses metode denken wenn du die gewichte matrix geben wollen. Vielleicht sollst du die bonetransform mit der bonetransform.parent :?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 08, 2006 19:58 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

hm.. ich schaffe es sogar die rotation rauszurechnen über die Quaternionen.. aber die Translation geht net :(

Um mal zu erklären wofür ich das überhaupt brauche:
Ich habe einen Character welcher durch Bones animiert wird.
Jetzt bringe ich den character in eine Pose und dupliziere ihn mir (so das im original die Bones noch einfluss haben, in dem duplizierten einfach nurnoch das Mesh ist)

So, am duplizierten modele ich jetzt dem chara eine beule auf den kopf. Die möchte ich jetzt auch bei dem OriginalChara haben. Nur bei dem muß ich die Beule in dem zustand hinzufügen wo er nochnicht durch die Bones deformiert ist, sprich ich muß bei meinem duplizierten chara die bone-transformation rausrechnen.

Und das ist das problem :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 08, 2006 20:01 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hab deine antwort grad erst gesehen JSoft ^^ werd es kurz testen :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 08, 2006 20:09 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

ok hab's ausprobiert... :)

Rotation stimmt immernoch, also wird rausgedreht, nur Translation leider nochnicht :(

Aber müßte da nicht auch irgendwo W(p) mit rein?? Das fehlt komplett :?

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 08, 2006 20:33 
Offline
DGL Member

Registriert: Di Sep 06, 2005 20:40
Beiträge: 26
Wohnort: Aarhus, Denmark
Wird die translation nicht nur:

m[0,3] = m[0,3] + (Ti[0,3]-m[0,3])*w
m[1,3] = m[1,3] + (Ti[1,3]-m[1,3])*w
m[2,3] = m[2,3] + (Ti[2,3]-m[2,3])*w

?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 08, 2006 20:46 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
ne klappt so leider nicht :(
Aber da fehlt auch immer noch dieses W(p)



Ich hab den Algo von der Alias-Seite mal ein wenig umformuliert zum besseren verstehen :)

Der algo macht das:
ich habe 3 Bones... Weighing ist 0.2 0.3 und 0.5 die einen Punkt "W" transformieren.
Jeder Bone hat eine Ausgangsmatrix (aMatrix) aus dem stadium wie er ungedreht war und eine Matrix (tMatrix) wie er aktuell gedreht ist

P1(x,y,z) = aMatrix[joint1].inverse * WeltKoordinate(W)
N1(x,y,z) = tMatrix[joint1] * P1
M1(x,y,z) = N1 * Weighting[joint1 = 0.2]

P2(x,y,z) = aMatrix[joint2].inverse * WeltKoordinate(W)
N2(x,y,z) = tMatrix[joint2] * P2
M2(x,y,z) = N2 * Weighting[joint2 = 0.3]

P3(x,y,z) = aMatrix[joint3].inverse * WeltKoordinate(W)
N3(x,y,z) = tMatrix[joint3] * P3
M3(x,y,z) = N3 * Weighting[joint3 = 0.5]

NewWorldPos(x,y,z) = M1 + M2 + M3


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 08, 2006 21:15 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Soo, bin ein wenig weiter gekommen :)

Code:
  1. MQuaternion M1, M2;
  2. M1 = preBindMatrix;
  3. M2 = matrix;
  4. MMatrix qMatrix = preBindMatrix.inverse() * slerp(M1, M2, weights[i]).asMatrix();
  5.  
  6. qMatrix[3][0] = (matrix[3][0] - preBindMatrix[3][0]) * weights[i];
  7. qMatrix[3][1] = (matrix[3][1] - preBindMatrix[3][1]) * weights[i];
  8. qMatrix[3][2] = (matrix[3][2] - preBindMatrix[3][2]) * weights[i];


in meinem test habe ich eine Kugel mit einem einzigen Bone (= dessen weighting ist 1.0). Wenn ich den Bone (und somit die kugel) rotiere und dann die qMatrix.inverse() darauf anwende erhalte ich wieder meine Kugel wie sie vor dem drehen war = funktioniert :)

Nur, sobald ich mehr als einen Bone habe geht es nichtmehr... weil wenn ich alle qMatrix'en von allen joints miteinander multiplizere und dann davon die inverse benutze kommt irgendwas komisches raus :(

EDIT: Halt dochnet... war zufall das es die kugel wieder ergab... wenn ich sie weiter verdrehe gibt es wieder nen falsches ergebnis :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 08, 2006 21:18 
Offline
DGL Member

Registriert: Di Sep 06, 2005 20:40
Beiträge: 26
Wohnort: Aarhus, Denmark
Edit: deiner neue methode ist nicht fertig. Die interpolation in die translation part will eines falsche resultat geben
qMatrix[3][0] = preBindMatrix[3][0]+(matrix[3][0] - preBindMatrix[3][0]) * weights[i];
qMatrix[3][1] = preBindMatrix[3][1]+(matrix[3][1] - preBindMatrix[3][1]) * weights[i];
qMatrix[3][2] = preBindMatrix[3][2]+(matrix[3][2] - preBindMatrix[3][2]) * weights[i];


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 31 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]