panda3d 入门.docx

上传人:b****7 文档编号:23986045 上传时间:2023-05-23 格式:DOCX 页数:24 大小:723.79KB
下载 相关 举报
panda3d 入门.docx_第1页
第1页 / 共24页
panda3d 入门.docx_第2页
第2页 / 共24页
panda3d 入门.docx_第3页
第3页 / 共24页
panda3d 入门.docx_第4页
第4页 / 共24页
panda3d 入门.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

panda3d 入门.docx

《panda3d 入门.docx》由会员分享,可在线阅读,更多相关《panda3d 入门.docx(24页珍藏版)》请在冰豆网上搜索。

panda3d 入门.docx

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〉{

  {Cube} }

}

现在将我们得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〉{

  Cube{

0{

   1.0 1。

0—1、0

}

1{

  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{ Cube}}

 <Polygon>{

<VertexRef>{ 4 765 <Ref>{Cube}}

〈Polygon〉{

{0451〈Ref>{Cube }}

〈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}

  }

 }

 

 { 0 2 31

}

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:

可以瞧出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()#演出开始了!

六、任务

下面

现在我们要设计一段代码,让我们得镜头动起来。

基本思路就是

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 社交礼仪

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1