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

Aktuelle Zeit: Fr Jul 18, 2025 08:53

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Welt- vs Objektkoordinaten ...
BeitragVerfasst: Fr Jan 21, 2005 17:16 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 28, 2002 19:27
Beiträge: 568
Wohnort: Chemnitz / Sachsen
hallo,

heut scheint mir mei hirn wieder mal total nen streich zu spielen ...

wie bekomm ich mit ner matrix (objectspace) aus nem globalen vektor (weltkoords) nen lokalen (objectkoords) vektor ???

_________________
Aktuelles Projekt :
www.PicPlace.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 21, 2005 17:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Du brauchst einfach nur eine inverse Martix von der Matrix bilden, mit der du/OpenGL die Punkte multipliziert hast.
Schlussendlich multiplizierst du die Punkte noch damit und du erhälst die "Urspungs" Punkte.
(Hinweis: Die Inversion einer 4*4 Matrix ist nicht immer möglich und zimlich aufwendig)
MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 21, 2005 18:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
Du kannst auch statt den Vektor mit der Matrix zu multiplizieren, ihn in die Matrix transformieren (umgekerter prozess)

Ich kann mal den Quelltext aus meiner Geometry unit posten (hoffe der hilft):

Code:
  1. function GeoSVecTra(b: TGeoSBas; v: TGeoSVec): TGeoSVec;
  2. var
  3.   a: Single;
  4. begin
  5.   a:=GeoSVecDet(b.u,b.v,b.w);
  6.   result.x:=GeoSVecDet(v,b.v,b.w)/a;
  7.   result.y:=GeoSVecDet(b.u,v,b.w)/a;
  8.   result.z:=GeoSVecDet(b.u,b.v,v)/a;
  9. end;
  10.  
  11. function GeoSVecDet(v1,v2,v3: TGeoSVec): Single;
  12. begin
  13.   result:=v3.x*(v1.y*v2.z-v1.z*v2.y)+v3.y*(v1.z*v2.x-v1.x*v2.z)+v3.z*(v1.x*v2.y-v1.y*v2.x);
  14. end;


meine Typen sind wie folgt deklariert

Code:
  1.   TGeoSVec = record
  2.     x,y,z: single;
  3.   end;
  4.  
  5.   TGeoSBas = record
  6.     u,v,w: TGeoSVec;
  7.   end;


Bei Fragen steh ich gerne Raht :!:

_________________
Nothing, oh sweet nothing,
today we are doing nothing at all...
http://www.geo-progs.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 21, 2005 18:58 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Die obere 3x3 Matrix ist normalerweise orthogonal (orthonormal?) und daher kann man die Inverse davon bilden, indem man die Zeilen und Spalten vertauscht. In der vierten Spalte steht im Normalfall nur die Verschiebung. Das geht wie gesagt nicht immer, aber wenn die Matrix eine Rotation und Verschiebung ohne Skalierung beschreibt, dann funktioniert das. Bei Matrizen die man für die Ausrichtung von Objekten benötigt ist das ja meistens der Fall.

Code:
  1. v.x := v.x - m[12];
  2. v.y := v.y - m[13];
  3. v.z := v.z - m[14];
  4. result.x := v.x * m[0] + v.y * m[1] + v.z * m[2];
  5. result.y := v.x * m[4] + v.y * m[5] + v.z * m[6];
  6. result.z := v.x * m[8] + v.y * m[9] + v.z * m[10];


Wenn man das für mehrere Vektoren machen möchte, kann man daraus auch wieder eine Matrix bauen, indem man den Verschiebungsvektor (m[12],m[13],m[14]) konvertiert und mit der transponierten Matrix multipliziert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 21, 2005 19:36 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
Oh, dass würde mir ne menge Rechnung erspaaren!

Ortogonal = alle paarweise senkrecht stehend mit der Länge 1???

_________________
Nothing, oh sweet nothing,
today we are doing nothing at all...
http://www.geo-progs.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 21, 2005 19:55 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 28, 2002 19:27
Beiträge: 568
Wohnort: Chemnitz / Sachsen
also wie jetzt ... das ganze mathezeugs verwirrt mich grad ....

einfach den vector mit der objectmatrix multiplizieren oder wie ???

e jemand fragt, es geht darum bei newton auf ein object ne kraft wirken zu lassen ...

_________________
Aktuelles Projekt :
www.PicPlace.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 21, 2005 20:24 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Die 3x3 Matrix ist transponiert und der Vektor wird vorher abgezogen. Es ist also nicht das gleiche wie eine Multiplikation. Ich benutzte das um z.B. die Lichtposition in den Objectspace zu bringen.
Wenn du nur einen Vektor(keine Position) transformieren willst, dann kannst du dir auch die Subtraktion sparen. Orthogonal und orthonormal sind ähnlich, deshalb wußte ich nicht mehr genau was da gelten muß. Ich habe aber nochmal nachgesehen:

Nach der Definition:
Eine Matrix A heißt orthogonal genau dann wenn: A * transponiert(A) = Einheitsmatrix
=> offensichtlich: transponiert(A) = A^-1

Alle Matrizen die Transformationen beschreiben, bei denen die Winkel und Längenverhältnisse erhalten bleiben, also Verschiebung und Rotation, sind orthogonale Matrizen. Und das ist ja in den meisten Fällen so. Bei orthogonalen Matrizen stehen die Spaltenvektoren senkrecht aufeinander.

Die volle 4x4 Matrix wird nicht orthogonal sein. Aber sie besteht ja in den meisten Fällen aus eben der othogonalen 3x3 Matrix und einer Verschiebung. Die 3x3 Matrix und die Verschiebung kann man dann einzeln invertieren.


Zuletzt geändert von LarsMiddendorf am Mo Jan 24, 2005 00:26, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 22, 2005 17:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Damit rswm auch mit unseren Vorschlägen was anfangen kann würde ich vorschlagen das du rswm nochmal genau postet wie du welche Positionsdaten und Matrizen hast. Denn erst wenn du genau weist welche Rechung du umkehren möchtest, kannst du diese auch umkehren.

Die allgemeinen Ansätze dazu haben wir dir ja geliefert. :wink:

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 24, 2005 00:06 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
kleine Berichtigung:

orthogonal = alle Vektoren (lin. unabhängig) senkrecht
orthonormal = orthogonal + (länge der Vektoren = 1)

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


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]