![]() |
OpenGL Einsteiger Frage
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
Ich bin gerade dabei OpenGL zu lernen, und zu verstehen. Heute habe ich damit angefangen und habe ein Problem. Ich lasse ein viereck um die y-Achse rotieren:
Delphi-Quellcode:
Im Anhang die Exe mit dem Viereck das Rotiert.
unit Unit1;
interface uses Windows,Forms,dglOpenGL, ExtCtrls, Classes; type TForm1 = class(TForm) Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Render; procedure Timer1Timer(Sender: TObject); end; var Form1: TForm1; DC : HDC; //Handle auf Zeichenfläche RC : HGLRC;//Rendering Context test: extended; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin // Erstellen DC:= GetDC(Handle); RC:= CreateRenderingContext( DC,[opDoubleBuffered],32,24,0,0,0,0); ActivateRenderingContext(DC, RC); glClearColor(0.3, 0.4, 0.7, 0.0); // Hintegrund glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); end; procedure TForm1.FormDestroy(Sender: TObject); begin // Vernichten DeactivateRenderingContext; DestroyRenderingContext(RC); ReleaseDC(Handle, DC); end; // Render = Zeichnen procedure TForm1.Render; begin glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity; gluPerspective(100, ClientWidth/ClientHeight, 1, 1000); glMatrixMode(GL_MODELVIEW); glLoadIdentity; glTranslatef(0, 0, -10); glRotatef(test,0,1,0); glBegin(GL_QUADS); glColor3f(0, 0, 0); glVertex3f(-5, -9, 1); glColor3f(0, 0, 1); glVertex3f(9, -9, 1); glColor3f(0, 0, 1); glVertex3f(9, 6, 1); glColor3f(0, 0, 1); glVertex3f(-5, 6, 1); glEnd; SwapBuffers(DC); end; procedure TForm1.Timer1Timer(Sender: TObject); begin Render; test:=test+4; end; end. Was ich jetzt nicht verstehe: Warum verschwindet das Viereck für eine kurze Zeit? Ich müsste es doch die ganze Zeit sehen... Ich habe schon ein Blatt papier vor mir Rotieren lassen um es mir vor zustellen, aber ich kapier es nicht. Es müsste doch nur einen MOment nicht zu sehen sein, bei genau 90°... Kann mir wer das Erklären, so das ich mir das Räumlich vorstellen kann? Oder vielleicht bin ich auch schon zu müde...... gähn |
Re: OpenGL Einsteiger Frage
Das Stichwort ist BackFace Culling was du mit der Zeile
glEnable(GL_CULL_FACE); eingeschaltet hast... ![]() ![]() |
Re: OpenGL Einsteiger Frage
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
danke ohne den glEnable(GL_CULL_FACE); geht es, muss mir mal raussuchen was das bewirkt....... Nach den Links die du mir geschickt hast lerne ich das ganze schon^^ ED: Habs gefunden ![]() |
Re: OpenGL Einsteiger Frage
Hallo,
Jetzt habe ich ein neues Problem, eigentlich eher eine Frage. Zitat:
![]() Das trifft doch nur zu wenn ich OnIdle verwende, oder? Wenn ich, wie in meinen einen Timer verwende, und das Interval so ca. auf 100ms stelle, dann sollte es auf jeden Rechner gleich laufen, oder? Oder brauche ich beim Timer auch so was wie
Delphi-Quellcode:
NewPosition := OldPosition + Movement * TimeFactor;
|
Re: OpenGL Einsteiger Frage
Es ist immer Besser wenn du eine Zeitstakklierung machst.
Denn deine Timer Variante funktioniert nur dann wenn der Teil der Berechnet wird << Timer.interval dauert. zudem hast du bei Timer.interval = 100 ms ja nur 10 fps was ein wenig Arg wenig wäre. |
Re: OpenGL Einsteiger Frage
Hallo,
daweil brauche ich nicht mehr als 10FPS, ich lerne OpenGL ja erst gerade... Und ich denke das jeder halbwegs normale Prozessor alles mit 10FPS verarbeiten kann und möchte deshalb daweil auf eine Zeitstakklierung. Mit 10 FPS wird die Anwendung doch auf jeden PC gleich laufen, oder? |
Re: OpenGL Einsteiger Frage
Ja, außer der Rechner ist nicht in der Lage, die 10fps einzuhalten, aus welchem Grund auch immer. Fang lieber direkt mit einer Zeitskalierung an, besonders aufwändig ist es nicht und früher oder später kommst du sowieso nicht drumherum. Das ist ein bisschen wie das typische "i don't expect this code to be used in 2 years from now" auf thedailywtf.com. Wohlgemerkt wurde dieser Kommentar mehr als 10 Jahre danach in Produktionscode gefunden. Im Endeffekt brauchst du sowas wie die Zeitskalierung sowieso, wenn du nicht überall Literale in den Code hämmern willst. Also ob du nun
Code:
oder
pos := pos + movementPerFrame;
Code:
schreibst, ist nun wirklich kein großer Unterschied, das zweite läuft aber auf sehr langsamen Maschinen immer noch und schnelle Maschinen haben mehr als deine 10FPS, ohne dass die Bewegung schneller läuft.
pos := pos + movementPerSecond * elapsedTime;
|
Re: OpenGL Einsteiger Frage
Die Frage ist ob du überhaupt nen Timer Brauchst.
Wenn du nur Änderungen hast wenn der User Was Klickt dann kannst du deine Render Function auch immer nur dann aufrufen, und sparst dir den Timer Komplett. Wenn du mal wissen willst was mit Delphi und OpenGL alles möglich ist hier ein kleines ![]() |
Re: OpenGL Einsteiger Frage
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
das Game is super, nur ein wenig sehr schwer, schon das 1 Level braucht ne weile...... Ich hoffe sowas bekomme ich in der Zukunft auch zusammen. Bin ja fleißig am lernen :thumb: Kannst du mir bei einen weitern Problemm helfen? Ich versuche eine Textur auf ein Viereck zuladen, aber die Textur erscheint nicht, und nur das Viereck ist zu sehen. Ich habe keine Ahnung warum das nicht geht..... Im Anhang das Projekt |
Re: OpenGL Einsteiger Frage
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
Es ist immer wieder Faszinierend wie viele Verschiedene versionen es Gibt OpenGL in ein Programm ein zu binden. Der Grund warum du nichts siehst ist weil dein JPG nicht geladen wird. Der Pointer ist = nil. ich mache das aber Komplett anders daher kann ich dir nicht sagen wie du SDL da Parametrieren must. Da ich dich nu aber nicht so im Regen stehn lassen will, habe ich mal meine Art und weise die Bilder zu laden eingebaut. Und diese tut wunderbar. ( und toller weise ohne weitere DLL ) |
Re: OpenGL Einsteiger Frage
Hallo,
danke es klapt wunderbar, hätte ich vorher schon gewußt das es so einfach ist^^ schön wie du dich um mich kümmerst :-D Eine letzte Frage habe ich noch, dann sollte ich mal so weit sein, mein erstes kleineres Programm zum schreiben: Ich habe mir mit
Delphi-Quellcode:
ein Viereck gemacht.
glBegin(GL_Quads);
glcolor3f(1,0,0); glVertex3f(0,0,0); glVertex3f(1,0,0); glVertex3f(1,1,0); glVertex3f(0,1,0); glEnd; Mit
Delphi-Quellcode:
Kann ich es um eine Achse drehen.glrotatef(100,0,1,0); Also in diesen Fall um die y-Achse. Um eine bestimmte Achse zu bestimmen, um die sich etwas drehen soll, braucht man einen Punkt + Vektor. Der Vektor ist in meinen Fall (0/1/0) und der Punkt (0/0/0). Wie ich den Vektor ändern kann versteh ich
Delphi-Quellcode:
=
glrotatef(100,0,1,0);
glrotatef(Grad,Vektor_x,Vektor_y,Vektor_z); Aber wie kann ich den Punkt ändern? Ich meine wie kann ich eine Linie angeben, um die das Viereck rotieren soll, die nicht vom 0/0/0 Punkt ausgeht? Hoffe ich habe mein Problem gut genug erklärt. |
Re: OpenGL Einsteiger Frage
Also kleiner Hoffnungschimmer.
Das "Game" war mein 1. OpenGl Project. Damit habe ich OpenGL gelernt und genau gesagt lerne ich es ja eigentlich immer noch. Da mir der schatten ja leider immer noch fehlt :( zu Deiner Frage. Probier mal
Delphi-Quellcode:
Wenn ich dich Richtig verstanden habe müste das deiner Frage entsprechen.
Type T3dPoint = Record
x,y,z:single; end; var yangle,rotpoint:T3dPoint; begin .. gltrangslatef(-rotpoint.x,-rotpoint.y,-rotpoint.z); glrotatef(angle,0,1,0); gltrangslatef(rotpoint.x,rotpoint.y,rotpoint.z); .. End; |
Re: OpenGL Einsteiger Frage
Hallo,
ja das wars danke. So jetzt hab ich schon wieder eine Frage :-D Wenn ich mit
Delphi-Quellcode:
ein Viereck mache, und ich drehe es, dann sieht man, das das Viereck keine "dicke" hat, es ist dünn wie Pappier.
glVertex3f(0,0,0);
glVertex3f(1,0,0); glVertex3f(1,1,0); glVertex3f(0,1,0); Kann ich irgendwie eine "dicke" machen, also zum Beispiel ein Quader, oder einen anderen 3D Körper? |
Re: OpenGL Einsteiger Frage
Nein. Wenn dann musst du einen Quader bauen um einen Dicke darzustellen.
|
Re: OpenGL Einsteiger Frage
HI,
das hab ich eh schon gemacht, dachte es geht einfache :-( Aber ein anderes problem, ich lade jetzt so Texturen
Delphi-Quellcode:
procedure TForm1.InitTextur;
begin LoadTexture('1.jpg', textur1); LoadTexture('2.jpg', textur2); end; Und so dann auf die Flächen
Delphi-Quellcode:
Aber bei beiden Flächen wird die Textur 1 angezeigt, warum?
glBegin(GL_Quads);
glBindTexture(GL_TEXTURE_2D,textur1); glTexCoord2f(0, 0); glVertex3f(0,0,0); glTexCoord2f(0, 1); glVertex3f(1,0,0); glTexCoord2f(1, 1); glVertex3f(1,1,0); glTexCoord2f(1, 0); glVertex3f(0,1,0); glBindTexture(GL_TEXTURE_2D,textur2); glTexCoord2f(0, 0); glVertex3f(0,0,1); glTexCoord2f(0, 1); glVertex3f(1,0,1); glTexCoord2f(1, 1); glVertex3f(1,1,1); glTexCoord2f(1, 0); glVertex3f(0,1,1); glEnd; Bzw. wie mach ich es richtig? |
Re: OpenGL Einsteiger Frage
Kan grad nur raten, aber mach mal den GLQuad Mode zwischen drin zu und wieder auf
Delphi-Quellcode:
Übrigens wenn ind GLcolor4f andere werte sind kannst du deine Texturen damit ein wenig "einfärben" ;)
glcolor4f(1,1,1,1);
glBindTexture(GL_TEXTURE_2D,textur1); glBegin(GL_Quads); glTexCoord2f(0, 0); glVertex3f(0,0,0); glTexCoord2f(0, 1); glVertex3f(1,0,0); glTexCoord2f(1, 1); glVertex3f(1,1,0); glTexCoord2f(1, 0); glVertex3f(0,1,0); glEnd; glBindTexture(GL_TEXTURE_2D,textur2); glBegin(GL_Quads); glTexCoord2f(0, 0); glVertex3f(0,0,1); glTexCoord2f(0, 1); glVertex3f(1,0,1); glTexCoord2f(1, 1); glVertex3f(1,1,1); glTexCoord2f(1, 0); glVertex3f(0,1,1); glEnd; |
Re: OpenGL Einsteiger Frage
Hallo,
danke so gehts. So jetzt probier ich aber echt mal ein kleines Spiel, kann man eigentlich bei den Texturen aktivieren, das sie Transparent sein sollen? |
Re: OpenGL Einsteiger Frage
Liste der Anhänge anzeigen (Anzahl: 1)
Ja und Nein,
Das geschieht dann über einen Aplha Kanal. In Balanced mache ich das zumindest so. da es dafür aber noch Kein Sample auf meiner HP Gibt. habe ich dir einfach mal die entsprechende Unit aus Balanced hochgeladen. Sie ist aber nicht Kommentiert :( Für Dich Wichtig ist die Klasse "TOpenGL_Transparent_Image" denn die Zeigt wie man das Macht. |
Re: OpenGL Einsteiger Frage
Liste der Anhänge anzeigen (Anzahl: 2)
Ich tuh Dir auch mal ein Peispiel trann stellen. :mrgreen:
Ein VCL - OpenGL Sample mit Licht, Material und Texturing sowie einfaches Blending bzw. Transparenz. Alle gebrauchten Dateien sind mit dabei. (hoff ich mal :stupid: ) |
Re: OpenGL Einsteiger Frage
Hallo,
ich habe mir beide Lösungen angeschaut, aber ich glaub das ist doch zuviel für den Anfang, ich werde mal mit einfachen Sachen anfangen. Wie macht man eigentlich eine Kugel? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz