i can’t upload attachment here, so 5 files are missing in this code:
ocean.egg ocean.bmp land1.png land1.jpg arial.ttf
from pandac.PandaModules import loadPrcFileData
loadPrcFileData("", ''' show-frame-rate-meter 0 ''')
loadPrcFileData("", ''' sync-video 1 ''')
loadPrcFileData("", ''' clock-mode limited ''')
loadPrcFileData("", ''' clock-frame-rate 50.0 ''')
loadPrcFileData("", ''' cursor-hidden 1 ''')
loadPrcFileData("", ''' undecorated 1 ''')
loadPrcFileData("", ''' fullscreen 0 ''')
loadPrcFileData("", ''' win-origin 0 0 ''')
loadPrcFileData("", ''' win-size 1024 768 ''')
loadPrcFileData("", ''' aspect-ratio 1.333333333333333333333333333333333333333333333333 ''')
loadPrcFileData("", ''' coordinate-system z-up ''')
loadPrcFileData("", ''' text-minfilter linear ''')
loadPrcFileData("", ''' texture-minfilter linear ''')
loadPrcFileData("", ''' max-texture-dimension 1024 ''')
loadPrcFileData("", ''' max-texture-stages 3 ''')
loadPrcFileData("", ''' view-frustum-cull 1 ''')
loadPrcFileData("", ''' exclude-texture-scale land1.jpg ''')
loadPrcFileData("", ''' basic-shaders-only 1 ''')
loadPrcFileData("", ''' rescale-normals auto ''')
import sys,os,random,math
from math import pi,sin,cos,tan,sqrt
from direct.showbase import Audio3DManager
from direct.showbase.ShowBase import ShowBase
from direct.showbase.DirectObject import DirectObject
from direct.gui.OnscreenText import OnscreenText
from panda3d.core import PerspectiveLens,TextureStage,Material
from panda3d.core import AmbientLight,DirectionalLight,Fog,GeoMipTerrain
from panda3d.core import PandaNode,NodePath,Camera,TextNode
from panda3d.core import Point3,Vec3,Vec4,BitMask32
from panda3d.core import CollisionTraverser,CollisionNode,CollisionHandlerQueue,CollisionRay
from pandac.PandaModules import Filename
from direct.task import Task
class Simulator(ShowBase):
def __init__(self):
ShowBase.__init__(self)
self.interval=0.02
self.aspect=1024.0/768.0
self.fov=45.0
self.nearclip=0.5
self.farclip=5000.0
base.camLens.setAspectRatio(self.aspect)
base.camLens.setNearFar(self.nearclip,self.farclip)
base.camLens.setFov(self.fov)
self.fog0color=(0.66,0.75,0.85,1.0)
base.setBackgroundColor(self.fog0color)
self.fog0=Fog("distancefog")
self.fog0.setColor(self.fog0color)
self.fog0.setMode(Fog.MExponentialSquared)
self.fog0.setExpDensity(0.0002)
render.setFog(self.fog0)
self.suncolor=Vec4(1.0,1.0,1.0,1.0)
self.sun=DirectionalLight('sunlight')
self.sun.setColor(self.suncolor)
self.sun.setSpecularColor(self.suncolor)
self.sun.setDirection(Vec3(0.1,0.9,-0.9))
render.setLight(render.attachNewNode(self.sun))
self.ambientlightcolor=Vec4(0.1,0.1,0.1,1.0)
self.ambientlight=AmbientLight('ambientlight')
self.ambientlight.setColor(self.ambientlightcolor)
render.setLight(render.attachNewNode(self.ambientlight))
self.showhud=0
self.frametime1=self.frametime2=0.0
self.hudtimer=0
self.zoomtimer=9
self.simmode=0
self.eye2cg=1.0
self.groundheight=0.0
self.camminheight=0.25
self.cammaxheight=50000.0
self.camspeed=0.0
self.camforwardtimer=0
self.camsidetimer=0
self.mapwidth=1000000.0
self.borderwidth=60000.0
self.startx0=500000.0
self.starty0=500000.0
self.startz0=1500.0
self.cgcoordx=self.startx0
self.cgcoordy=self.starty0
self.cgcoordz=self.startz0
self.startx=self.startx0
self.starty=self.starty0
self.startz=self.startz0
self.camcoordx=self.startx
self.camcoordy=self.starty
self.camcoordz=self.startz
self.camheading=self.campitch=self.camlean=0.0
self.mousex=self.mousey=0
self.campanrate=0.11
self.campitchrate=0.1
self.camshakeh=self.camshakep=self.camshaker=0.0
self.camskrateh=self.camskratep=self.camskrater=0.0
self.deg2rad=pi/180.0
self.rad2deg=180.0/pi
self.mousebtn=[0,0,0]
self.keymap={"keyi":0,"keyk":0,"keyj":0,"keyl":0,"keyu":0,"keyo":0,"keyn":0,
"ctrl0":0,"ctrl1":0,"ctrl2":0,"ctrl3":0,"up":0,"down":0,"left":0,"right":0}
self.accept("i",self.setkey,["keyi",1])
self.accept("i-up",self.setkey,["keyi",0])
self.accept("k",self.setkey,["keyk",1])
self.accept("k-up",self.setkey,["keyk",0])
self.accept("j",self.setkey,["keyj",1])
self.accept("j-up",self.setkey,["keyj",0])
self.accept("l",self.setkey,["keyl",1])
self.accept("l-up",self.setkey,["keyl",0])
self.accept("u",self.setkey,["keyu",1])
self.accept("u-up",self.setkey,["keyu",0])
self.accept("o",self.setkey,["keyo",1])
self.accept("o-up",self.setkey,["keyo",0])
self.accept("n",self.setkey,["keyn",1])
self.accept("n-up",self.setkey,["keyn",0])
self.accept("arrow_up",self.setkey,["up",1])
self.accept("arrow_up-up",self.setkey,["up",0])
self.accept("arrow_down",self.setkey,["down",1])
self.accept("arrow_down-up",self.setkey,["down",0])
self.accept("arrow_left",self.setkey,["left",1])
self.accept("arrow_left-up",self.setkey,["left",0])
self.accept("arrow_right",self.setkey,["right",1])
self.accept("arrow_right-up",self.setkey,["right",0])
self.accept("control-0",self.setkey,["ctrl0",1])
self.accept("control-1",self.setkey,["ctrl1",1])
self.accept("control-2",self.setkey,["ctrl2",1])
self.accept("control-3",self.setkey,["ctrl3",1])
self.accept("control-h",self.setkey,["ctrlh",1])
self.keymap["ctrlh"]=0
base.disableMouse()
base.win.movePointer(0,512,384)
self.accept("mouse1",self.mousebutton,[0,1])
self.accept("mouse1-up",self.mousebutton,[0,0])
self.accept("mouse2",self.mousebutton,[1,1])
self.accept("mouse2-up",self.mousebutton,[1,0])
self.accept("mouse3",self.mousebutton,[2,1])
self.accept("mouse3-up",self.mousebutton,[2,0])
self.arial=loader.loadFont('model/arial.ttf')
self.simmodetext=["MODE1","MODE2","MODE3","MODE4"]
self.ocean=self.loader.loadModel("model/ocean")
self.ocean.reparentTo(render)
self.ocean.setScale(1,1,1)
self.ocean.setPos(0,0,0)
for oceanIDy in range(10):
for oceanIDx in range(10):
oceanrepeat = render.attachNewNode("oceanrepeater")
oceanrepeat.setPos(oceanIDx*99999.9,oceanIDy*99999.9,0)
self.ocean.instanceTo(oceanrepeat)
self.land1=GeoMipTerrain("Land1")
self.land1.setHeightfield("model/land1.png")
self.land1.getRoot().reparentTo(render)
self.land1scalex=self.land1scaley=50.0
self.land1scalez=2560.0
self.land1offx=self.land1offy=475000.0
self.land1offz=-6.0
self.land1.getRoot().setScale(self.land1scalex,self.land1scaley,self.land1scalez)
self.land1.getRoot().setPos(self.land1offx,self.land1offy,self.land1offz)
self.land1.setBlockSize(64)
self.land1.setNearFar(10000.0,20000.0)
self.land1.setFocalPoint(base.camera)
self.land1.setAutoFlatten(GeoMipTerrain.AFMOff)
self.land1skin=TextureStage('Land1skin')
self.land1jpg=loader.loadTexture('model/land1.jpg')
self.land1jpg.setMagfilter(self.land1jpg.FTLinear)
self.land1jpg.setMinfilter(self.land1jpg.FTLinear)
self.land1.getRoot().setTexture(self.land1skin,self.land1jpg)
self.land1mat=Material()
self.land1mat.setShininess(20.0)
self.land1mat.setAmbient(Vec4(1,1,1,1))
self.land1mat.setDiffuse(Vec4(1,1,1,1))
self.land1mat.setEmission(Vec4(0,0,0,0))
self.land1mat.setSpecular(Vec4(0.03,0.03,0.03,0.03))
self.land1.getRoot().setMaterial(self.land1mat)
self.land1.generate()
taskMgr.add(self.mode1,"mode1-task")
taskMgr.add(self.mode2,"mode2-task")
taskMgr.add(self.mode3,"mode3-task")
taskMgr.add(self.mode4,"mode4-task")
def setkey(self,key,value):
self.keymap[key]=value
def mousebutton(self,id,value):
self.mousebtn[id]=value
def updatehud(self):
self.frametime2=globalClock.getFrameTime()
self.averframerate=10.0/(self.frametime2-self.frametime1)
self.frametime1=self.frametime2
self.frameratetext.setText(str(int(self.averframerate)))
self.info1.setText(str(int(self.camheading)))
self.info2.setText(str(int(self.campitch)))
self.info3.setText(str(int(self.camlean)))
self.info4.setText(str(float(int(self.camcoordx*10))/10))
self.info5.setText(str(float(int(self.camcoordy*10))/10))
self.info6.setText(str(float(int(self.camcoordz*10))/10))
self.hudtimer=0
def togglehud(self):
if (self.showhud==1):self.hudoff()
else:self.hudon()
self.keymap["ctrlh"]=0
def hudon(self):
self.frameratetext=OnscreenText(text="0",
style=2,font=self.arial,fg=(1,1,1,1),pos=(-1.30,0.96),scale=.05)
self.simmodetitle=OnscreenText(text=self.simmodetext[self.simmode],
style=1,font=self.arial,fg=(1,1,1,1),pos=(1.16,-0.97),scale=.03)
self.title=OnscreenText(text="Simulator",style=2,font=self.arial,
fg=(1,1,1,1),pos=(1.05,-0.93),scale=.09)
self.infohpr=OnscreenText(text="H P R",
style=1,font=self.arial,fg=(1,1,1,1),pos=(-1.16,-0.98),scale=.04)
self.infoxyz=OnscreenText(text="X Y Z",
style=1,font=self.arial,fg=(1,1,1,1),pos=(-0.50,-0.98),scale=.04)
self.info1=OnscreenText(text="0",
style=1,font=self.arial,fg=(1,1,1,0.7),pos=(-1.24,-0.98),scale=.04)
self.info2=OnscreenText(text="0",
style=1,font=self.arial,fg=(1,1,1,0.7),pos=(-1.10,-0.98),scale=.04)
self.info3=OnscreenText(text="0",
style=1,font=self.arial,fg=(1,1,1,0.7),pos=(-0.97,-0.98),scale=.04)
self.info4=OnscreenText(text="0",
style=1,font=self.arial,fg=(1,1,1,0.7),pos=(-0.63,-0.98),scale=.04)
self.info5=OnscreenText(text="0",
style=1,font=self.arial,fg=(1,1,1,0.7),pos=(-0.38,-0.98),scale=.04)
self.info6=OnscreenText(text="0",
style=1,font=self.arial,fg=(1,1,1,0.7),pos=(-0.15,-0.98),scale=.04)
self.showhud=1
self.hudtimer=0
def hudoff(self):
self.frameratetext.destroy()
self.simmodetitle.destroy()
self.title.destroy()
self.infohpr.destroy()
self.infoxyz.destroy()
self.info1.destroy()
self.info2.destroy()
self.info3.destroy()
self.info4.destroy()
self.info5.destroy()
self.info6.destroy()
self.showhud=0
def readmouse(self):
getmousepos=base.win.getPointer(0)
self.mousex=getmousepos.getX()
self.mousey=getmousepos.getY()
base.win.movePointer(0,512,384)
def camleanreturn(self):
if (self.camlean==0):return
if (self.camlean<0.05) & (self.camlean>-0.05):self.camlean=0.0
else:self.camlean*=0.92
def getcamhpr1(self):
self.camheading-=(self.mousex-512)*self.campanrate*self.fov*self.interval
self.campitch-=(self.mousey-384)*self.campitchrate*self.fov*self.interval
if (self.camheading<-180):self.camheading+=360
if (self.camheading>180):self.camheading-=360
if (self.campitch<-75):self.campitch=-75
if (self.campitch>75):self.campitch=75
def getcamhpr2(self):
return
def getgroundheight(self,groundx,groundy):
return
def camclamp(self):
self.camcoordz=max(self.camcoordz,self.groundheight+self.camminheight)
self.camcoordz=min(self.camcoordz,self.cammaxheight)
self.camcoordx=min(self.camcoordx,self.mapwidth-self.borderwidth)
self.camcoordx=max(self.camcoordx,self.borderwidth)
self.camcoordy=min(self.camcoordy,self.mapwidth-self.borderwidth)
self.camcoordy=max(self.camcoordy,self.borderwidth)
def freecammove(self):
forward=self.keymap["up"]-self.keymap["down"]
side=self.keymap["left"]-self.keymap["right"]
if (forward==0):self.camforwardtimer=int(self.camforwardtimer*0.95)
elif (forward>0):self.camforwardtimer+=1
else:self.camforwardtimer-=1
if (side==0):self.camsidetimer=int(self.camsidetimer*0.95)
elif (side>0):self.camsidetimer+=1
else:self.camsidetimer-=1
forwardspeed=self.camforwardtimer*25.0
sidespeed=self.camsidetimer*25.0
pitchcos=cos(self.campitch*self.deg2rad)
headingsin=sin(self.camheading*self.deg2rad)
headingcos=cos(self.camheading*self.deg2rad)
self.camcoordx-=(forwardspeed*headingsin*pitchcos+sidespeed*headingcos)*self.interval
self.camcoordy+=(forwardspeed*headingcos*pitchcos-sidespeed*headingsin)*self.interval
self.camcoordz+=forwardspeed*sin(self.campitch*self.deg2rad)*self.interval
if (self.mousebtn[0]==1):
self.startx=self.camcoordx
self.starty=self.camcoordy
self.startz=self.camcoordz
if (self.mousebtn[2]==1):
self.camcoordx=self.startx0
self.camcoordy=self.starty0
self.camcoordz=self.startz0
def globaltask1(self):
base.win.closeIme()
self.land1.update()
self.readmouse()
def globaltask2(self):
base.camera.setHpr(self.camheading,self.campitch,self.camlean)
base.camera.setPos(self.camcoordx,self.camcoordy,self.camcoordz)
if (self.keymap["ctrlh"]==1):self.togglehud()
if (self.showhud==1):
self.hudtimer+=1
if (self.hudtimer==10):self.updatehud()
def camzoom1(self):
if (self.mousebtn[1]==1):
if (self.zoomtimer==0):self.fpszoom()
elif (self.zoomtimer>0):self.zoomtimer-=1
def fpszoom(self):
if (self.fov<3.0):self.fov=45.0
else:self.fov*=0.25
self.nearclip=0.5*45.0/self.fov
self.farclip=5000.0*sqrt(45.0/self.fov)
base.camLens.setNearFar(self.nearclip,self.farclip)
base.camLens.setFov(self.fov)
self.zoomtimer=25
def simmodeswitch(self,targetmode):
self.simmode=targetmode
self.keymap["ctrl0"]=0
self.keymap["ctrl1"]=0
self.keymap["ctrl2"]=0
self.keymap["ctrl3"]=0
if (self.showhud==1):self.simmodetitle.setText(self.simmodetext[targetmode])
def mode4(self,task):
if (self.simmode!=3):return Task.cont
if (self.keymap["ctrl0"]==1):self.simmodeswitch(0)
elif (self.keymap["ctrl1"]==1):self.simmodeswitch(1)
elif (self.keymap["ctrl2"]==1):self.simmodeswitch(2)
self.globaltask1()
self.globaltask2()
return Task.cont
def mode3(self,task):
if (self.simmode!=2):return Task.cont
if (self.keymap["ctrl0"]==1):self.simmodeswitch(0)
elif (self.keymap["ctrl1"]==1):self.simmodeswitch(1)
elif (self.keymap["ctrl3"]==1):self.simmodeswitch(3)
self.globaltask1()
self.globaltask2()
return Task.cont
def mode2(self,task):
if (self.simmode!=1):return Task.cont
if (self.keymap["ctrl0"]==1):self.simmodeswitch(0)
elif (self.keymap["ctrl2"]==1):self.simmodeswitch(2)
elif (self.keymap["ctrl3"]==1):self.simmodeswitch(3)
self.globaltask1()
self.getcamhpr1()
self.camcoordx=self.cgcoordx
self.camcoordy=self.cgcoordy
self.camcoordz=self.cgcoordz+self.eye2cg*cos(self.camlean)
self.camzoom1()
self.globaltask2()
return Task.cont
def mode1(self,task):
if (self.simmode!=0):return Task.cont
if (self.keymap["ctrl1"]==1):self.simmodeswitch(1)
elif (self.keymap["ctrl2"]==1):self.simmodeswitch(2)
elif (self.keymap["ctrl3"]==1):self.simmodeswitch(3)
self.globaltask1()
self.getcamhpr1()
self.camleanreturn()
self.freecammove()
self.getgroundheight(self.camcoordx,self.camcoordy)
self.camclamp()
self.camzoom1()
self.globaltask2()
return Task.cont
app=Simulator()
run()