Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
pluto hat geschrieben:
Genau, das ist halt mein problem: ich verstehe noch nicht diese 3D ansicht.....mal sehen wie weit ich komme;)
Wenns schon an der 3D-Ansicht (und damit den Matrizen) hapert, dann vergiss die Sache mit Skyroads lieber und besorg dir auf Amazon.de ein gutes Buch zum Thema lineare Algebra.Alternativ solltest du dir auch natürlich unser Mathe-Tut durchlesen, in dem eigentlich alles wichtige drinnesteht.
Auch sehr hilfreich ist das Redbook, das auch detailliert auf die Matrizen bzw. deren Rotationen und Translationen eingeht...allerdings gibts das nur auf Englisch.In meinen Augen ist das Redbook allerdings ein für jeden, der OpenGL ernsthaft nutzen will unverzichtbares Dokument, bringt es doch alle wichtigen Grundlagen bei und erklärt diese fast bis ins kleinste Detail.
Ein Tipp noch - damit du wenigstens ein Erfolgserlebnis hast (ich nehme an, in DrawBahn ist der Würfel) <!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre> <span class='reserved'>begin</span> glClear(GL_COLOR_BUFFER_BIT <span class='reserved'>or</span> GL_DEPTH_BUFFER_BIT); glLoadIdentity; glTranslatef(<span class='integer'>0</span>,-<span class='integer'>2</span>,-<span class='integer'>10</span>); glRotatef(<span class='integer'>20</span>,<span class='integer'>1</span>,<span class='integer'>0</span>,<span class='integer'>0</span>); DrawBahn; glTranslatef(<span class='integer'>0</span>,<span class='integer'>0</span>,<span class='integer'>1</span>); DrawBahn; glTranslatef(<span class='integer'>0</span>,<span class='integer'>0</span>,<span class='integer'>1</span>); DrawBahn; ... SwapBuffers(h_DC); <span class='reserved'>end</span>; </pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->
Mit deinem Code wirst du kaum was sehen, weil du nämlich im ersten Würfel drinsteckst . Ansonsten stimme ich SoS Didaktik durchaus zu - im Endeffekt sparst du dir (und anderen) viel Zeit, wenn du versuchst zu verstehen was du machst. Als nächstes (NACHDEM du SoS Ratschläge beherzigt hast) kannst du versuchen ein 2D-Feld aus Booleans zu erstellen - das gehst du dann durch und zeichnest bei TRUE einen Würfel und bei False eben keinen - Problem: die richtigen glTranslate Kommandos rausfinden (ist aber einfach). Ausserdem spielst du mit dem ersten glTranslate und glRotate Kommando, damit du mal ein Gefühl bekommst, wie die Darstellung in 3D funktioniert.
Registriert: So Mai 11, 2003 10:36 Beiträge: 285 Wohnort: Oldenburg
Programmiersprache: Object Pascal
ich kanns vergessen ich schaffes es einfach nicht mich durche diese welt zu bewegen, mal sehe ich nichts, mal nur etwas. ich glaube ich lasse es mit puren OpenGl, es bringt ja wenig für mich, wenn ihr mir alles sagt. ich verstehe nicht wo in OpenGl -1 ist in welcher bildlage bei 2 d wares es ja noch einfach: die linke obere ece ist der 0 punkt
01234566788 1 2 3 4 5 6 7
so konnte man genau und einfach zeichen wie man wollte, und wie ist das bei 3D ?
_________________ MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus
mh... @Pluto: Ich weiß, ich hab dir das schon mehrmals geraten, aber glaub mir... es bringt was Wenn du (wie du ja selbst sagst) keine ahnung von der 3D Ansicht hast, dir halt nich vorstellen kannst: "Was passiert'n da jetzt wenn ich den Würfel um 30° drehe und um 3 auf der Z Achse verschiebe?", da würde ich dir nach wie vor dringend raten dich mit irgendnem 3D Programm mal kräftiger ausseinander zusetzen.
Hat 2 Vorteile: 1.) Wenn du später mal richtige sachen mit OpenGL machen willst, wirst du früher oder später sowieso den umgang mit 3D Programmen lernen müßen.. also lieber zu früh als zu spät
2.) Durch so ein Programm lernt man ziemlich gut die dinge im 3D Raum... also dort lernt man gut was es heißt nen Würfel um 30° auf der Y-Achse zu Rotieren, oder zu Scalieren etc..
Und ich denke mal, nachdem ich dich ja nun schon ne ganze Zeit lang kenne, das dir z.B. das MatheTutorial kein stück helfen wird bei deinem Problem... und was gibt es besseres als sowas einfach auszuprobieren??
Wenn du nun wieder mit der Ausrede ankommst "Die Programme sind so kompliziert" etc... Dann kann ich dir auchnich helfen, sie sind halt Kompliziert und man lernt sie nich mal so eben wie manch andere Progs.
Ich hab mich mit Maya ja auch nich an 1 Tag zurechtgefunden, hat schon nen weilchen gedauert bis ich da was anständiges machen konnte mit (Es heißt sogar, Maya kann man nur in nem Studium o.Ä. richtig lernen, und dem stimme ich mittlerweile 100%ig zu.. dieses Programm ist so dermaßen umfangreich, das kann man nich alles mit Ausprobieren rausbekommen, unmöglich )
Aber trotzdem, für die grundlagen reicht es allemal.
@Matritzen etc.: Ich hab wenn ich ganz ehrlich bin auch nich viel ahnung von dem Mathe Kram.. also Lineare Algebra und so... absolut 0 ahnung von... ich bekomme es grad noch hin was anhand ner Matrix zu verschieben oder so, aber das war's schon
Also... einfach mal nen 3D Editor vornehmen und damit rumspielen. (Ich würde 3DSMax empfehlen, ich glaube da ist der einstieg ein wenig leichter als bei Maya :unsure: )
Wenn du es dann geschafft hast mit dem 3D Editor ein Raumschiff (o.Ä.) zu erstellen, dann kannste dich wieder an OpenGL setzen.. aber solange es da hapert... na ja...
X und Y sind genauso wie beim 2D System die Höhe und Breite... nur wenn du jetzt nen Pixel bei X=2 und Y=4 malen willst, mußt du halt noch die Tiefe (entfernung vom Betrachter) als Z wert mit angeben..
ich glaube ich lasse es mit puren OpenGl, es bringt ja wenig für mich, wenn ihr mir alles sagt
Also irgendwie möchte (nicht nur) ich dir ja schon helfen - zumindest steckst du doch einige Zeit hinein, dich im Forum durchzufragen, und schwer ist aller Anfang :rolleyes: . Aus diesem Grund habe ich dir ein kleines Demo zusammengestellt, das ein 2-Dimensionales Feld aus Würfeln darstellt - lad's dir runter, schau's dir an, spiel damit herum (Demo ist reiner OpenGL Code, sämtliche benötigten Initialisierungsfunktionen sind in der DPR - sodass dir das Progrämmchen auch als Template für anderes dienen kann).
Ich denke für Skyroads musst du dich auch nicht so sehr mit 3D-Transformationen auseinandersetzen - im Prinzip ist es ja nur ein gekipptes 2D-Spiel. Als erste Übung versuchst du das dargestellte Array zu vergrößern, ausserdem soll der Beobachter mit den Cursortasten nach oben und unten schauen können. Wenn erst mal der erste eigene Code funktioniert, schaut die Welt (nicht nur hinter dem Bildschirm) viel schöner aus.
if Key[VK_LEFT] = True then glTranslatef(1,0,0);
if Key[VK_RIGHT] = True then glTranslatef(0,1,0);
geschrieben aber das bild springt immer zurück, warum ??? aber tolle sache, so lehnre ich die 3D ansicht kennen:) und wie könnte man es nach 3D machen ?
_________________ MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus
Aya meint damit, dass die X-Achse waagrecht, die Y-Achse senkrecht und die Z-Achse in die Tiefe geht (was sich mit ein paar ASCII Zeichen leider schlecht darstellen lässt). Manche Leute haben es lieber, dass X- und Y- Achse den "Boden" Definieren - dann wäre die Z-Achse die Höhe - ich halte aber auch die erstere Version für intuitiver.
Du solltest nicht bereits bestehende Posts editieren (zumindest nicht, wenn du etwas fragen willst) - da sonst leicht die Möglichkeit besteht, dass es übersehen wird, weil niemand eine Nachricht bekommt, dass sich etwas geändert hat.
Das Problem an deinem Code ist, dass die Matrix immer wieder zurückgesetzt wird (glLoadIdentity) - was im Prinzip gut ist, da hiermit eine definierte Ausgangsposition erstellt wird. Damit die Änderung deiner Position nun nicht nach jedem Frame "vergessen" wird, machst du einfach Folgendes (X ist eine globale Variable, am Anfang auf 0 gesetzt):
Registriert: So Mai 11, 2003 10:36 Beiträge: 285 Wohnort: Oldenburg
Programmiersprache: Object Pascal
ich will gerne das jeder stein in einer bestimmten farhbe ist. ich habe dafür ein record ersatell das einmal visible und einmal color hat. nun habe ich bemekrt das es wegen dieser zeilen nicht funktioniert:
Code:
glEnable(GL_LIGHTING); // Enable Lighting
glEnable(GL_LIGHT0);
wie kann man das umgehen ????
_________________ MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Wenn du die OpenGL-Beleuchtungsfunktionen nutzen willst, dann musst du OpenGL die Farbeigenschaften deiner Oberflächen anhand von Materialeigenschaften mitteilen.Statt dies wie üblich über glColor3f geschieht das dann mittels glMaterialfv.
Dazu musst du dir irgendwo die Farbeigenschaften deines Materials definieren, und diese dann an OpenGL übergeben : <!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre><span class='reserved'>const</span> Diffuse : <span class='reserved'>array</span>[<span class='integer'>0</span>..<span class='integer'>3</span>] <span class='reserved'>of</span> TGLFloat = (<span class='integer'>1</span>, <span class='integer'>0</span>, <span class='integer'>0</span>, <span class='integer'>1</span>); [...] glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, @Diffuse); [...]</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->
Am besten liest du dir allerdings mal das Kapitel zum Thema Materialeigenschaften im Redbook durch.Dort findest du genaue Erklärungen zu dieser recht komplexen Thematik.
Sehr gut, dass du selbst herausgefunden hast, dass das glColor3f Kommando von der Beleuchtung abhängig ist. Der Grund ist, dass OpenGL, sobald die Beleuchtung eingeschaltet ist, die Farbe aus mehreren Materialparametern zusammenstöpselt. Damit das glColor Kommando dann noch funktioniert, musst du OpenGL sagen, dass es implizit mit der Farbe einen Materialparameter ändern soll.
Dis geschieht mit dem Kommando:
glEnable(GL_COLOR_MATERIAL);
Nur einmal nach dem Initialisieren von OpenGL aufrufen und es sollte bereits funktionieren. Wenn sich andere Materialparameter als die defaultmäßig vorgegebenen (Ambient und Diffuse) mit dem glColor Kommando ändern sollen, stellst du das mit dem Kommand
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.