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