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

Aktuelle Zeit: Fr Jul 18, 2025 08:11

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Vektor-rotation
BeitragVerfasst: Mi Dez 01, 2004 21:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
Ich benutze eine eigene geometrie unit. ich weiß, dass es eine vertige auch tut, aber mir machts halt spaß so.

Aber eine vernünftige Formel für eine Vektorrotation hätte ich den doch gerne.

Ich will den Vektor v mit x,y,z um de Vektor a mit x,y,z um den Winkel w drehen.

Mein code sieht so aus

Code:
  1. function GeoSVecRot(v: TGeoSVec; a: TGeoSVec; w: Single): TGeoSVec;
  2. var
  3.   b: TGeoSBas;
  4. begin
  5.   b.u:=GeoSVecNor(a);
  6.   b.v:=GeoSVecPro(GeoSVecNor(v),b.u);
  7.   if GeoSVecAmo(b.v)<>0 then begin
  8.     b.w:=GeoSVecPro(b.u,b.v);
  9.     result:=GeoSVecTraInv(b,GeoSVecRotX(GeoSVecTra(b,v),-w));
  10.   end else begin
  11.     result:=v;
  12.   end;
  13. end;


Und das dürfte wohl etwas suboptimal sein :-)

Ich weiß, dass es was mit matrixen usw zu tun hatt, habe dafür aber gerade keine Zeit.

Vielleicht postet mir ja jemand einfach die Lösung...

[/code]

_________________
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: Do Dez 02, 2004 10:50 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Bei den Domnloads/Files gibt es ein PDF namens Computergeometrie Script oder ähnlich. Das ziehst du dir runter!

Darin steht wie man Punkte um einen beliebige Achse rotiert. (Quasie das was man in OpenGL mit glRoatate macht).

Das Script enthält noch mehr solche essentieller Tips. Also unbedingt ziehen.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 02, 2004 12:19 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
Hilfe!

Entweder der Download befindet sich nicht mehr in der Files-sektion oder ich bin blind!!!

Klingt aber echt gut. Vielleicht könntest du mir noch mal sagen, wo ich den finden kann :-)

_________________
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: Do Dez 02, 2004 14:09 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
:oops:
Ist natürlich unter Links -> General

Sorry :cry:

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 02, 2004 23:18 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
Vielen Dank werde mal versuchen mich durchzuschlagen :-)

_________________
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 Dez 17, 2004 15:27 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
Hm. Ich habe jetzt meine sehr gut funktionierende Lösung (welche sehr langsam war) durch ne variante mit ner Drehmatrix ausgetauscht. Der Geschwindigkeitsvorteil ist auch unübersehbar.

Aber:

Ich habe ein Programm, welches ich nur zum Testen meiner Grafik-Engine und der Geometry-unit benutze.
in diesem Programm werden 20 Modelle zufällig plaziert und ausgerichtet. Sie drehen sich dann kontinuirlich um eine ebenfalls zufällige und für jeden Körper verschiedene Achse.

Hier wird die Vektorrotationsfunktion genutzt, da die Lage der Modelle durch eine Vektorbasis, welche gedreht wird, gespeichert wird.

Seit ich jetzt die neue Rotationsfunktion benutze, zucken die Körper abwechselnt (micht gleichzeitig) und Föllig zufällig herum. In unregelmäßigen abständen drehen sie sich ein stück in irgendeine Richtung !!!!

Dieser Fehler scheint absulut Chaotisch aufzutreten, abgesehen davon, dass sie sich meistens nicht besonders weit verdrehen. (Abgesehen davon funktioniert aber alles perfekt)

Hier die Funktion

Code:
  1. function GeoSVecRot(v: TGeoSVec; a: TGeoSVec; w: Single): TGeoSVec;
  2. var
  3.   an: TGeoSVec;
  4.   ssin,scos,sonecos: Extended;
  5. begin
  6.   an:=GeoSVecNor(a);
  7.   ssin:=sin(w);
  8.   scos:=cos(w);
  9.   sonecos:=1-scos;
  10.   result.x:=v.x*(sonecos*sqr(an.x)    +scos)+v.y*(sonecos*an.x*a.y+an.z*ssin)+v.z*(sonecos*a.z*an.x-an.y*ssin);
  11.   result.y:=v.x*(sonecos*an.x*a.y-an.z*ssin)+v.y*(sonecos*sqr(an.y)    +scos)+v.z*(sonecos*a.y*an.z+an.x*ssin);
  12.   result.z:=v.x*(sonecos*an.z*a.x+an.y*ssin)+v.y*(sonecos*an.y*a.z-an.x*ssin)+v.z*(sonecos*sqr(an.z)    +scos);
  13. end;


an ist die normalisierte Drehachse, v der zu drehende Vektor und w der Winkel

Der Selbe Fehler traht auf, als ich versucht habe, die sin/ cos Funktionen in der Geometry-unit durch die Benutzung vorgefertigter sin-cos-Arrays zu ersetzen!!! Diese Änderung habe ich daher aber wieder gelöscht.

Ach ja, mann muss eventuell etwas länger hinschaun um den Fehler zu sehen.

Hoffentlich kann mir jemand helfen :-(

_________________
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 Dez 17, 2004 19:06 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
Hier der Quelltext mit Programm:
http://laboda.delphigl.com/Test.ace
Und vielen Dank an laboda fürs Onlinestellen.

_________________
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: So Dez 19, 2004 13:14 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
Da der randomize Befehl fehlt, erscheint bei Programmstart immer wieder die selbe Modell-Stellung.

Da dass Programm jedoch die Drehgeschwindigkeit den Frames/Sekunde anpasst, erfolgt kein identischer Simulationsablauf.

Ersetzt mann jedoch im ApplicationEventsIdle das entsprechende t etwa durch 1/50, läuft die Simulation jedesmal identisch ab.

Code:
  1.   for i := 1 to Gra.ObjectNumber do
  2.     Gra.Objects[i].Direction:=GeoSBasToDir(GeoSBasRot(GeoSDirToBas(Gra.Objects[i].Direction),GeoSVecAdd(Gra.Objects [i].Color,GeoSVec(-1/2,-1/2,-1/2)),   1/50   ))


Dann erkennt mann, das die Fehler zwar nicht periodisch ablaufen (nach einem Fehler verändert sich ja auch die Ausrischtung des Körpers), sie aber bei jedem Programmstart wieder gleich ablaufen!!!

Es muss also eine Fehler in den Vektorrechnungsteilen vorliegen (oder???)

Da die Basenrotaion verwendet wird, entsreche dass folgendem code aus der Geometry-Unit:

Code:
  1. function GeoSBasRot(b: TGeoSBas; a: TGeoSVec; w: Single): TGeoSBas;
  2. var
  3.   m: TGeoSBas;
  4.   an: TGeoSVec;
  5.   ssin,scos,sonecos: Extended;
  6. begin
  7.   an:=GeoSVecNor(a);
  8.   ssin:=sin(w);
  9.   scos:=cos(w);
  10.   sonecos:=1-scos;
  11.   m.u:=GeoSVec(sonecos*sqr(an.x)    +scos,sonecos*an.x*a.y-an.z*ssin,sonecos*an.z*a.x+an.y*ssin);
  12.   m.v:=GeoSVec(sonecos*an.x*a.y+an.z*ssin,sonecos*sqr(an.y)    +scos,sonecos*an.y*a.z-an.x*ssin);
  13.   m.w:=GeoSVec(sonecos*a.z*an.x-an.y*ssin,sonecos*a.y*an.z+an.x*ssin,sonecos*sqr(an.z)    +scos);
  14.   result.u:=GeoSVecTraInv(m,b.u);
  15.   result.v:=GeoSVecTraInv(m,b.v);
  16.   result.w:=GeoSVecTraInv(m,b.w);
  17. end;


( B ist die zu drehende Basis, A die Achse, An die Normalisierte Achse und w der Winkel. Ich erstelle zuerst die Rotationsmatrix m und bilde dannach die einzelnen Basenvektoren lineare durch selbige ab)

Mich wundert jedoch immernoch, warum die Rotation bis auf diese kleinen Fehler zu funktionieren scheint!

(Meiner meinung habe nach habe ich die Rechnung auch richtig abgeschrieben :-) )

Idee ???

_________________
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: Mo Dez 20, 2004 16:44 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
Der Post war umsonst :-)

Naja habe den Fehler gefunden.

Eine Bestimmung der Winkel der Vektoren der Basen zueinander ergab, dass sie nicht exakt 90 Grad zueinander haben :oops: (Logisch, Mann nennt das Runden).
Jedenfalls sind diese Abweichungen bei der neuen Rotationsfunktion ungefähr 5-10 mal so groß wie bei meiner alten (Dafür ists halt auch 5 mal so schnell).

Lange rede kurzer sinn: Da ich die Lage nicht als Basis, sondern für OpenGL angepasst in drei Winkeln ablege, muss ich die Basis jedesmal aus den Winkeln berechnen, dann drehen und dann zurücktransformieren!
Und beim zurücktransformieren wird aus dem kleinen Fehler halt wenns dumm kommt ein großer :cry:

Also muss ich wohl diese Rücktransformation überarbeiten.

Aber in der Physikengine werde ich die Körperlage sowieso als Basis speichern und nur zur Darstellung 1x pro frame transformieren (Den Fehler kannn manbn auch alle par Schritte beheben), also ist dass alles kein problem.

Trotzdem danke an die zahlreichen vorschlege... Naja vielleicht war der Quelltext für einen Aussenstehenden auch arg unübersichtlich für ne kurze Fehlersuche.

_________________
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: Mo Dez 20, 2004 16:45 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
Der Post war umsonst :-)

Naja habe den Fehler gefunden.

Eine Bestimmung der Winkel der Vektoren der Basen zueinander ergab, dass sie nicht exakt 90 Grad zueinander haben :oops: (Logisch, Mann nennt das Runden).
Jedenfalls sind diese Abweichungen bei der neuen Rotationsfunktion ungefähr 5-10 mal so groß wie bei meiner alten (Dafür ists halt auch 5 mal so schnell).

Lange rede kurzer sinn: Da ich die Lage nicht als Basis, sondern für OpenGL angepasst in drei Winkeln ablege, muss ich die Basis jedesmal aus den Winkeln berechnen, dann drehen und dann zurücktransformieren!
Und beim zurücktransformieren wird aus dem kleinen Fehler halt wenns dumm kommt ein großer :cry:

Also muss ich wohl diese Rücktransformation überarbeiten.

Aber in der Physikengine werde ich die Körperlage sowieso als Basis speichern und nur zur Darstellung 1x pro frame transformieren (Den Fehler kannn manbn auch alle par Schritte beheben), also ist dass alles kein problem.

Trotzdem danke an die zahlreichen vorschlege... Naja vielleicht war der Quelltext für einen Aussenstehenden auch arg unübersichtlich für ne kurze Fehlersuche.

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


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 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.009s | 15 Queries | GZIP : On ]