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

Aktuelle Zeit: Fr Jul 18, 2025 08:57

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: retro-look durch isometrie
BeitragVerfasst: Do Jul 03, 2008 18:28 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
Dies ist keine Frage, sondern eine Antwort auf eine Frage, die noch nicht gestellt wurde, aber evtl. für den ein oder anderen nützlich sein könnte.
Hab mich nähmlich de letzten Tage mal mit den Perspektiven in Ogl beschäftigt und bin auf die Idee gekommen eine axiometrische Perspektive zu
schreiben. Genau genommen handelt es sich um eine militärperspektive bei der man die Neigung der Fläche durch eine variable angeben kann.

hier die funktion, die man einfach anstelle von gluperspective aufrufen muss:


Code:
  1.  
  2. type
  3.   Vec4 = record
  4.     x,y,z,w:glFloat;
  5.   end;
  6.  
  7.   pMatrix = array[(mat_XAchse,mat_YAchse,mat_ZAchse,mat_Position)] of Vec4;
  8.  
  9. function to_Vec4(x,y,z,w:real):Vec4;
  10. begin
  11.   Result.x := x;
  12.   Result.y := y;
  13.   Result.z := z;
  14.   Result.w := w;
  15. end;
  16.  
  17. procedure Iso(n,f,h,w,a:real);
  18. var
  19.   IsoMat : pMatrix;
  20. begin
  21.   glMatrixMode(GL_PROJECTION);
  22.   glLoadIdentity;
  23.  
  24.   IsoMat[mat_XAchse]:= to_Vec4( 1/w  , -a/h , -(1/w)/(f-n)*1/3  , 0 );
  25.   IsoMat[mat_YAchse]:= to_Vec4( 0 ,  1/h , -(1/h)/(f-n)*1/3   , 0 );
  26.   IsoMat[mat_ZAchse]:= to_Vec4( -1/w , -a/h, -(1/w)/(f-n)*1/3   , 0 );
  27.   IsoMat[mat_Position]:= to_Vec4( 0 , 0 , 0 , 1 );
  28.  
  29.   glLoadMatrixf(@IsoMat);
  30. end;
  31.  


zunächst hab ich einen 4d-vector und eine 4x4matrix definiert (den code kennt man aus dem wiki) und mit der procedure iso(); setzt man dann die perspektive,
n und f stehen hierbei wie erwartet für die near- und far-clipping-plane. h und w sind für Höhe und Breite der Ogl-Fläche und a ist dann die Steigung, wobei werte von 0.25-0.75 die vernünftigsten Ergebnisse erzielen.

die Achsen werden wie folgt auf dem Bildschrim abgebildet:
X läuft von links oben nach rechts unten, Y von unten nach oben und Z von rechts oben nach links unten. Tiefentest ist inklusive.

falls jemand noch einige Mängel findet, darf er sie gerne kund tun.

Für diejenigen, die sowas für 3d-Diagramme brauchen, kann ich auch noch eine Kavalierprojektion reinstellen, die man aus Mathebüchern kennen sollte.
in dem Sinne viel Spaß damit!

EDIT: man muss daran denken, dass die Einheiten auf dem Bildschirm in Pixel sind, das heißt, dass man höchstwahrscheinlich mit scalef(); arbeiten muss um auch auf vernünftige
Darstellungen zu kommen. scalef(32,32,32); sollte schon reichen, ein Block der weltgröße 1,1,1 ist dann etwa 32,32,32 pixel groß.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 03, 2008 19:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hast du zufällig lust, das ins Wiki zu übertragen? Das wäre doch eine wunderbare "Siehe auch"-Ergänzung zu gluPerspective als Artikel Isometrische Projektion.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 03, 2008 19:57 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
lust schon, wenn ich wüsst wie man das anstellt. Hab ja noch nie was ins wiki eingetragen und möcht da auch nicht etwas unausgereiftes reinstellen, deshalb erstma abwarten, obs verbesserungsvorschläge etc. gibt, damit dann definitiv was handfestes drin steht.

Ich geh mal davon aus, dass die meisten von euch schon Projekte auf die beine gestellt haben wo man mehr als nur ein paar klötze sehen kann, deshalb wäre ich froh,
wenn einige evtl. sich die paar minuten zeit nehmen würden, um das bei sich auch einmal auszuprobieren um zu schauen ob die Projektion tatsählich fehlerfrei ist.

Wie gesagt, man muss ja bloß den Projektionsmodus austauschen und die Datentypen mit hinein nehmen , so wie die Funktion für die vektoren.

Wenn das dann soweit in Ordnung ist geb ichs gern ins Wiki.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 04, 2008 10:29 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Wenn man die Berechnung zusammenführt und nur einmal macht, sollte das wahrscheinlich schneller sein:
Ausserdem kann man das glLoadIdentity weglassen, da eh die Matrix per glLoadMatrix neu gesetzt wird.

Code:
  1. type
  2. Vec4 = record
  3. x,y,z,w:glFloat;
  4. end;
  5.  
  6. pMatrix = array[(mat_XAchse,mat_YAchse,mat_ZAchse,mat_Position)] of Vec4;
  7.  
  8. function to_Vec4(x,y,z,w:real):Vec4;
  9. begin
  10. Result.x := x;
  11. Result.y := y;
  12. Result.z := z;
  13. Result.w := w;
  14. end;
  15.  
  16. procedure Iso(n,f,h,w,a:real);
  17. var
  18.   IsoMat : pMatrix;
  19.   OneThird,OneByW,OneByW,FMinusN,FNHelper,AByH : single;
  20. begin
  21. glMatrixMode(GL_PROJECTION);
  22.  
  23.  
  24. OneThird := 1 / 3;
  25. OneByW   := 1 / w;
  26. OneByH   := 1 / h;
  27. FMinusN  := f - n;
  28. FNHelper := - OneByW / FMinusN * OneThird;
  29. AByH     := a / h;
  30.  
  31. IsoMat[mat_XAchse]  := to_Vec4(  OneByW ,  -AByH ,                     FNHelper , 0 );
  32. IsoMat[mat_YAchse]  := to_Vec4(       0 , OneByH , -OneByH / FMinusN * OneThird , 0 );
  33. IsoMat[mat_ZAchse]  := to_Vec4( -OneByW ,  -AByH ,                     FNHelper , 0 );
  34. IsoMat[mat_Position]:= to_Vec4(       0 ,      0 ,                            0 , 1 );
  35.  
  36. glLoadMatrixf(@IsoMat);
  37. end;


Man könnte auch noch die to_Vec4 Funktion optimieren, indem man sie in eine Prozedure umwandelt und die Matrix als Referenz mitgibt. Oder die Matrix direkt als array[0..15] of single ansprechen, ohne den Umweg über eine Funktion.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


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


Wer ist online?

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