PANDA3D入门----------古道天马一、前言这个是我自学的总结。因为刚开始看PANDA3D的教程,发现在看天书,静下心来学后,感觉其实是教程不够深入浅出,没有照顾我们这些一点基础都没有的初学者。因此,把我自学的一点心得记录下来,便于自己及他人参考。学习PANDA3D的目的是编制一个三维的设备管理程序。嫌C#运行效率低下,C++的语言不够简练,看好了PYTHON编程。百度了一下,PYTHON的3D图形库有PYGLET,PANDA3D,BLENDER等,最初是想用BLENDER,但是BELNDER侧重于建模,于我的用途不太符合。改用PYGLET的,看中它也是很简练的库,后来发现PYGLET缺乏维护,教程也少。因此转向PANDA3D,PANDA3D的教程以及维护要完善的多。但是按网上的说法,学习曲线是比较陡峭的。果然,刚开始时一头雾水,经过查阅官方教程后,又通过自己一点点的实验和摸索,稍微有点头绪了。顺便提一下,我的PYTHON和PANDA3D是同步学的,都在初级阶段。这里侧重写PANDA3D的特点,PYTHON的略微提到些。注意:这不是手册,很多进阶的东东请查官网手册。二、安装我的系统是WIN764位,安装PYTHON的2.7.6版本32位版,的1.8.1版本(自带2.7.3版本的PYTHON)。打开“开始”菜单,运行PANDA3D下的范例文件,第一个范例是ASTEROIDS,小行星。点击“RunAsteroids”,出现游戏界面这说明PANDA3D内含的PYTHON2.7.3已经可以运行了。现在,大家肯定都迫不及待的要看看源代码了吧。点击ViewSourceCode出现文件夹点击Tut-Asteroids.py,结果出现提示没有找到模块,说明你的PYTHON2.7.6还没找到PANDA3D的模块。那么按下面的方法做。在C:\Python27\Lib\site-packages的目录下,建一个PANDA.PTH的文件,用写字本添加下列文本(这里的文件路径是默认的,如果你修改过的话,根据实际情况调整)C:\Panda3D-1.8.1C:\Panda3D-1.8.1/direct/src/actorC:\Panda3D-1.8.1/direct/src/clusterC:\Panda3D-1.8.1/direct/src/controlsC:\Panda3D-1.8.1/direct/src/directbaseC:\Panda3D-1.8.1/direct/src/directdevicesC:\Panda3D-1.8.1/direct/src/directnotifyC:\Panda3D-1.8.1/direct/src/directscriptsC:\Panda3D-1.8.1/direct/src/directtoolsC:\Panda3D-1.8.1/direct/src/directutilC:\Panda3D-1.8.1/direct/src/distributedC:\Panda3D-1.8.1/direct/src/extensionsC:\Panda3D-1.8.1/direct/src/extensions_nativeC:\Panda3D-1.8.1/direct/src/ffiC:\Panda3D-1.8.1/direct/src/fsmC:\Panda3D-1.8.1/direct/src/guiC:\Panda3D-1.8.1/direct/src/intervalC:\Panda3D-1.8.1/direct/src/leveleditorC:\Panda3D-1.8.1/direct/src/motiontrailC:\Panda3D-1.8.1/direct/src/particlesC:\Panda3D-1.8.1/direct/src/physicsC:\Panda3D-1.8.1/direct/src/pyinstC:\Panda3D-1.8.1/direct/src/showbaseC:\Panda3D-1.8.1/direct/src/showutilC:\Panda3D-1.8.1/direct/src/taskC:\Panda3D-1.8.1/direct/src/tkpanelsC:\Panda3D-1.8.1/direct/src/tkwidgetsC:\Panda3D-1.8.1/bin再次点击Tut-Asteroids.py,看看是否成功运行。三、正式开始现在安装工作已经完成,我们可以正式开始了。右键Tut-Asteroids.py文件,用IDLE打开,我们可以看到源程序,按F5可以调试运行。不过拿这个源程序作为我们的开端,显然是不合适。3.1第一个PANDA程序现在我们开始编写第一个PANDA3D程序。第一个程序,当然要简单粗暴些。新建一个TEST.PY(注:PANDA3D似乎不支持中文目录,所以你的程序不要放在中文目录下),用IDLE编辑(原则上你也可以用其它文本编辑器编辑)输入以下两行importdirect.directbase.DirectStartrun()CTRL-S保存,F5运行(顺便提一下,PYTHON2.7以前的IDLE是不支持右键复制黏贴的,不用快捷键会很蛋疼,2.7的版本是懒人的福音)出现一个灰色的空窗口,比较简陋些,不过作为第一个程序已经够了。根据官网的解释,第一句importdirect.directbase.DirectStart,建立ShowBase的实例第二句run(),循环运行ShowBase实例,监视键盘鼠标输入,并反馈。(试试:如果删了RUN()会咋样?)老版本的PANDA的语法是这样写的。fromdirect.showbase.ShowBaseimportShowBasep3dApp=ShowBase()p3dApp.run()这里的ShowBase是显式的,新的语法里都简化了。有兴趣的话,你可以打开C:\Panda3D-1.8.1\direct\directbase看看里面的源程序。不过,本着初学者够用就行的态度,咱们就不用深究这些了,只要记住这两句的作用如下:importdirect.directbase.DirectStart#建立舞台run()#演出开始了!#是PYTHON的注释方法保存时,程序会提示你有中文注释,要加#-*-coding:cp936-*-,同意它修改就好。3.2加料灰色窗口太不起眼了,需要加点料,事实上只要加两行就能让它大变样。#-*-coding:cp936-*-importdirect.directbase.DirectStart#建立舞台environ=loader.loadModel(models/environment)environ.reparentTo(render)run()#演出开始了!F5出现哈哈,两行代码就有这么大变化,:-O,厉害的!还有更厉害的,试着按住鼠标左右键拖动看看!默认的鼠标控制方式如下:(当然,这个控制方式很不人道)KeyAction鼠标左键左右进行平移鼠标右键前后移动鼠标中键围绕程序的坐标原点进行旋转鼠标右键和中键围绕视野中心轴进行滚动对这两句代码的解释如下environ=loader.loadModel(models/environment)#导入模型environ.reparentTo(render)#将模型加入渲染列表第一句代码:environ,是我们自行规定的一个变量,这个变量现在代表了我们在等号后面导入的模型。loader.loadModel(),它的作用是导入一个模型。(注意:PYTHON对大小写敏感)这句代码稀奇的是,我们并没有新建这个模型,可是却可以导入这个模型。那么这个模型在哪里呢?原来,这个模型在C:\Panda3D-1.8.1\models下,文件名为environment.egg.pz。(注意:在代码里面的文件路径用的是LINUX的斜杠”/”,和WIN下的反斜杠”\”不一样)这个*.pz文件,是一种压缩格式,后面会提到。这里我们只要理解了,程序在默认的文件夹下找到了environment的模型文件。当然,这个文件有可能是environment.egg.pz或者environment.egg或者environment.bam。(试试,将C:\Panda3D-1.8.1\models下的environment.egg.pz改名或者挪个位置)事实上,如果我们在程序所在文件夹下新建一个models文件夹并将environment.egg.pz拷贝在此文件夹下,程序同样可以找到模型。(想想,如果有两个同名模型会咋样?)第二句代码:environ.reparentTo(render),意思是将environ模型置于render节点下。节点是个术语,是为了更好的组织各个模型。模型只有置于节点下,才能被程序渲染。整个结构是个树型表。有个比较容易理解的比喻是,将节点看成文件夹。Render就是根目录C:,模型就是文件,我们要看到模型,就必须把文件拷到C:(关于节点的用法,我们后面详述)。当然,为了方便管理,我们可以在C:盘下建立目录,以及子目录,这种目录叫做空节点四、创建模型上面那个environment模型,超出了我们的理解能力。现在,我们试着自行建立一个模型。在你程序所在文件夹下,创建一个models文件夹。4.1建立正方形在models文件夹下,新建一个square.egg模型文件。用记事本编辑square.egg,并拷入下列代码。CoordinateSystem{Z-up}Group{VertexPoolCube{Vertex0{1.01.0-1.0}Vertex1{1.0-1.0-1.0}Vertex2{-1.0-1.0-1.0}Vertex3{-1.01.0-1.0}}Polygon{VertexRef{0321Ref{Cube}}}}现在将我们的TEST.PY修改为#-*-coding:cp936-*-importdirect.directbase.DirectStart#建立舞台box=loader.loadModel(models/square)#导入模型box.reparentTo(render)#将模型加入渲染列表run()#演出开始了!F5运行,咦,还是没东东啊。我们还需要加代码。#-*-coding:cp936-*-importdirect.directbase.DirectStart#建立舞台box=loader.loadModel(models/square)#导入模型box.reparentTo(render)#将模型加入渲染列表box.setPos(0,20,-3)#设置模型原点的位置run()#演出开始了!box.setPos(0,20,-3),含义是将模型按其原点(0,0,0)对应PANDA3D坐标的(0,20,-3)的对应关系放置。一个梯形。如果你按住鼠标左键移动的话,会发现,原来是个一个水平放置的正方形。现在我们得了解一下PANDA3D的坐标系以及EGG文件了。下面是PANDA3D的坐标系从屏幕上看,就是X方向是屏幕的宽,Z方向就是屏幕的高,Y方向就是屏幕的深了。简单解释一下square.egg文件代码的含义CoordinateSystem{Z-up}//Z方向向上,这和PANDA的坐标系是一致的。(你可以试试X方向或者Y方向向上会如何)Group{//给顶点集和多边形编组VertexPoolCube{//顶点集,我们将这个集命名为CUBEVertex0{//CUBE顶点集下的第1个点,编号为0,