3D Darstellung eines Höhen-Felds (Height Map)

Previous topic - Next topic

Kitty Hello

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:


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.

WPShadow

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?
AMD X2 4600, 2 GB Ram, ATI X1950 XTX, XP PRO SP2: GLB Premium 10.beta_dingsi, <(´.´<) Kirby Dance (>`.`)>
http://lostrevenant.blogspot.com
alea iacta est

x-tra

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.

WPShadow

Ich hab mir T.Ed inzwischen mal angesehen, aber so ganz klar kommen tue ich damit noch nicht...  =(
AMD X2 4600, 2 GB Ram, ATI X1950 XTX, XP PRO SP2: GLB Premium 10.beta_dingsi, <(´.´<) Kirby Dance (>`.`)>
http://lostrevenant.blogspot.com
alea iacta est

x-tra

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?

WPShadow

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.
AMD X2 4600, 2 GB Ram, ATI X1950 XTX, XP PRO SP2: GLB Premium 10.beta_dingsi, <(´.´<) Kirby Dance (>`.`)>
http://lostrevenant.blogspot.com
alea iacta est

x-tra

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...

BumbleBee

The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

x-tra

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.

WPShadow

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]
AMD X2 4600, 2 GB Ram, ATI X1950 XTX, XP PRO SP2: GLB Premium 10.beta_dingsi, <(´.´<) Kirby Dance (>`.`)>
http://lostrevenant.blogspot.com
alea iacta est

x-tra

womit hast du das gemacht, was generiert eine lightmap automatisch mit?

WPShadow

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!!!
AMD X2 4600, 2 GB Ram, ATI X1950 XTX, XP PRO SP2: GLB Premium 10.beta_dingsi, <(´.´<) Kirby Dance (>`.`)>
http://lostrevenant.blogspot.com
alea iacta est

x-tra

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.

WPShadow

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...
AMD X2 4600, 2 GB Ram, ATI X1950 XTX, XP PRO SP2: GLB Premium 10.beta_dingsi, <(´.´<) Kirby Dance (>`.`)>
http://lostrevenant.blogspot.com
alea iacta est

x-tra

du kannst den ganz normal mit texturen und nem pinsel bemalen.ansonsten textur im nachhineinbearbeiten.