Registriert: Mi Apr 09, 2008 16:28 Beiträge: 52 Wohnort: Münster
ahh ok das funktioniert jetzt danke
Aber leider wird einfach nur ein schwarzes Fenster angezeigt?! ISt da überhaupt was entstanden ? Oder muss ich erst noch die Texturen einbauen um etwas zu sehen MFG
EDIT:
Code:
procedure TForm1.Render;
var y,x :integer;
TexID :gluInt;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
Das ist meine jetztige Render Funktion. Das Programm kompiliert jetzt aber es wird nur ein schwarzer Bildschirm angezeigt. Dabei müsste doch eigentlich die Landschaft angezeigt werden und auf jedes Viereck das Bild wiki.jpg als Textur gemalt werden.
Hab ich da noch nen Fehler drin oder einfach was vergessen?
MFG
_________________ "Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."
-- Dan Salomon
du solltest die Textur nicht in der Renderprocedure laden. Du musst sie ja nicht bei jedem Durchgang neu erstellen. Lade sie in einer Procedure, die du einmal bei Programmstart ausführst.
Außerdem wirst du keine Textur darauf sehen (bzw. nicht richtig) da du dazu die Texturkoordinaten per glTexCoord2f() setzen musst. Schau dir dazu am Besten nochmal das Tutorial an.
Es kann sein, dass das, was du zeichnest nicht im Bildschirmbereich ist. Versuche einfach mal mittels glTranslatef(x, y, z) die Szene ein bisschen zu verrücken. (Vielleicht mal mit einem y < 0)
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
ich würde eher darauf tippen, dass nichts zu sehen ist, weil sich der map mittelpunkt im betrachter mittelpunkt befindet.
Wenn man vor der zeichen procedure bzw. der zeichenschleife in diesem fall ein gltranslatef(0,8,15); einfügt und ein glrotatef(30,1,0,0); sollte man eine schräge drauf sicht haben auf das geschehen. Mit den translatef(x,y,z); werten kann man dann natürlich rumspielen, aber das rotatef sollte so ungefähr sein, damit man was sieht.
Ich probiers gleich nochmal schnell selbst aus und poste dann mal etwas code.
EDIT:>>
habs gerade gebastelt und das fise daran ist, dass man durch die positiven x,y, koordinaten quasie hinter sich zeichnet (wenn man davon ausgeht, dass x=links/rechts, y=hoch/runter und z=vorn/hinten ist).
das hats bei mir gebracht. ist jetzt zwar mit konstanter größe von 128 (0..127) und auch nicht mit texturen, sondern mit glcolor3f(); aber die color tags mit den texturen auszutauschen, oder zusätzlich zu nehmen sollte kein weltuntergang sein. das "/4" kommt bei der color3f zustande, weil ich im map[] array zufällige werte von 0..3 zauber und die color3f funktion ja nur nen werte bereich von 0..1 hat.
das translatef verschiebt den ganzen gezeichneten krempel genau vor deine Nase und das rotatef lsst dich etwas nach unten schauen, damit du auch bischen was siehst. Also den werten nach würde ich ein gltranslatef(maxX/2*-1,camerahöhe*-1,maxY/2*-1) nehmen. das rotatef kann so bleiben. das die Variablen bei mir i,j heißen zum zählen ist n alter informatiker/elektriker tick. Ob du die nu x/y oder schieß michtot nennst ist völlig Hupe, aber von der Idee her läufts.
Übrigens das Textur laden solltest du mindestens nach Form1.oncreate() auslagern, weil du das nur einmal machen musst. Wenn du das in der Render-prozedur drin lässt, dann ballerst du dir den ganzen speicher zu und verschleuderst durch die aufrufe framerates.
Edit:>> gut den speicher nicht unbedingt, ist aber trotzdem laaangsam.
Registriert: Mi Apr 09, 2008 16:28 Beiträge: 52 Wohnort: Münster
OMG das kann doch jetz echt nich sein Bei dir funzt das und bei mir läuft wieder gar nix. Wird einfach nen schwarzer Bildschirm angezeigt Hier is jetz mal mein ganzer Quelltext mit diesem neu eingebauten Sachen:
Jetzt gibt es nur noch das kleine Problem dass das einfach eine große Fläche ist Ich möchte aber gerne eine mit Hügeln usw. haben. Ihr habt ja vorhin schon mal geschrieben dass das durch das array map erledigt wird, wird es aber nicht.
Kann mir da jemand sagen wie ich die noch mit hinein bekomme?
MFG
_________________ "Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."
-- Dan Salomon
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Du musst das Map-Array natürlich noch mit den Höhenwerten füttern. Dafür kannst du entweder ein Perlin Noise implementieren (siehe Forum Suche, da gibts nen bissl was zu) oder manuell was aus ner Bitmap laden.
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 network • my 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
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
das du vorhin nichts gesehen hast als du meinen Beispiel code ausprobiert hast lag daran, dass du in dem array map[] ja noch keine Werte drin hast, außer ganz viele nullen.
dadurch dass die Formel für die farbe des quads aus map[i,j]/4 berechnet wird steht da im prinzip die formel 0/4, was logischerweiße 0 ist und somit schwarz für die farbe des quads ergibt. Wenn du andere Werte in das Array speicherst wird sich dann natürlich auch die höhe deines Geländes ändern und wenn du die color3f auch drin lässt, dann werden tiefere stellen dunkler gezeichnet, als höhere.
Ich hab das bei mir mal so gemacht, dass ich ein TBitmap mit einem graustufenbild gefüllt habe und dass an das array übergeben habe. So kann man dann mit paint oder photoshop landkarten malen und je heller eine Stelle ist, umso höher liegt der Punkt dann auch in der Karte.
Wie man das genau macht hab ich gerade nicht im Kopf und auch leider keine Zeit das zu probieren. Aber mit einwenig googlen, oder der forum suche wirst schon ne Möglichkeit finden das map-array mit sinnvollen werten zu füllen.
Nebenbei lohnt es sich die quads durch zwei triangles auszutauschen. Wenn du nähmlich bei einem viereck punkte hast, die nicht alle in einer Ebene liegen kanns vorkommen, dass grafikfehler auftauchen. Wenn du stattdessen zwei gl_triangles nimmst und darauß ein viereck bastelst, dann kann dir das nicht passieren. Sieht zwar etwas aufwendiger aus vom code her, aber es vermeidet igittigitt auf dem monitor.
Registriert: Mi Apr 09, 2008 16:28 Beiträge: 52 Wohnort: Münster
OK ich hab mir dieses Perlin Noise mal durchgeschaut aber ehrlich geasgt hab ich das nch so richtig verstanden Hätte jemand da vielleicht ein fertiges Beispiel oder eine andere Möglichkeit für mich?
_________________ "Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."
-- Dan Salomon
Registriert: Mi Apr 09, 2008 16:28 Beiträge: 52 Wohnort: Münster
Ja ok also die Erste Möglichkeit is zwar schön einfach aber falsch. Dabei werden bloß die Ecken der Vierecke irgentwie nach oben gebogen. Dadurch entstehen aber noch keine Hügel.
Und dieses Zweite was soll das machen ? Das versteh ich nich ganz
Falls mir einer ein Beispiel für dieses Perlin Noise gebe nkönnte wär das super MFG
_________________ "Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."
-- Dan Salomon
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Die frage ist, was verstehst du unter "Hügel"?
Mehr als eine Landschaft bestehend aus Quads und Dreiecken wirst du nicht bekommen, wenn du dich nicht Beziers / NURBS auseinandersetzt.
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 network • my 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
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Auch Beziers / NURBS bestehen nur aus Quads bzw Dreiecken. Nur eben, dass die Punkte per Software berechnet werden.
Perlin_Noise ist da technisch gesehen auch nicht großartig anders. Und die zweite Möglichkeit macht nichts anderes als aus einem Bitmap den Farbwert eines Pixels auszulesen und diesen als Höhe zu verwenden. Du solltest auf so etwas eher genau dann zurückgreifen, wenn die Landschaft speziellen Anforderungen gerecht werden sollte. Bei Perlin Noise sind die entstehenden Punkte zwar von einem Zufallswert abhängig aber nicht unbedingt vorhersehbar. Das sieht man in dem Wiki Artikel auch ganz gut.
PS: Das mit den Bitmaps kannst du auch als sehr großes Schachbrett sehen bei denen die Höhe der Punkt nicht 0 ist sondern aus dem Bitmap stammt.
PPS: Alternativ zu einem Bitmap ist evtl auch ein echtes Model nicht zu verachten, denn die 3D Programme sind unter anderem auch in der Lage die Anzahl der verwendeten Dreiecke zu optimieren und nicht benutzte (gerade) Flächen wegzulassen. Und falls sie das nicht automatisch können kann man das vermutlich auch per Hand machen.
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
Auch wenn das nu etwas fies klingt, aber ich denke, wenn man jemanden vor sich hat, der die TBitmap funktion nicht versteht, dann ist es wohl eher wenig angebracht mit Nurbs oder anderen Bezir technicken anzurücken. Genauso werden wohl 3d-Modelle laden dann auch nicht so schnell drin sein, wenn es schon am laden einer Bitmap scheitert.
Also wenn du eine wirklich runde Hügellandschaft haben willst, dann kommst du um Bezir/Nurbs/Splines blabla nicht herum. Das alleine reicht aber immer noch nicht für eine wirklich runde Optik. mit einem perpixellighting sollte man dann auch noch ran gehen, sprich einen der simpleren shader schreiben. Die geometrie alleine wird nähmlich sonst sehr platt aussehen und dir wenig freude bereiten. Ein kleines Sunlight kann da schon Wunder wirken.
Wie man das macht findest du alles hier im wiki und/oder Forum.
Da ich mal dreist vermute, das du noch ziemlich frisch in diesem Gebiet bist kann ich dir empfehlen das ganze ruhig anzugehen und ersteinmal mit den bisherigen ergebnissen herumzuspielen und auszuprobieren und dich nach und nach in weitere Technicken einzuarbeiten. Ist ja noch kein Meister vom Himmel gefallen (nichteinmal ich^^). Auf der anderen Seite würd ich aber schonmal gern nen Screenshot sehen, was du so bisher geschaffen hast.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Das mit den Bezier / NURBS war auch kein ernstgemeinter Vorschlag sondern eher zur "Abschreckung" gedacht
Lossy eX hat geschrieben:
Auch Beziers / NURBS bestehen nur aus Quads bzw Dreiecken. Nur eben, dass die Punkte per Software berechnet werden.
Ok, jetzt bricht für mich eine Welt zusammen
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 network • my 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
Mitglieder in diesem Forum: 0 Mitglieder und 6 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.