panda3d 入门.docx
- 文档编号:23986045
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:24
- 大小:723.79KB
panda3d 入门.docx
《panda3d 入门.docx》由会员分享,可在线阅读,更多相关《panda3d 入门.docx(24页珍藏版)》请在冰豆网上搜索。
panda3d入门
ﻩﻩﻩﻩﻩﻩPANDA3D入门
ﻩﻩﻩﻩﻩ—---—-—-—-古道天马
一、前言
这个就是我自学得总结、
因为刚开始瞧PANDA3D得教程,发现在瞧天书,静下心来学后,感觉其实就是教程不够深入浅出,没有照顾我们这些一点基础都没有得初学者。
因此,把我自学得一点心得记录下来,便于自己及她人参考。
学习PANDA3D得目得就是编制一个三维得设备管理程序。
嫌C#运行效率低下,C++得语言不够简练,瞧好了PYTHON编程。
XX了一下,PYTHON得3D图形库有PYGLET,PANDA3D,BLENDER等,最初就是想用BLENDER,但就是BELNDER侧重于建模,于我得用途不太符合。
改用PYGLET得,瞧中它也就是很简练得库,后来发现PYGLET缺乏维护,教程也少。
因此转向PANDA3D,PANDA3D得教程以及维护要完善得多。
但就是按网上得说法,学习曲线就是比较陡峭得。
果然,刚开始时一头雾水,经过查阅官方教程后,又通过自己一点点得实验与摸索,稍微有点头绪了。
顺便提一下,我得PYTHON与PANDA3D就是同步学得,都在初级阶段。
这里侧重写PANDA3D得特点,PYTHON得略微提到些。
注意:
这不就是手册,很多进阶得东东请查官网手册。
二、安装
我得系统就是WIN7 64位,安装PYTHON得2、7。
6版本32位版,
PANDA3D得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、1ﻫC:
\Panda3D-1、8.1/direct/src/actor ﻫC:
\Panda3D-1。
8、1/direct/src/cluster ﻫC:
\Panda3D-1。
8、1/direct/src/controls ﻫC:
\Panda3D-1。
8。
1/direct/src/directbase
C:
\Panda3D—1、8.1/direct/src/directdevices ﻫC:
\Panda3D—1、8。
1/direct/src/directnotify
C:
\Panda3D—1、8。
1/direct/src/directscripts
C:
\Panda3D-1.8、1/direct/src/directtools ﻫC:
\Panda3D—1、8、1/direct/src/directutil ﻫC:
\Panda3D—1.8.1/direct/src/distributed
C:
\Panda3D-1、8、1/direct/src/extensions ﻫC:
\Panda3D—1.8。
1/direct/src/extensions_native
C:
\Panda3D—1。
8.1/direct/src/ffi
C:
\Panda3D—1。
8。
1/direct/src/fsm ﻫC:
\Panda3D—1、8、1/direct/src/gui
C:
\Panda3D-1。
8。
1/direct/src/interval ﻫC:
\Panda3D-1。
8.1/direct/src/leveleditor
C:
\Panda3D—1。
8.1/direct/src/motiontrail ﻫC:
\Panda3D-1.8、1/direct/src/particles
C:
\Panda3D-1.8.1/direct/src/physics ﻫC:
\Panda3D—1.8、1/direct/src/pyinst ﻫC:
\Panda3D-1.8、1/direct/src/showbase ﻫC:
\Panda3D-1、8。
1/direct/src/showutil
C:
\Panda3D-1。
8。
1/direct/src/task
C:
\Panda3D—1。
8。
1/direct/src/tkpanels ﻫC:
\Panda3D—1、8.1/direct/src/tkwidgets ﻫC:
\Panda3D-1.8。
1/bin
再次点击Tut-Asteroids.py,瞧瞧就是否成功运行。
三、正式开始
现在安装工作已经完成,我们可以正式开始了。
右键Tut—Asteroids。
py文件,用IDLE打开,我们可以瞧到源程序,按F5可以调试运行。
不过拿这个源程序作为我们得开端,显然就是不合适。
3、1第一个PANDA程序
现在我们开始编写第一个PANDA3D程序。
第一个程序,当然要简单粗暴些。
新建一个TEST。
PY(注:
PANDA3D似乎不支持中文目录,所以您得程序不要放在中文目录下),用IDLE编辑(原则上您也可以用其它文本编辑器编辑)
输入以下两行
import direct、directbase、DirectStart
run()
CTRL-S保存,F5运行(顺便提一下,PYTHON2、7以前得IDLE就是不支持右键复制黏贴得,不用快捷键会很蛋疼,2.7得版本就是懒人得福音)
出现一个灰色得空窗口,比较简陋些,不过作为第一个程序已经够了、
根据官网得解释,
第一句importdirect、directbase.DirectStart,建立ShowBase得实例
第二句run(),循环运行ShowBase实例,监视键盘鼠标输入,并反馈。
(试试:
如果删了RUN()会咋样?
)
老版本得PANDA得语法就是这样写得。
fromdirect。
showbase.ShowBase import ShowBase
p3dApp=ShowBase()ﻫp3dApp、run()
这里得ShowBase就是显式得,新得语法里都简化了、有兴趣得话,您可以打开C:
\Panda3D—1。
8。
1\direct\directbase瞧瞧里面得源程序。
不过,本着初学者够用就行得态度,咱们就不用深究这些了,只要记住这两句得作用如下:
import direct。
directbase。
DirectStart#建立舞台
run()#演出开始了!
#就是PYTHON得注释方法
保存时,程序会提示您有中文注释,要加 #—*—coding:
cp936—*— ,同意它修改就好。
3、2加料
灰色窗口太不起眼了,需要加点料,事实上只要加两行就能让它大变样。
#-*-coding:
cp936-*—
importdirect、directbase.DirectStart#建立舞台
environ=loader。
loadModel(”models/environment”)
environ。
reparentTo(render)
run() #演出开始了!
F5出现
哈哈,两行代码就有这么大变化,:
-O,厉害得!
还有更厉害得,试着按住鼠标左右键拖动瞧瞧!
默认得鼠标控制方式如下:
(当然,这个控制方式很不人道)
鼠标左键
左右进行平移
鼠标右键
前后移动
鼠标中键
围绕程序得坐标原点进行旋转
鼠标右键与中键
围绕视野中心轴进行滚动
对这两句代码得解释如下
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>{
〈VertexPool>Cube{
〈Vertex>0 {
1.01、0-1。
0
}
<Vertex>1{
1。
0-1。
0—1、0
}
<Vertex〉2{
-1。
0—1、0 —1.0
}
-1.01.0 -1。 0 } } 〈Polygon〉{ } } 现在将我们得TEST.PY修改为 #-*-coding: cp936 -*— import direct。 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〉 { //给顶点集与多边形编组 <VertexPool〉 Cube {//顶点集,我们将这个集命名为CUBE <Vertex>0{ //CUBE顶点集下得第1个点,编号为0,您也可以从别得序号开始编 1.01.0—1、0 //顶点得XYZ坐标 } 1、0-1、0 —1.0 } 〈Vertex>2{ —1。 0 —1、0-1。 0 } <Vertex>3{ -1。 01、0 —1、0 } } 〈VertexRef〉{03 21<Ref>{Cube}}//多边形得顶点就是顶点集CUBE下得4个点。 } } 上面点得坐标就是相对模型空间得原点(0,0,0)得值,原点也就是setPos()函数操作得点、 box、setPos(0,20,-3)#设置模型原点得位置 这句得意思就就是将box模型按照模型空间原点(0,0,0)对应屏幕空间点(0,20,—3)得方式放置、 实践: 1)调整程序文件中得setPos()得参数,瞧瞧有什么变化、 2)模型文件中得增加或者减少多边型得点,改变点得坐标,改变多边形点得排列顺序,瞧瞧能否找到什么规律(注意,一次最好只改一项) 刚才我们在用鼠标移动那个水平放置得正方形时,会发现正方形移动到屏幕上方会消失。 这说明这个正方形就是有方向型得,它得反面就是不可见得。 模型得方向就是右手性得。 右手螺旋系 当然,PANDA得坐标系也就是右手性得。 反面不可见就是为了减少计算量,所以我们要确保多边形在正确得方向上,以免瞧不到。 4。 2 建立正方体 现在我们可以通过修改EGG文件来创建一个正方体模型了。 在MODELS文件夹下新建CUBE.EGG文件、 小心调整方向后,我们得到下面这些代码、 <CoordinateSystem> {Z-up} 〈Group〉{ 1.0 1。 0—1、0 } 1.0—1、0 —1。 0 } —1.0—1。 0—1.0 } <Vertex>3{ —1。 01。 0-1、0 } 〈Vertex〉4{ 1。 01、0 1.0 } 1。 0-1。 0 1、0 } <Vertex>6{ -1。 0-1.01、0 } —1、0 1、01.0 } } 〈VertexRef〉 { 0 12 3 } <Polygon>{ <VertexRef>{ 4 765 <Ref>{Cube}} } 〈Polygon〉{ } 〈Polygon>{ 〈VertexRef〉{1562<Ref〉 {Cube}} } 〈Polygon>{ 〈VertexRef>{2673<Ref>{Cube}} } } } 因为模型名字变了,所以在我们得TEST、PY中将模型改为cube box = loader、loadModel("models/cube") #导入模型 4.3 增加颜色 一个纯白得正方体,太朴素了,我们给它加点颜色 修改cube.egg文件,在顶点1得属性中加入一行颜色。 <Vertex>1{ 1。 0—1。 0-1、0 〈RGBA>{1.00。 00。 0 1。 0} } 我们给 顶点1变成红色, <RGBA>{ 1。 00。 00、01.0} 红、绿、蓝、不透明度(阿尔法值) 现在我们得到一个有一个红角得正方体。 注意中间得粉色,就是通过对4个顶点得颜色插值得到得、 试着修改其它点得颜色吧。 注意白色就是〈RGBA> { 1.0 1、01。 01。 0} 这就是我得到一个混色正方体。 4。 4 调整比例 在PANDA3D中我们可以随意设置模型得三个方向得比例尺。 #-*-coding: cp936-*- importdirect、directbase。 DirectStart#建立舞台 box=loader.loadModel("models/cube")# 导入模型 box.reparentTo(render)#将模型加入渲染列表 box、setPos(0,20,-3)#设置BOX得原点位置 box、setScale(0.5,0、5,0、5)#设置BOX得三个方向得比例尺,对模型放大缩小 run()#演出开始了! 您可以试试通过setScale()把正方体变成长方体。 五、镜头 首先我们可以想象我们就是通过一个镜头在观察模型。 事实上,PANDA3D中确实有这个镜头。 如果您对镜头得具体数据不关心得话,您可以跳到5。 3。 5.1近距 我们知道,如果模型在镜头之后(Y〈0),显然就是不可见得、但就是模型在镜头之前就必定被渲染了么? 下面我们做个试验来测试一下、 我们设计一个正方形,它在模型空间得Y值为0,放置于屏幕空间就会平行于屏幕。 Square、egg文件如下: <CoordinateSystem〉 {Z-up} 〈Group〉{ 〈Vertex>0{ 1。 0 0。 01.0 〈RGBA〉{1、00、00。 01.0} } 1.00、0—1、0 〈RGBA> { 1.01.01。 01.0} } —1。 0 0、0 1。 0 <RGBA>{ 0。 0 1.00.01.0} } <Vertex>3{ —1、0 0。 0—1、0 〈RGBA〉{1、01、01.01。 0} } } } } Test、py如下 #—*—coding: cp936-*- import direct.directbase。 DirectStart box=loader。 loadModel("models/square") box.reparentTo(render) box、setPos(0,16,0) run() 下面我们调整setPos()得Y值 注意当Y值变化时,这个2*2得正方形得视觉变化; Y=16 Y=8 Y=4 Y=2。 9 Y=1。 0000001 Y=1 从这个试验,我们大致可以得到两个结论: 1)Y<=1时,模型不会被渲染(如果模型得部分区域Y〈=1,则这部分会被裁减,其余部分仍可见) 2)Y>1时,模型会被渲染(跟据我得两台电脑,双显卡应该就是Y〉1。 00000018左右,单显卡Y>1。 00000006,当然这个值意义不大) 3)Y=1.0000001时,正方形出现惊人得效果,一半可见,一半不可见(这大概就是因为双显卡交火得问题,我在笔记本上未发现此现象)。 Y=1,这个参数叫做镜头得近距(neardistance),PANDA默认比这个距离更贴近镜头得物体区域就是不可见得、 5。 2 视场 在上面那个实验中,Y在2、8左右时,2*2得正方形差不多撑满窗口屏幕宽度(默认窗口模式(4: 3),非全屏)。 按照三角公式 Tan(α/2)=1/2。 8 计算出α大约为39.3度。 这个角度叫做镜头得视场(fieldofview)、PANDA3D官方给得数据就是默认为40度、大致就是全画幅得60mm镜头。 当然,如果显示比例为16: 9,或者16: 10,视场也扩大 问题: 在非常规窗口比例中,视场为多少? 我们可以将Y=3、8,然后用鼠标对窗口进行变形。 4: 3 近似16: 9 1: 2 可以瞧出PANDA将宽与高得视场限制为不小于约30度。 也就就是默认得宽视场。 就上面得例子而言,得到得效果就就是,无论您如何变换窗口,都无法遮住正方形,而且正方形也不会产生形变。 5、3镜头得位置 这个就是我们最常用得镜头参数。 现在我们来显式得控制我们得镜头。 回到我们得立方体得例子 在TEST。 PY里,我们首先禁止鼠标控制镜头 # -*-coding: cp936—*- importdirect.directbase。 DirectStart# 建立舞台 base、disableMouse()#禁止鼠标控制镜头 box= loader.loadModel("models/cube")#导入模型 box。 reparentTo(render) #将模型加入渲染列表 box、setPos(0,20,0)#设置BOX得原点位置 run()#演出开始了! 现在,镜头不能动了。 目得就是为了减少控制冲突,两个鼠标一起动得感觉您懂得、 这下瞧不到立方体得上面了,咋办呢。 把镜头挪挪吧、 #—*-coding: cp936-*- importdirect、directbase。 DirectStart #建立舞台 base、disableMouse()#禁止鼠标控制镜头 box=loader.loadModel("models/cube")#导入模型 box。 reparentTo(render) #将模型加入渲染列表 box.setPos(0,20,0)#设置BOX得原点位置 camera。 setPos(0,0,3)#设置镜头得位置 run()#演出开始了! 六、任务 下面 现在我们要设计一段代码,让我们得镜头动起来。 基本思路就是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- panda3d 入门