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

Aktuelle Zeit: Fr Jul 04, 2025 13:22

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Würfel eiert an oberer Ecke
BeitragVerfasst: So Jul 27, 2008 19:35 
Offline
DGL Member

Registriert: So Jul 27, 2008 15:23
Beiträge: 3
Hallo Ihr alle,

erst mal ein bewunderndes Lob an euch, was hier zum Thema OpenGL an Hilfen geleistet wird, ist enorm und kompetent.

Eins vorneweg: ich bin kein Delphi-Programmierer, äh, besser gesagt, überhaupt nicht Programmierer, mach nur schon jahrelang mit allemöglichem (html Office-vb etc) rum, und auch mit FreeBasic, alles Hobby-mäßig.
Und als FreeBasic-ler bin ich nun hier, mit einer Frage zu OpenGL:

Hab mich in Sachen OpenGL eingelesen, ausprobiert, teilweise gleich recht gut verstanden und auch schon einige einfachste Sachen gleich hingekriegt.
Eine Kamerasteuerung über Cursortasten z.B., mit der ich in meiner kleinen 3D-Welt hin und herlaufen, drehen umgekehrte Blickrichtung und entsprechend der Sichtrichtung angepaß vorwärts/rückwärtslaufen kann, steht auch schon, denke, das sagt etwas über mein Wissen zu glRotate aus.
Wollte mir dann grad einbilden, daß ich schon gut darin bin, bis ich mit einem Würfel angefangen hab :-(

Ja, genau das, 6 quads, direkt die Positionen in eine glBegin glEnd-Quadliste rein, je 2 gegenüberliegende Seiten
in R dann G dann B gefärbt, R=X-Achse, G=Y-Achse, B=Z-Achse. Alles kein Problem.

im Koordinatensystem den Würfel mit der linken, unteren, vorderen Ecke auf 0,0,0 plaziert.
um 45Grad um die Z-Achse gedreht, vorderes Quadrat steht nun auf Spitze.
Nochmal um 45Grad um die X-Achse gedreht, hatte mir erträumt, der Würfel stünde jetzt komplett aus 2 Seiten
um 45Grad hochgestellt, die untere Spitze/Ecke und die Obere wären jetzt auf einer senkrechten Linie.
Es sieht auch erst mal so aus.

Dann den Würfel in Dauerrotation versetzen um eben diese senkrechte Linie durch die jetzige Mitte/Spitzen.

Oha, die obere Ecke "eiert" rum. Boah. --- Das war ca. gestern Mittag. Allwissendes Internet durchgoogled,
zum Thema Würfel in Kombination mit "auf Ecke" oder "auf Spitze" kommt gleich mal nix informatives.
Viele Foren durchsucht, nix.

Entweder hab nur ich das Problem, aber wahrscheinlich stellt das für die "Anderen" kein wirkliches Problem dar :-(
==> ich bin n happen zu doof dafür.

Klar, nach ner halben Stunde Recherche war mir dann klar, die zweite Rotation um das 2.Mal 45Grad, diesmal um
die XAchse, findet dann um das bereits um 45Grad gedrehte Koordinatensystem durch die erste Drehung statt.

Also das ganze mal auf ein Stück Papier aufgemalt.
Mit den entstehenden Winkel und dazugemalten Dreiecken des gekippten Koordinatensystems sowie die durch Kippen immer höher wandernde obere Ecke rumgerechnet.
Da stehen z.B. Formeln aufm Zettel ß=arctan(b/a) und b=sqr(z*z+x*x+y*Y), aber rauskommen tut nix wirklich helfendes.

Mit nem Testprogramm, bei dem ich den Würfel per Cursortasten erst 1Gradweise dann 0.1 und zum Schluß 0.01Gradweise vor und zurück kippen konnte, kam ich auf eine Annäherungswert, der zwischen 35.28 und 35.29 Grad liegen muß.
Also das erste Kippen um die Z-Achse um 35.28grad, das Zweite um die X-Achse um 45 Grad, dann ist die obere
Spitze fast ruhig.

Den Würfel kann ich also (fast) ohne "eiern" laufen lassen, aber ne Formel dafür hab ich nicht rausgekriegt.
Zugegeben, Schule ist schon ettliche Jahre her, wer weiß, ob die das damals überhaupt erklärt hatten, vielleicht war ich auch in dem Moment grad Kreide holen oder so...

Jedenfalls in euerem Forum vermute ich nun Spezialisten, die mir diese Formel erklären können.

Hab mein "Würfelprogramm" mal soweit wie möglich entschlackt, hier das Listing (hoffe Ihr könnt Basic lesen )
Code:
  1. REM Vergleichen ob sinus CASIO PB700 = Sinus Freebasic
  2. REM
  3. REM Hintergrund: Winkelgrade / dezgrade als Para?
  4.  
  5. '-------------------------
  6. 'DIMs
  7. DIM AS DOUBLE Pi, DrehgradZaehler
  8. Pi = 3.14159265358979323846
  9. 'rotate.bas    -  Eastler 27juli2008  - erzeugt einen Würfel, stellt den auf Ecke
  10. '                 doch die Drehung um innere Achse läßt Würfel an oberer Spitze
  11. '                 "eiern"
  12. '-------------------------
  13. 'Includes
  14. '-------------------------
  15. #include "fbgfx.bi"
  16. #include once "GL/gl.bi"
  17. #include once "GL/glu.bi"
  18. #include once "vbcompat.bi" 'um Zahlen per "format()" formatieren zu können
  19.  
  20. '-------------------------
  21. 'Declarationen
  22. '-------------------------
  23. DECLARE SUB Wuerfel()
  24.  
  25. '-------------------------
  26. ' das Fenster öffnen
  27. '-------------------------
  28. screen 19, 16, , 2
  29.  
  30. '-------------------------
  31. ' Open-GL Init
  32. '-------------------------
  33. glViewport 0, 0, 800, 600                      ' den Current Viewport auf eine Ausgangsposition setzen
  34. glMatrixMode GL_PROJECTION                     ' Den Matrix-Modus Projection wählen
  35. glLoadIdentity                                 ' Diesen Modus auf Anfangswerte setzen
  36. gluPerspective 45.0, 800.0/600.0, 0.1, 100.0   ' Grundeinstellungen des Anezeigefensters festlegen
  37. glMatrixMode GL_MODELVIEW                      ' Auf den Matrix-Modus Modelview schalten
  38. glLoadIdentity                                 ' und auch diesen auf Anfangswerte setzen
  39. glClearColor 0.5, 0.5, 0.50, 0.0               ' Setze Farbe für löschen auf Mittelgrau
  40. glClearDepth 1.0                               ' Depth-Buffer Löschen erlauben
  41. glEnable GL_DEPTH_TEST                         ' den Tiefentest GL_DEPTH_TEST einschalten
  42. glClear GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT  'Tiefen- und Farbpufferbits löschen
  43. '---------------------------
  44. 'HAUPTTEIL
  45. '---------------------------
  46.  
  47.  
  48.  
  49. DO WHILE INKEY=""
  50.    glClear GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT  'Tiefen- und Farbpufferbits löschen
  51.  
  52.    glPushMatrix                           :'Matrixzusatand sichern
  53.    glTranslatef 0, -1, -3                 :'um 3 Einheiten von Kamera weg und eine Einheit
  54.                                           :' tiefer, dann ist der Würfel gut zu sehen
  55.    glRotatef DrehgradZaehler, 0, 1, 0     :'Dauerrotation um Y-Achse
  56.    glRotatef 45, 1, 0, 1                  :'auf Ecke, die auf 0,0,0 erzeugt wurde, stellen
  57.                                           :'   (45Grad um X und 45Grad um Y)
  58.    wuerfel()                              :'Die SUB "Würfel" aufrufen, die den Würfel erstellt.
  59.    flip                                   :'alles auf Monitor
  60.    glPopMatrix                            :'Matrixzusatand wieder herstellen
  61.    DrehgradZaehler = DrehgradZaehler + 1  :'Wert für Dauerrotation erhöhen
  62. LOOP
  63.  
  64. '---------------------------
  65. SUB Wuerfel()
  66.          glBegin GL_QUADS
  67.             'einfach ein Würfel, untere vordere Ecke auf 0,0,0
  68.             '   untere Seite, von unten draufschauend, GEGEN den Uhrzeigersinn
  69.                 glColor3f  0 , 1 , 0
  70.             glVertex3f 1 , 0 , 0
  71.             glVertex3f 0 , 0 , 0
  72.             glVertex3f 0 , 0 , -1
  73.             glVertex3f 1 , 0 , -1
  74.             '   obere Seite, von oben draufschauend, gegen Uhrzeigersinn
  75.             glVertex3f 1 , 1 , 0
  76.             glVertex3f 1 , 1 , -1
  77.             glVertex3f 0 , 1 , -1
  78.             glVertex3f 0 , 1 , 0
  79.             '   vordere Seite
  80.                 glColor3f  0 , 0 , 1
  81.             glVertex3f 1 , 1 , 0
  82.             glVertex3f 0 , 1 , 0
  83.             glVertex3f 0 , 0 , 0
  84.             glVertex3f 1 , 0 , 0
  85.             '   hintere Seite
  86.             glVertex3f 1 , 1 , -1
  87.             glVertex3f 1 , 0 , -1
  88.             glVertex3f 0 , 0 , -1
  89.             glVertex3f 0 , 1 , -1
  90.             '   linke Seite
  91.                 glColor3f  1 , 0 , 0
  92.             glVertex3f 0 , 1 , 0
  93.             glVertex3f 0 , 1 , -1
  94.             glVertex3f 0 , 0 , -1
  95.             glVertex3f 0 , 0 , 0
  96.             '   rechte Seite
  97.             glVertex3f 1 , 1 , 0
  98.             glVertex3f 1 , 0 , 0
  99.             glVertex3f 1 , 0 , -1
  100.             glVertex3f 1 , 1 , -1
  101.          glEnd
  102. END SUB


Nun hoffe ich, daß Ihr auch OpenGL-Probleme aus anderen Programmiersprachen überdenkt und natürlich, daß jemand die Rechenformel kennt und mir erklärt.

Jedenfalls schon mal besten Dank für euere "Anteilnahme" (smile) an meinem Problem

euer Eastler


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 27, 2008 23:02 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Versteh ich dich richtig, dass du deinen Würfel um eine "Raumdiagonale" rotieren lassen willst? Nur damit ganz klar ist was genau du willst.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 28, 2008 00:08 
Offline
DGL Member

Registriert: So Jul 27, 2008 15:23
Beiträge: 3
hi flash,

Raumdiagonale? ne, ne.

Schlicht und einfach:
Leg einen Würfel vor dich hin.
Dreh ihn aus zwei Richtungen um 45 Grad = er steht spitz auf einer Ecke, eine gegenüberliegende Ecke streckt sich nach oben. So. Nun denk dir eine Gerade von oben senkrecht durch die obere Spitze(Ecke), unten aus der unteren Spitze(Ecke) wieder rauskommend. Diese gerade entspricht dann gleichzeitig der Y-Achse, um die dreh ich den Würfel dann.

Grad so, wenn man bei einem Spiel(Mensch ärgere dich nicht oder so) über den Tisch würfelt, und der Würfel "tanzt/rotiert" dann erst ne Weile auf einer Ecke, bis er endlich fällt.

Hoffe, ich konnte das einigermaßen erklären.

Eastler


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 28, 2008 10:47 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Mach die Dauerrotation mal nach den 45 Grad Rotationen, da die Reihenfolge bei Rotationen wichtig ist!

Gruß,
Matreno

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 28, 2008 13:37 
Offline
DGL Member
Benutzeravatar

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

das kann so ohne weiteres leider nicht klappen was du vorhast.

Mit glRotate kannst du immer nur im "lokalen" space des objektes rotieren, was du aber möchtest ist das Object erst lokal hinrotieren und dann um die Y-Weltachse drehen.

Das geht nur mit glRotate nicht, dafür müßtest du selbst ausrechnen wie du im lokal-space rotieren mußt um auf die rotation zu kommen die du möchtest (also um mehr als nur eine achse aufeinmal drehen).

Wie genau das geht kann ich dir leider nicht sagen, da können dir die mathe genies hier eher helfen ;)

Aya


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 28, 2008 16:25 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Zitat:
Grad so, wenn man bei einem Spiel(Mensch ärgere dich nicht oder so) über den Tisch würfelt, und der Würfel "tanzt/rotiert" dann erst ne Weile auf einer Ecke, bis er endlich fällt.


Also doch die Raumdiagonale. Z.B. die von vorn,links,unten nach hinten, rechts, oben geht. ;)

Aber Aya scheint deine Frage schon beantwortet zu haben.

Wobei, einen würfel auf der Spitze rotieren lassen... das sollte doch gehn. :roll:

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 28, 2008 18:57 
Offline
DGL Member

Registriert: So Jul 27, 2008 15:23
Beiträge: 3
hallo alle,

@flash: sorry, aber ich hatte nicht gleich begriffen, was Du/Ihr mit "Raum"diagonale "Raum"Achse meinst/meint. sorry

@Aya: ja, du hast Recht, es geht nicht, per glRotate auf zwei Achsen um 45Grad zu drehen und zu denken, es läuft jedesmal vom selben Ursprung aus. Dabei spielt es auch keine Rolle, ob ich das als Zweizeiler:
glRotatef 45, 1, 0, 0
glRotatef 45, 0, 0, 1
oder über einen Einzeiler:
glRotatef 45, 1, 0, 1
mache, das hab ich durchprobiert.
Aber es geht, wenn ich das Erste kippen mit ca 35.28Grad mache und danach um die zweite Achse mit 45 Grad drehe:
glRotatef 35.28, 1, 0, 0
glRotatef 45.00, 0, 0, 1
Danach stehen zwei gegenüberliegende Ecken des Würfels wirklich senkrecht im Raum ;-)
Nur, diesen Wert von 35.28 hab ich per ausprobieren ermittelt. Und das läßt sich bestimmt auch mit Formeln berechnen, aber genau da hab ich jedesmal den falschen Weg oder so, jedenfall paßt das errechnete Ergebnis nicht.

@All
Dieses zwei mal Kippen und dann Rotieren hab ich mittlerweile als *.gif-Film zusammengestellt, zum besseren Verständnis. Jedoch hab ich die angedeuteten Koordinatenachsen NICHT mit dem Würfel mitgedreht (was die eigentlichen Achsen ja machen), damit man die Abweichung von meinem Ziel besser sieht:
Bild
P.S: der Filmteil mit dem Dauerdrehen findet auf ner anderen Position statt, aber was ich zeigen will, kann man trotzdem erkennen

Bilder sagen bekanntlich mehr als tausend Worte, hier erst recht.

bin ja gespannt, ob jemand diese Nuß knacken kann, dankbar bin ich für eueren Einsatz jetzt schon,

happy grübeling, Eastler


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 28, 2008 20:48 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
funktioniert
glRotate(45°,(-1,1,0))
glRotate(Omega*t,(1,1,1))
?

edit: Der winkel den du ausprobiert hast ist vermutlich arctan(sqrt(0.5))=35.2643896828°

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 29, 2008 09:00 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Was mir gerade noch eingefallen ist: Du könntest die Würfel-Koordinaten ja von Hand berechnen, also so, dass er schon in der Position ist, in der du ihn um Y drehen willst... Dann bräuchtest du nur noch glrotate(Value, 0, 1, 0) machen.
Die Umrechnung sollte nicht allzu schwer sein ein bisschen sin und cos.

_________________
http://texelviews.delphigl.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 » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 4 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 | 15 Queries | GZIP : On ]