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

Aktuelle Zeit: Sa Jul 19, 2025 21:10

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



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Jun 09, 2005 15:53 
Offline
DGL Member
Benutzeravatar

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

ich hab ein MatrixMathe Problem...

Nehmen wir an wir haben einen Punkt an den Koordinaten 0, 0, 0 und 2 Matritzen. MatrixA würde den punkt um +10 auf X verschieben. MatrixB würde den Punkt +10 auf Y verschieben.

Wenn ich nun einfach beide Matritzen nacheinander auf den Punkt anwende landet er am ende bei XYZ: 10, 10, 0.

Was aber wenn ich beide Matzritzen nur zu 50% anwenden möchte...? Also MatrixA nur 50% = Der punkt landet bei 5, 0, 0.. und dann MatrixB mit 50% = 5, 5, 0.

Wobei die 50% jetzt nur ein beispiel sind.. könnte auch 30%/70% sein.. halt von der Theorie so wie in 3D Programmen das JointSkinning.. ein Joint transformiert einen Punkt mit einem Weighting.

Hat jemand ne ahnung wie das geht???

Au'revoir,
Aya~

PS: Bezieht sich leider nicht nur auf die Translation.. sondern hauptsächlich auf die Rotation... also einfach nur die TranslationWerte der Matritze verändern reicht nicht :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 09, 2005 15:58 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Ich weiss nicht ob ich mich irre, aber man kann die Matricen interpolieren.

EDIT
Am einfachsten wäre es die Werte selbst zu interpolieren und dann die Matricen zu erzeugen.
z.B. du willst eine Translation durchführen:
P <- ausgangs Punkt
T <- Vektor der Translation
scale <- scalar 0<=scalar<=1 ( 0 - 100 % )

T_new = ( t.x * scale, t.y * scale, t.z * scale);

und jetzt mit T_new eine Matrix formieren.

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Zuletzt geändert von sniper am Do Jun 09, 2005 16:50, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 09, 2005 16:29 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Am einfachsten ist es, wenn du den Punkt mit beiden Matrizen multiplizierst, und dann das Ergebnis interpolierst, also:
Code:
  1.  
  2. DummyA = MatrixA * Punkt; // Beispiel: DummyA = (10, 0, 0)
  3. DummyB = MatrixB * Punkt; // Beispiel: DummyB = (0, 10, 0)
  4.  
  5. Ergebnis = DummyA * (ProzentA / 100) + DummyB * (ProzentB / 100);
  6. // Beispiel: Ergebnis = (10,0,0) * 0.5 + (0,10,0) * 0.5 = (5,5,0)
  7.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 09, 2005 16:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
@Lyr: Deine Lösung funktioniert aber nur, solange sich der Dummy an 0, 0, 0 befindet. wenn er standardmäßig schon an beispielsweise 10, 10, 10 liegt, dann die Matrix dazukommt (20, 10, 10) und dann halbiert wird, kommt 10, 5, 5 raus -> Das würde nicht stimmen.
Man muss schon die Matrix verändern. Ich frage mich gerade, ob einfaches halbieren aller Werte in der Matrix ausreichen würde/ richtig ist...

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 09, 2005 17:13 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Ich halbiere auch nichts, ich interpoliere :-).
(10,10,10) =>
DummyA = (20,10,10)
DummyB = (10,20,10)
interpoliert = (15,15,10)

Wenn du natürlich bei den Matrizen insgesamt nicht auf 100% kommst, dann ist zusätzlich noch eine Skalierung dabei, was bei dir der Fall wäre.

[edit] Und nebenbei bemerkt wird diese Methode des öfteren (zB auch von mir) auch beim Skinning verwendet. Nur bei den Normalvektoren ist es etwas problematisch, weil hier eine spherische Interpolation bessere Ergebnisse bringen würde.[/edit]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 09, 2005 17:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Ach verdammt, ich meinte, dass der Punkt und nicht der Dummy nicht an 0, 0, 0 liegt.
Beispiel:
Punkt: 10, 10, 10;
MatrixA: 10, 0, 0;
MatrixB: 0, 10, 0;
Prozent: 30;

DummyA= Punkt*MatrixA= 20, 10, 10;
DummyB= Punkt*MatrixB= 10, 20, 10;

Ergebnis= ... = 6, 3, 3 + 3, 6, 3 = 9, 9, 3.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 09, 2005 19:29 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Bei deinem Beispiel sind wieder die 100% nicht erreicht, sondern nur 60. Wenn du für die eine Matrix 30% verwendest dann solltest du für die andere 70 nehmen damit du keine Skalierung erhältst.

Aber ich denke worauf du hinaus willst ist, dass man beim Skinning die Positionen eines Punktes immer in Relation zur Ausgangsposition eines Bones angibt. Da der Titel "Matrix multiplizieren nur zu 50%" hieß, bin ich darauf nicht eingegangen, weil das eher wenig damit zu tun hat. Der Autor hat beispielsweise nicht erwähnt, dass er eine Ausgangsposition besitzt und nur da kommt dies zum tragen.

Also wenn du als Ausgangsstellung beispielsweise hast:
BoneA1/MatrixA1 = verschieben um (10,0,0)
BoneB1/MatrixB1 = verschieben um (0,10,0)
dies kannst du auch so sehen, dass sich BoneA in deinem Grafik-Editor auf Position (10,0,0) und BoneB an Position (0,10,0) befindet. Nun hast du ein Keyframe gegeben, wo beispielsweise:
BoneA2/MatrixA2 = verschieben um (5,0,0)
BoneB2/MatrixB2 = verschieben um (0,20,0)
Und du willst diese neuen Umstände nun für einen beliebigen Punkt realisieren, so sieht das folgendermaßen aus:

Als Beispiel nehm ich jetzt mal den Punkt (5,5,0)

Zuerst bestimmst du dir die Position relativ zur Ausgangsstellung der Bones, also:
OffsetA = Inverse( MatrixA1 ) * Punkt
Bsp: OffsetA = (-5,5,0)

OffsetB = Inverse( MatrixB1 ) * Punkt
Bsp: OffsetB = (5,-5,0)

und nun multiplizierst du mit den beiden neuen Matrizen:
DummyA = MatrixA2 * OffsetA
Bsp: DummyA = (0,5,0)

DummyB = MatrixB2 * OffsetB
Bsp: DummyB = (5,15,0)

50:50 interpoliert also:
(2.5, 10, 0)

Wenn ich nun die Ausgangsstellung nicht gegeben habe, und stattdessen als Ausgangsstellung für jeden Bone eine Einheitsmatrix annehme, so wäre:
OffsetA/B = Einheitsmatrix * Punkt = Punkt

wodurch man wiederum zu oben gegebener Formel:
DummyA = MatrixA * Punkt;
DummyB = MatrixB * Punkt;
Ergebnis = DummyA * (ProzentA / 100) + DummyB * (ProzentB / 100);
kommen würde.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 09, 2005 19:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Ok, das hab ich so jetzt verstanden. Da fehlen mir auch ein bisschen die mathematischen Grundlagen.
Danke

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 09, 2005 20:09 
Offline
DGL Member
Benutzeravatar

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

danke erstmal, hat mir schon ein wenig geholfen... :)

Hab das soweit verstanden vonwegen Dummys und interpolieren und so...

Aber was wenn es drei Matritzen sind die den punkt beeinflussen??? (z.B. 30%, 30%, 40%)???
Wie interpoliere ich die dann???

Au'revoir,
Aya~~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 09, 2005 20:17 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Wie eben gesagt, eine nach der andere und dann multiplizierst du sie mit einander.

1. für 30% der Vorgesehener Transformation eine Matrix M1 machen
2. für 30% der Vorgesehener Transformation eine Matrix M2 machen
3. für 40% der Vorgesehener Transformation eine Matrix M3 machen

M = M1 * M2;
M = M * M3;

M <- das was du brauchst.

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 09, 2005 20:31 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Mhh... aber wenn ich sie einfach alle 3 miteinander multipliziere ist jede mit 100% drin...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 09, 2005 20:34 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Das geht immer in der selben Art weiter:

Dummy1 = Matrix1 * Punkt
Dummy2 = Matrix2 * Punkt
...
DummyN = MatrixN * Punkt

Und nun brauchst du natürlich noch N-Prozentwerte wodurch du wieder dein interpoliertes Ergebnis erhältst:
Ergebnis = Dummy1 * (Prozent1/100) + Dummy2 * (Prozent2/100) + .... + DummyN * (ProzentN/100)

Und wie gesagt sollte sich das mit den Prozent immer auf 100 ausgehen, was du aber bei deinem Bsp mit 30,30,40 Prozent eh beachtet hast.

@sniper_w:
Deine Änderung hab ich irgendwie ganz übersehen unter den ganzen Posts. Obwohl es natürlich möglich ist das in deiner Art zu machen, dürfte es sich bei Rotationen etwas schwieriger gestalten. Auch wenn diese Art eine spherische Interpolation, sowohl bei den Punkten (falls erwünscht) als auch bei den Normalvektoren erleichtern würde, wenn man sehr viele Punkte mit den selben Prozentanteilen hat.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 09, 2005 20:48 
Offline
DGL Member
Benutzeravatar

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

tausend dank.. funktioniert :)

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


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 | 14 Queries | GZIP : On ]