BASIC

Author Topic: 3D Darstellung eines Höhen-Felds (Height Map)  (Read 10649 times)

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10697
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
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.
« Last Edit: 2008-Jul-15 by Kitty Hello »

Offline WPShadow

  • Administrator
  • Prof. Inline
  • *******
  • Posts: 1667
    • View Profile
    • http://lostrevenant.blogspot.com
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

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

Offline WPShadow

  • Administrator
  • Prof. Inline
  • *******
  • Posts: 1667
    • View Profile
    • http://lostrevenant.blogspot.com
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

  • Guest
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?

Offline WPShadow

  • Administrator
  • Prof. Inline
  • *******
  • Posts: 1667
    • View Profile
    • http://lostrevenant.blogspot.com
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

  • Guest
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...
« Last Edit: 2008-Jun-16 by Heiko »

Offline BumbleBee

  • Global Moderator
  • Prof. Inline
  • *******
  • Posts: 891
    • View Profile
 :offtopic:
Kennst du den hier?
 
  http://freeworld3d.org/

Cheers
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

  • Guest
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.
« Last Edit: 2008-Jun-16 by Heiko »

Offline WPShadow

  • Administrator
  • Prof. Inline
  • *******
  • Posts: 1667
    • View Profile
    • http://lostrevenant.blogspot.com
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

  • Guest
Re: 3D Darstellung eines Höhen-Felds (Height Map)
« Reply #10 on: 2008-Jun-16 »
womit hast du das gemacht, was generiert eine lightmap automatisch mit?

Offline WPShadow

  • Administrator
  • Prof. Inline
  • *******
  • Posts: 1667
    • View Profile
    • http://lostrevenant.blogspot.com
Re: 3D Darstellung eines Höhen-Felds (Height Map)
« Reply #11 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!!!
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

  • Guest
Re: 3D Darstellung eines Höhen-Felds (Height Map)
« Reply #12 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.

Offline WPShadow

  • Administrator
  • Prof. Inline
  • *******
  • Posts: 1667
    • View Profile
    • http://lostrevenant.blogspot.com
Re: 3D Darstellung eines Höhen-Felds (Height Map)
« Reply #13 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...
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

  • Guest
Re: 3D Darstellung eines Höhen-Felds (Height Map)
« Reply #14 on: 2008-Jun-17 »
du kannst den ganz normal mit texturen und nem pinsel bemalen.ansonsten textur im nachhineinbearbeiten.