Posted: 23rd Apr 2014 6:10
You might want to start with a small heightmap to get a feel for how long it will take your computer to render the mesh. Each pixel of the image is equivalent to one tile on the grid. Large heightmaps will take a long time, or even crash, but if they render you can save the mesh for quick loading.

Feel free to use or modify...
Hopefully someone will find useful or inspiring.

+ Code Snippet
`-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
`STEP 1: HEIGHTMAP PATH HERE...
img$="???"
`-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

`-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
`STEP 2: SET SCALING & SMOOTHING HERE...
Xscale#=10:Yscale#=10:Zscale#=.5:Smooth=100
`-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

`/////////////
gosub Initialize
gosub ReadMap
gosub RenderMesh
`/////////////


sync on:sync rate 35
do
position light 1,x#,y#,z#
gosub KeyInput
gosub PrintInfo
sync
LOOP


Initialize:
color backdrop rgb(92,114,163)
hide light 0
make light 1
set point light 1,0,0,0
print "Loading Heightmap... "
sync

Dim TXA#(9000000):Dim TXB#(9000000):Dim TXC#(9000000)  `X
Dim TYA#(9000000):Dim TYB#(9000000):Dim TYC#(9000000)  `Y
Dim TZA#(9000000):Dim TZB#(9000000):Dim TZC#(9000000)  `Z
load image img$,1,1
imageW=image width(1):imageH=image height(1)
return


ReadMap:
cls
set cursor 0,0
print "image size=";imageW;"x";imageH
print
print "Getting Heightmap Points... "
sync


for y=0 to imageH-1 `0 step 10
for x=0 to imageW-1 `0 step 10
paste image 1,-x,-y
Point1=(rgbr(point(0,0))+rgbg(point(0,0))+rgbb(point(0,0)))/3
Point2=(rgbr(point(1,0))+rgbg(point(1,0))+rgbb(point(1,0)))/3
Point3=(rgbr(point(0,1))+rgbg(point(0,1))+rgbb(point(0,1)))/3
inc count
TXA#(count)=x*Xscale#
TYA#(count)=y*Yscale#
TZA#(count)=Point1*Zscale#

TXB#(count)=(x*Xscale#)+Xscale#
TYB#(count)=y*Yscale#
TZB#(count)=Point2*Zscale#

TXC#(count)=x*Xscale#
TYC#(count)=(y*Yscale#)+Yscale#
TZC#(count)=Point3*Zscale#
paste image 1,-x,-y
Point1=(rgbr(point(0,1))+rgbg(point(0,1))+rgbb(point(0,1)))/3
Point2=(rgbr(point(1,0))+rgbg(point(1,0))+rgbb(point(1,0)))/3
Point3=(rgbr(point(1,1))+rgbg(point(1,1))+rgbb(point(1,1)))/3
inc count
TXA#(count)=x*Xscale#
TYA#(count)=(y*Yscale#)+Yscale#
TZA#(count)=Point1*Zscale#

TXB#(count)=(x*Xscale#)+Xscale#
TYB#(count)=y*Yscale#
TZB#(count)=Point2*Zscale#

TXC#(count)=(x*Xscale#)+Xscale#
TYC#(count)=(y*Yscale#)+Yscale#
TZC#(count)=Point3*Zscale#
Total=Count
next
next
return


RenderMesh:
cls
set cursor 0,20:print "Rendering Mesh from Heightmap... no, really!"
ink rgb(165,221,20),0:set cursor 0,390:print "There was a woman in Arkansas who was such a bad cook,"
set cursor 0,402:print "that a swarm of flies got together and repaired her screen door."
ink rgb(20,200,20),0:set cursor 0,426:print "-Gary Busey"
ink rgb(255,255,255),0
sync
Main=900001
make object plain Main,0,0
template=900002
make object Triangle Template,0,0,0,0,0,0,0,0,0
make mesh from object Template,Template:delete object Template

count=0
for y=0 to imageH-1
for x=0 to imageW-1
inc Count
add limb Main,Count,Template
lock vertexdata for limb Main,Count
set vertexdata position 0,TXA#(Count),TYA#(Count),TZA#(Count)
set vertexdata position 1,TXB#(Count),TYB#(Count),TZB#(Count)
set vertexdata position 2,TXC#(Count),TYC#(Count),TZC#(Count)
inc Count
add limb Main,Count,Template
lock vertexdata for limb Main,Count
set vertexdata position 0,TXA#(Count),TYA#(Count),TZA#(Count)
set vertexdata position 1,TXB#(Count),TYB#(Count),TZB#(Count)
set vertexdata position 2,TXC#(Count),TYC#(Count),TZC#(Count)
unlock vertexdata
NEXT    
NEXT
cls

zrotate object Main,180:fix object pivot Main
make mesh from object Main,Main
delete object Main
make object Main,Main,0
offset limb Main,0,-Xscale#*(imageW/2),Yscale#*(imageH/2),0
position camera -Xscale#*(imageW/2),Yscale#*(imageH*.7),-((imageW+imageH)/2)*8
set object normals Main
set object cull Main,0
position object Main,object position x(Main)-(Xscale#*(imageW/2)),object position y(Main)+(Yscale#*(imageH/2)),object position z(Main)
set object smoothing Main,Smooth
return


PrintInfo:
set cursor 0,0
print "image size=";imageW;"x";imageH
print
print "Arrowkeys=Move"
print "Mouseclick=Raise/Lower camera"
print "'W'=Wall orientation"
print "'G'=Ground orientation"
print
print "'S' to save mesh and exit"
return

KeyInput:
control camera using arrowkeys 0,(imageW+imageH)/4,2    
x#=camera position x():y#=camera position y():z#=camera position z()
if mouseclick()=1 then position camera x#,y#+1,z#
if mouseclick()=2 then position camera x#,y#-1,z#
if lower$(inkey$())="w" then xrotate object Main,0:color backdrop rgb(92,114,163):color object Main,rgb(128,128,128)
if lower$(inkey$())="g" then xrotate object Main,90:color backdrop rgb(128,64,0):color object Main,rgb(128,64,0)
if lower$(inkey$())="s" then fix object pivot Main:make mesh from object 42,Main:save mesh str$(1000+rnd(9000))+".x",42:end
return