Registriert: Mi Apr 09, 2008 16:28 Beiträge: 52 Wohnort: Münster
Hallo
ich hab eine Frage zum 4rten Tutorial:
Das ist ja alles recht verständlic hbis zu dem Punkt wo voraus gesetzt wird dass man eine Landschaft selber gestalten kann Ich bin leider noch ziemlicher Anfänger und hoffe desshalb dass mir jemand erklären kann wie ich das machen muss. (aber bitt einfach).
Ich würde am Ende gern ungefähr so eine Landschaft wie auf den Beispielbildern in Tutorial4 herausbekommen.
Vielen Dank schonmal im Voraus MFG
Registriert: Mi Apr 09, 2008 16:28 Beiträge: 52 Wohnort: Münster
ok das probier ich mal wenn ich zuhasue bin...
ich glaub aba nich dat das das richtige is weil ich brauch einfach nur den Code um die Vierecke zu einer Map zusammenzzu bauen.
PS: Den Source Code hab ich mir schon runter geladen der funzt aber bei mir nich, weil eine der verwendeten Units nicht vorhanden ist MFG
_________________ "Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."
-- Dan Salomon
der Code um eine "Map" zu machen ist ja im Tutorial. Ich hab mal nur das wichtigste da gelassen:
Code:
for y:=0to YCount-1do
begin
glPushMatrix;
for x:=0to XCount-1do
begin
glBegin(GL_QUADS);
glVertex3f(0, Map[x,y+1],0);
glVertex3f(0, Map[x,y],1);
glVertex3f(1, Map[x+1,y],1);
glVertex3f(1, Map[x+1,y+1],0);
glEnd;
glTranslatef(1,0,0);
end;
glPopMatrix;
glTranslatef(0,0,-1);
end;
Du hast zwei Schleifen, in denen du einzelne Quads zeichnest (in x und z Richtung), die sich hinterher zu deiner "Map" zusammensetzen.
In der inneren Schleife wird bei jedem Durchgang glTranslatef(1, 0, 0); ausgeführt, um beim nächsten Durchgang weiter rechts zu zeichnen.
Bei der äußeren
glTranslatef(0, 0, -1); um weiter hinten zu zeichnen. Dabei zeichnest du XCount*YCount Quads mit jeweis den Seitenlängen von 1.
glPushMatrix und glPopMatrix werden benutzt, um in jeder Reihe nach hinten wieder von links anzufangen die Quads in x Richtung zu zeichnen.
In Map[x, y] stehen nur per Random erstellte Y Werte drinne, um ein paar "Bodenwellen" zu erzeugen. würdest du da überall 0 reinschreiben hättest du im Endeffekt nur ein großes Quad bestehend aus den kleineren.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Markus hat geschrieben:
Code:
for y:=0to YCount-1do
begin
glPushMatrix;
for x:=0to XCount-1do
begin
glBegin(GL_QUADS);
glVertex3f(0, Map[x,y+1],0);
glVertex3f(0, Map[x,y],1);
glVertex3f(1, Map[x+1,y],1);
glVertex3f(1, Map[x+1,y+1],0);
glEnd;
glTranslatef(1,0,0);
end;
glPopMatrix;
glTranslatef(0,0,-1);
end;
Das ist nicht sehr performant. Der Aufruf von glBegin und glEnd sollte ausgelagert werden, der Performance halber. Bei einer größeren map kommt es da zu Geschwindigkeitseinbußen. Ich würde eher einen solchen Aufbau vorschlagen:
Code:
glBegin(GL_QUADS);
for y:=0to YCount-1do
begin
for x:=0to XCount-1do
begin
glVertex3f(x, Map[x,y+1], y);
glVertex3f(x, Map[x,y], y+1);
glVertex3f(x+1, Map[x+1,y], y+1);
glVertex3f(x+1, Map[x+1,y+1], y);
end;
end;
glEnd;
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: Mi Apr 09, 2008 16:28 Beiträge: 52 Wohnort: Münster
ok ich hab das jetz ma reinkopiert aber als was muss ich y,x und alle weiteren Variablen usw. deklarieren und muss ich ihnen irgentwelche Startwerte geben ?
_________________ "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++
X und Y sind ja Zählvariablen, die kannst du einfach als Integer deklarieren.
XCount und YCount sind dann jeweils die Anzahl der Felder in der entsprechenden Richtung in deinem Map-Array. Wenn du also ein Array von 256x128 Einträgen hast, dann ist XCount = 256 und YCount = 128.
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: Mi Apr 09, 2008 16:28 Beiträge: 52 Wohnort: Münster
ahh ok also x und y sind integer und denen muss nix zugewiesen werden.
Muss ich diese Zahlen für xCount und YCount denn zuweisen oder sind das Funktionen ? Und wenn es keine Funktionen sind dann sind XCount und YCount auch integer ne?
Jetz noch eine ganz doof eFrage:
Diese Map array: wie muss ich das deklarieren ? ich kenn bis jetzt nur array of integer aber das kann ja nicht laufen weil das map array ja 2 zähler hat.
PS: danke schonmal für die Antworten bis jetzt
_________________ "Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."
-- Dan Salomon
Der Wert der einzelnen Arrayzellen sollte von 0 bis 1 gehen (Fließkomma), damit es nachher in der Map nicht so schlimm aussieht, da deine Felder 1x1 Einheiten groß sind. Wenn die dann einen höhenunterschied von 100 Einheiten haben, sieht das sehr... weird aus.
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: Mi Apr 09, 2008 16:28 Beiträge: 52 Wohnort: Münster
MHM ok das hab ich jetz drin aber der sagt mir jetzt dass bei
TMapArray : array [0..XCount-1, 0..YCount-1] of Single;
2 Konstanten ausdrücke erwartet werden (also nicht gefudnen wurden)
Obwohl ich xCOunt unYCount schon vorher bei const reingeschrieben habe.
Muss ich da osnst noch irgentwas tun?
_________________ "Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."
-- Dan Salomon
Entwerder du machst es so, wie Lord Horazont gesagt hat, mit einem type. Oder so, wie in meinem ersten Post, indem du gleich eine Variable deklarierst.
( Du hast ein ":" statt dem "=" ) Wenn du es mit einem type machst braucht du dann noch eine Variable:
so sieht mein Anfang vom Program jetzt aus.
Und dann kommt immer noch der Fehler:
Konstantenausdruck erwartet.
Ich habe XCount-1 und YCount-1 in TMapArray = array [0..XCount-1, 0..YCount-1] of Single; einfach mal durch 255 ausgetauscht (also das was herauskommrn würde). Dann startet das Program es erscheint aber nichts außer einem schwarzen Bildschirm. Woran liegt das ? Vielleicht braucht ihr dafür meine Render Procedure noch:
Code:
procedure TForm1.Render;
var y,x :integer;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
Mitglieder in diesem Forum: 0 Mitglieder und 2 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.