GLBasic forum

Codesnippets => 3D-snippets => Topic started by: Kitty Hello on 2007-Feb-15

Title: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: Kitty Hello on 2007-Feb-15
Wenn man ein Feld mit Höhenkoten in 3D hat (z.B. height[x][y]), dann kann man mit dem Code anbei das Ganze weich darstellen. Die Übergänge werden dabei interpoliert:
Code (glbasic) Select
DIM world[15][10]

// Dummy Data
FOR x=0 TO 14
FOR y=0 TO 9
world[x][y]=RND(15)/10
NEXT
NEXT

// Create World Object
X_OBJSTART 0
X_AUTONORMALS 2
FOR x=0 TO 14
FOR y=0 TO 9
MakeTile(world[], x,y, -15/2, -10/2, 1.0)
NEXT
NEXT
X_OBJEND

// some dummy texture:
FILLRECT 0,0,128,128, RGB(0,0,255)
FILLRECT 4,4,124,124, RGB(255,255,255)
FILLRECT 5,62,123,66, RGB(0,255,0)
FILLRECT 62,5,66,123, RGB(0,255,0)
FILLRECT 62,62,66,66, RGB(255,0,0)
PRINT "GLBasic", 8,8
GRABSPRITE 0, 0,0,128,128
BLACKSCREEN


WHILE TRUE
X_MAKE3D 1,100, 45
X_CAMERA 1,12,10, 0,0,0
X_SETTEXTURE 0,-1
X_ROTATION GETTIMERALL()/100, 0,1,0
X_DRAWOBJ 0,0
SHOWSCREEN
WEND



FUNCTION MakeTile: heights[], x,y, offsetx, offsety, width_per_tile
// Triangle Strip is:
// 0--2--4-.
// | /| /| .
// |/ |/ |/
// 1--3--5-.

// We need:
// 0-1-2
// |\|/|
// 3-4-5
// |/|\|
// 6-7-8
LOCAL pts[]
LOCAL i, px, py, mx, my
DIM pts[9][3] // 9 points[x,y,z]
pts[0][0]=-1; pts[0][1]=-1
pts[1][0]=.0; pts[1][1]=-1
pts[2][0]= 1; pts[2][1]=-1
pts[3][0]=-1; pts[3][1]=.0
pts[4][0]=.0; pts[4][1]=.0
pts[5][0]= 1; pts[5][1]=.0
pts[6][0]=-1; pts[6][1]= 1
pts[7][0]=.0; pts[7][1]= 1
pts[8][0]= 1; pts[8][1]= 1

// now calculate Z for each point
mx = BOUNDS(heights[], 0)-1
my = BOUNDS(heights[], 1)-1

FOR i=0 TO 8
// Get neighbour point
// but stop at array border
px = MIN(mx, MAX(0, x+pts[i][0]))
py = MIN(my, MAX(0, y+pts[i][1]))
pts[i][2] = ( heights[px][py]+ _
heights[ x][ y]+ _
heights[px][ y]+ _
heights[ x][py])/4
NEXT

// Next a function to create 2 triangles:
INC x, offsetx
INC y, offsety
AddQuad(pts[], x,y,1,0,4,3, width_per_tile)
AddQuad(pts[], x,y,1,4,2,5, width_per_tile)
AddQuad(pts[], x,y,3,6,4,7, width_per_tile)
AddQuad(pts[], x,y,5,4,8,7, width_per_tile)

ENDFUNCTION


FUNCTION AddQuad: pts[], x,y,a,b,c,d, width_per_tile

// here we build a triangle stripped quad
// for the points a,b,c,d
// we divide coordinates by 2, so we get a
// rectangle of size 1x1 (-0.5 -> 0.5)
// for the texture we divide by 2 and add 0.5
// (0.0 -> 1.0)
// [edit:] finally scale that by the width_per_tile factor
// last: we swap y and z, since y is vertical in GLBasic
LOCAL cl
cl =RGB(255,255,255)
X_OBJADDVERTEX width_per_tile*(x+pts[a][0]/2),pts[a][2],width_per_tile*(y+pts[a][1]/2), pts[a][0]/2+.5, pts[a][1]/2+.5,cl
X_OBJADDVERTEX width_per_tile*(x+pts[b][0]/2),pts[b][2],width_per_tile*(y+pts[b][1]/2), pts[b][0]/2+.5, pts[b][1]/2+.5,cl
X_OBJADDVERTEX width_per_tile*(x+pts[c][0]/2),pts[c][2],width_per_tile*(y+pts[c][1]/2), pts[c][0]/2+.5, pts[c][1]/2+.5,cl
X_OBJADDVERTEX width_per_tile*(x+pts[d][0]/2),pts[d][2],width_per_tile*(y+pts[d][1]/2), pts[d][0]/2+.5, pts[d][1]/2+.5,cl
X_OBJNEWGROUP
ENDFUNCTION

Und so sieht's aus:
(http://img243.imageshack.us/img243/9220/junk3gg7.th.png) (http://img243.imageshack.us/my.php?image=junk3gg7.png)

Die roten Punkte sind, wo die HeightMap ihre Werte hat. Blau sind die einzelnen Felder und grün, wo ich Knicke gemahct habe, damit es weich interpoliert wird.
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: WPShadow on 2008-Jun-16
Mal ganz eine dumme Frage, aber gibt es da irgendwie die Möglichkeit über das ganze Ding eine einzige Textur drüber zu machen?

Oder muß man quasi wirklich alle Felder einzeln behandeln?
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: x-tra on 2008-Jun-16
Ich mach das ganze ganz easy mit T.ED, is echt kinderleicht, importiere es dann und kann nachbearbeiten wie ich mag, aber eben nicht als
Terrain(mit Heighmap), sondern als Mesh ala .x .b3d. Wobei ich mit dem export erst klarkommen musste.

Nicht ganz einfach es nach .3ds zu bekommen, aber jetzt wo ichs weiß.

Kann ich nur empfehlen.
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: WPShadow on 2008-Jun-16
Ich hab mir T.Ed inzwischen mal angesehen, aber so ganz klar kommen tue ich damit noch nicht...  =(
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: x-tra on 2008-Jun-16
doch ist total einfach gibt sogar ein deutsches handbuch auf deren seite.
das aber getrost als tutorial sehen kann.

da ist nicht viel falsch zu machen, ich finds für Außenlandschaften perfekt.
Wenns wo hängt, einfach sagen.

Wenns mal der export nach .3ds sein soll, oder so, helf ich dir.Denn das hab ich im moment nur über Gile(s) hinbekommen, weil dies das .b3d mit supertexture richtig liest.

Aber probier bisschen rum, ist echt klasse.
Mach ja sonst alles mit ac3d oder cinema4d, und sonstigen tools zum texturieren, aber für Terrains 1A.

Wenn sich jemand hinsetzen könnte, wäre sicherlich drin, alles zu exportieren, und einen loader dafür zu schreiben, aber dazu fehlts mir momentan noch an kenntnissen, aber wer weiß.......irgendwann vielleicht, wenn mir jemand erstmal grundlegend erklärt, wie sowas geht?
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: WPShadow on 2008-Jun-16
Also ich hab da ja einen Editor, aber der ist auf Dauer etwas anstrengend: L3TD

Der erzeugt super Gelände, aber die Polygonenzahl ist gigantisch. Und Reduce mit AC3D dauert bis zu 20 Minuten. Der spuckt ein Terrain schon mal mit 65535 Polys und mehr aus. Und das ist das Minimum. Dafür erzeugt er aber alle Texturen und alles mit. Ist also gar nicht so übel.

Ich muß da mal schauen, vielleicht ist T.Ed ja was für mich.
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: x-tra on 2008-Jun-16
Was ist den L3TD?
Bzw. gib mal nen Link dazu, ich schau mir das auchmal an.

Wenn jemand das spezielle exportformat von T.ed geladen bekommt in glb, dann wäre alles drin, von der lightmap usw usw usw bis, keine ahnung, muss mal schauen, momentan funktioniert es auf jeden fall mit der supertexture, die alles in sich vereint.als eine einzige textur.aber eben nur das terrain, sky usw. is da eben noch nicht mit drin, vielleicht bekomm ich es ja hin den b3d loader umzuschreiben, weiß garnicht, ob da einer dabei war, aber ich schau mal, ich glaub schon, das wäre natürlich toll.

hab keinen gefunden, hab aber grad ma im forum gepostet, wenn der was für bb3d hat, bekomm ich es vielleicht für glb hin, dass man das ganze environment laden kann.

hab nen .bb loader gefunden, aber da werden viele bb3d spezifischen befehle verwendet, deren umsetzung nach glb mir noch nicht möglich ist.
wenn sich jemand daran versuchen will, einfach bescheid geben.

[edit] ich hab L3DT gerade gefunden und installiert, is ja schon am anfang kompliziert, da ziehe ich T.ed tatsächlich vor. =D

Sooo genug Offtopic...
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: BumbleBee on 2008-Jun-16
 :offtopic:
Kennst du den hier?
 
  http://freeworld3d.org/

Cheers
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: x-tra on 2008-Jun-16
japp hab ich mir auchmal gekauft, is aber schon sooo lange her.
weiß garnicht mehr, wie der export da war, müsste es erstmal entstauben.

hab mich versucht in den bb3d loader und dbpro load reinzulesen, aber nicht alles läßt sich einfach so übernehmen.
hab dem chef von T.ED geschrieben, er schaut sich glb mal an, vielleicht bekommen wir zusammen was zustande.

@schranz0r: kannst du das ganze OT zeug hier mal in themenverfehlung schieben bitte.
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: WPShadow on 2008-Jun-16
Ich hab mal ein Beispiel gemacht. Sieht gar nicht so schlecht aus, finde ich. Ist mit einer normalen Textur und einer Lightmap versehen. Die generiert er automatisch mit...

[attachment deleted by admin]
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: x-tra on 2008-Jun-16
womit hast du das gemacht, was generiert eine lightmap automatisch mit?
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: WPShadow on 2008-Jun-16
Das Programm heißt L3DT:

http://www.bundysoft.com/L3DT/

Das macht alles automatisch! Einfach nur durch klicken und fertig. Dafür macht das Programm aber riesengroße, sehr Polygonreiche Maps. Da muß man selbst was machen!!!
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: x-tra on 2008-Jun-16
stimmt da gefallen mir die bei T.ed viel besser, auch das wasser ist bei l3dt total grob am rand, egal.vielleicht macht der von t.ed ja nen loader.
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: WPShadow on 2008-Jun-17
Mir geht es vorerst um das testen, wie ich das am besten mit den Boden hin bekomme.

Ein verformbarer Boden wäre natürlich der Hit, aber dazu müßte ich mal wissen, wie ich den richtig texturiere...
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: x-tra on 2008-Jun-17
du kannst den ganz normal mit texturen und nem pinsel bemalen.ansonsten textur im nachhineinbearbeiten.
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: WPShadow on 2008-Jun-18
Ich meine ja eigentlich Gernots dynamischen Boden. Der läßt sich dummerweise nicht so einfach texturieren. Jedes Kästchen gilt da als eigenes Objekt und bekommt die selbe Textur.

Ich dachte mir nämlich, daß man da den Boden mit einer Schleife auslesen und je nach Gebrauch umwandeln könnte. Außerdem bietet er die Möglichkeit den Boden zu aktualisieren und neu zu zeichnen. Das würde ungeahnte Möglichkeiten eröffnen.

An den Texturen happert es bisher!
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: Kitty Hello on 2008-Jun-18
Wie? Was? Welcher Boden von mir? Wenn man Boden mit X_OBJADDVERTEX macht, kann man doch tx, ty angeben.
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: WPShadow on 2008-Jun-18
Also Gernot, ich meine es so:

Der Boden, der ja mit X_OBJADDVERTEX erzeugt wird, besteht ja aus einzelnen Platten. Ich würde jetzt die Textur gerne über das gesamte Objekt legen, also über alle Platten gemeinsam und nicht nur über die einzelnen Platten. Das würde es sehr viel einfacher machen.

Gibt es da einen Weg?
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: Kitty Hello on 2008-Jun-18
ja klar. Einfach die tx,ty Werte richtig angeben. Die dürfen ja auch >1 sein. Wenn Du für tx=x und ty=y angibtst, dann ist's als ob Du die Textur von oben über das Land projezierst.
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: WPShadow on 2008-Jun-18
Original:

X_OBJADDVERTEX x+pts[a][0]/2,pts[a][2],y+pts[a][1]/2, pts[a][0]/2+.5, pts[a][1]/2+.5,cl

wird zu:

X_OBJADDVERTEX x+pts[a][0]/2,pts[a][2],y+pts[a][1]/2, x, y,cl

oder
Code (glbasic) Select

X_OBJADDVERTEX x+pts[a][0]/2,pts[a][2],y+pts[a][1]/2, 0, 0,cl
X_OBJADDVERTEX x+pts[b][0]/2,pts[b][2],y+pts[b][1]/2, 15, 0,cl
X_OBJADDVERTEX x+pts[c][0]/2,pts[c][2],y+pts[c][1]/2, 15, 10,cl
X_OBJADDVERTEX x+pts[d][0]/2,pts[d][2],y+pts[d][1]/2, 0, 10,cl

(Funktioniert übrigens auch nicht richtig...)

???

Hab ich das so richtig verstanden?
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: Schranz0r on 2008-Jun-18
Machs so:


Code (glbasic) Select

FUNCTION AddQuad: pts[], x,y,a,b,c,d

// here we build a triangle stipped quad
// for the points a,b,c,d
// we divide coordinates by 2, so we get a
// rectangle of size 1x1 (-0.5 -> 0.5)
// for the texture we divide by 2 and add 0.5
// (0.0 -> 1.0)
// last: we swap y and z, since y is vertical in GLBasic
LOCAL cl
cl =RGB(255,255,255)
// X_OBJADDVERTEX x+pts[a][0]/2,pts[a][2],y+pts[a][1]/2, pts[a][0]/2+.5, pts[a][1]/2+.5,cl
// X_OBJADDVERTEX x+pts[b][0]/2,pts[b][2],y+pts[b][1]/2, pts[b][0]/2+.5, pts[b][1]/2+.5,cl
// X_OBJADDVERTEX x+pts[c][0]/2,pts[c][2],y+pts[c][1]/2, pts[c][0]/2+.5, pts[c][1]/2+.5,cl
// X_OBJADDVERTEX x+pts[d][0]/2,pts[d][2],y+pts[d][1]/2, pts[d][0]/2+.5, pts[d][1]/2+.5,cl


X_OBJADDVERTEX x+pts[a][0]/2,pts[a][2],y+pts[a][1]/2, (x+pts[a][0]/2) / 15, (y+pts[a][1]/2) / 10,cl
X_OBJADDVERTEX x+pts[b][0]/2,pts[b][2],y+pts[b][1]/2, (x+pts[b][0]/2) / 15, (y+pts[b][1]/2) / 10,cl
X_OBJADDVERTEX x+pts[c][0]/2,pts[c][2],y+pts[c][1]/2, (x+pts[c][0]/2) / 15, (y+pts[c][1]/2) / 10,cl
X_OBJADDVERTEX x+pts[d][0]/2,pts[d][2],y+pts[d][1]/2, (x+pts[d][0]/2) / 15, (y+pts[d][1]/2) / 10,cl

X_OBJNEWGROUP
ENDFUNCTION


Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: WPShadow on 2008-Jun-18
Danke! Perfekte Lösung!

Hier der 1. Test! Höhen sind noch Zufallsgeneriert!

[attachment deleted by admin]
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: Schranz0r on 2008-Jun-22
Ja.... Doch... Ja... Sehr schick !  :good:
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: Sebastian on 2008-Jul-03
So, und jetzt büdde noch ein Screenshot mit Dot3 Mapping  =D
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: Kitty Hello on 2008-Jul-03
Hallo Sebastian, schön dass Du wieder da bist.
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: Sebastian on 2008-Jul-03
:offtopic:
Hallo Gernot!
Ja, und wie du bestimmt weisst sogar mit "richtiger" Lizenz etc.  :lol:
:offtopic:

Evtl. "leih" ich mir diesen Terrain Code mal aus. Ich glaube, dass man damit ziemlich coole Sachen anstellen kann...  :nw:
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: WPShadow on 2008-Jul-05
Glaube ich auch! Hoffentlich deine Idee auch, denn meine hackt noch etwas bei der Umsetzung...  :giveup:
Title: Re: 3D Darstellung eines Höhen-Felds (Height Map)
Post by: JohnnyB on 2019-Jul-17
Is there a way to let me calculate the position(x,y,z) where I click on that height object?