Old School Fractal Mountains?
BlitzMax Forums/BlitzMax Programming/Old School Fractal Mountains?
| ||
| Does anyone here remember such retro game classics like Rescue on Fractalus, Koronis Rift, The Eidolon or Captain Blood? They all have in common to feature (pseudo?-)3D fractal mountains (or caves in the case of The Eidolon). I'm looking for a way to create similar graphics, but I can't seem to find suitable algorithms for that. All that I come up with are true 3D fractal landscaping engines, and that's not quite what I need. Has anyone stumbled upon such algorithms or a general idea how to these would work? |
| ||
| This site describes how to do both 2d and 3d mountains. http://www.gameprogrammer.com/fractal.html Here's another one. http://www.bugfree.dk/blog/2009/02/23/generating-2d-random-fractal-terrains-with-c/ |
| ||
| Okay, thanks, but unfortunately, these methods don't really hit the nail on the head. I don't know in how far you are familiar with the games I mentioned (especially the ones from Lucasfilm Games), but (even if might not be that apparent by looking at the screenshots) the fractals there go a bit further than the randomised jiggly lines the examples you found provide. Might still be a suitable starting point, though, since the midpoint displacement method appears to play a role in the Lucasfilm engine, but there's obviously more behind it – otherwise there wouldn't have been movement through consistent (pseudo-)3-dimensional space. |
| ||
| There seems to be a lot of algorithms on the web for making colorful fractals. Could you not use on of those, and then instead of using the values for colors, then use them for heights to generate a hightmap? |
| ||
| Sure I could. But that's really not what I'm looking for. ;) |
| ||
| There seems to be a lot of algorithms on the web for making colorful fractals Sure I could. But that's really not what I'm looking for. ;) I'm looking for a way to create similar graphics, but I can't seem to find suitable algorithms for that. Sounds like it to me. |
| ||
| Sounds like it to me. Okay, I should rephrase my original request: I'm not looking for a way to create just any fractal mountains. I know how to do that. I'm looking for a way to create the very specific kind of fractal mountains (or caves) like in RoF, KR, TE or CB. These aren't just random landscapes, you know? |
| ||
| http://www.electriceggplant.com/media/RG44_RescueOnFractalus.pdf |
| ||
| @ Shortwind: I don't know if you have actually read that article, but apart from what boils down to "we had an awesome fractal engine running on a 6502", there's not that much information about the game engine. |
| ||
| Maybe if you make a ingame video and put it on YouTube (or I could host it for you), people would understand what you're looking for and be able to give more relevant advice. Or at least look on YouTube for videos that are already there. You don't seem too enthusiastic about this. Captain Blood at around 0:06 Rescue on Fractalus Koronis Rift The Eidolon |
| ||
| Captain Blood was awesome, I used to play it on the Amstrad CPC |
| ||
| Off Topic: every time I cruise through the forum and notice this thread's title I start humming the tune to "Big Rock Candy Mountain" and my productivity plummets... apologies for infecting anyone else with this comment. |
| ||
| @ theHand: Thanks. You're right, in videos it's more obvious what differentiates the fractal sceneries I talk about from the usually purely random mountains most algorithms produce. When you look at these videos, note how there is a persistent landscape given by a predetermined map with the rocky bits (mountains or cave walls) at very specific positions. I can't seem to find any maps for TE or KR online with the usual search engines (I have them in some old magazines, though), but you would see that the levels had a non-random structure. Coming to think of it, Captain Blood is probably not the best example of what I'd like to achieve, since the landscape there is only very rudimentary (basically only that valley with craggy mountains left and right). |
| ||
| One way I'd might try is creating the landscape using an editor and a few rudimentary lines. Then use the fractal algorithms already posted to make those lines more jaggy. Might be the way it was done in the games. |
| ||
| Captain Blood and Koronis Rift had unbelievable landscapes considering they ran on the Spectrum -- and in real time in KR's case. Other than commenting that I once typed in a brilliant fractal landscape routine from Amstrad Action magazine, I'm afraid I really can't help. However, there was a book called 'Computers and Chaos' by Conrad Bessant (as found here, aimed at the Amiga, that I still have, which has a really convincing landscape modelling routine (which invokes deliberate land 'faults') that would fit in nicely with Koronis Rift's landscapes, but I never really got around to trying to port it to Blitz. If you can find it, or a digital copy, you would probably find it very relevant. Quick Amazon search later... well, jeez, the Amiga version is "from £29.90" (mine was perhaps £3, car boot sale), while the Atari (boo) version, which must contain pretty much the same code, is "from £2.99"! http://www.amazon.co.uk/Books/s?ie=UTF8&rh=n:266239,p_27:Conrad%20Bessant&field-author=Conrad%20Bessant&page=1 |
| ||
| Hello. Here's a crap way of doing it, knocked up quickly and not particularly good but should give you a way to start. Goodbye.
Graphics 1024,768
Local pm:TPixmap = LoadPixmap("heightmap.jpg")
Local maxx = 64
Local tri#[maxx*2]
tri[0] = 0
tri[1] = 768
tri[maxx-2] = 1024
tri[maxx-1] = 768
Local y
Graphics 512,480
While Not KeyHit(KEY_ESCAPE)
Cls
sy = 0
For iy = -15 To 0
If y+iy > 0 Then
For i = 0 To maxx-1
If (15+i+xp)>0 And (15+i+xp)<255 Then
x = i*2
tri[x] = Float(i*8)
tri[x+1] = (ReadPixel(pm,8+i+xp,y+iy) & $ff)*2
End If
Next
tri[0] = 0
tri[1] = 768
tri[maxx-2] = 1024
tri[maxx-1] = 768
sy = sy + 16
SetOrigin 0,sy-64
SetColor 255,255,255
DrawPoly tri
SetOrigin 0,sy-64 +1
SetColor 64,255-sy,64
DrawPoly tri
EndIf
Next
SetOrigin 0,0
SetColor 255,0,0
DrawText "xp="+ xp,0,0
DrawText "y="+ y,0,16
If KeyDown(KEY_DOWN) Then y=y+1
If KeyDown(Key_UP) Then y=y-1
If KeyDown(Key_Right) Then xp=xp+1
If KeyDown(Key_Left) Then xp=xp-1
If y>255 Then y = 255
If y<0 Then y = 0
If xp>255 Then xp = 255
If xp<0 Then xp = 0
Flip
Wend
|
| ||
| Thanks! Now we are getting somewhere. Heightmaps definitely seem to be involved in some way. |
| ||
| Hello. Another 1/2 hour, a bit of an improvement.
Graphics 1024,768,32
Local pm:TPixmap = LoadPixmap("heightmap.jpg")
isx = PixmapWidth(pm)
isy = PixmapHeight(pm)
xp = isx/2
y = isy/2
Local maxx = 64
Local tri#[maxx*2]
tri[0] = 0
tri[1] = 768
tri[maxx-2] = 1024
tri[maxx-1] = 768
viewdistance = 8 ' number of mountains to draw
linestep = 64 'distance between mountain draw
xsize = maxx ' how many vertices to draw
startx = (xsize / 2) * -1
endx = (xsize / 2) -1
stepwidth = 1024/xsize
stepheight = 32
colstep = 256/viewdistance
Graphics 512,480
sy = 0
While Not KeyHit(KEY_ESCAPE)
Cls
y_count = 0
screen_x = 0
sy = 0
While y_count < viewdistance
' get y position of line
inner_y = y - (y_count * viewdistance)
If inner_y > (isy-1) Then inner_y = inner_y - isy
If inner_y < 0 Then inner_y = inner_y + isy
screen_x = 0
For xl = 0 To maxx-1
inner_x = xp + xl
If inner_x < 0 Then inner_x =inner_x + isx
If inner_x > (isx-1) Then inner_x = inner_x - isx
tripos = xl * 2
tri[tripos] = Float(screen_x)
my = (ReadPixel(pm,inner_x, inner_y) & $ff)*2
tri[tripos+1] = my
screen_x = screen_x + stepwidth
Next
tri[0] = 0
tri[1] = 768
tri[2] = 0
tri[maxx-4]=1024
tri[maxx-2] = 1024
tri[maxx-1] = 768
SetOrigin 0,sy
SetColor 255,255,255
DrawPoly tri
SetOrigin 0,sy+4
SetColor 0,y_count * colstep,0
DrawPoly tri
y_count = y_count + 1
sy = sy + 32
Wend
Flip
If KeyDown(KEY_DOWN) Then y=y-1
If KeyDown(Key_UP) Then y=y+1
If KeyDown(Key_Right) Then xp=xp+1
If KeyDown(Key_Left) Then xp=xp-1
If y>isy-1 Then y = isy-1
If y<0 Then y = 0
If xp>isx-1 Then xp = isx
If xp<0 Then xp = 0
Wend
Goodbye. |