您的位置:首页 > 其它

panda3d 解读Roaming Ralph程序

2012-08-05 11:34 169 查看
这里就不贴代码了,笔者根据自己阅读代码的过程流水账式的解读,主要便于自己之后的阅读,也希望给其他读者带来帮助。

首先解读这段代码:

import direct.directbase.DirectStart

这是 from direct.showbase.ShowBase import ShowBase的简写,由panda3d的manual可以查到,而ShowBase是panda3d运行和渲染的基础类,这里不做过多解释了。

接下来解释引入下面这个模块的用途

from direct.showbase.DirectObject import DirectObject

DirectObject是控制运行和消息响应的基础类,如果想在您的程序中添加消息响应,需要在你的类中继承DirectObject类。其他的类引入碰撞体和导入动画模型和光照这里就不做解释了给出DirectObject的类关系图



下面我们来看这个程序的逻辑。

首先找到标记点start point这是ralph的出生点,笔者没有找到关于导入start-point方法的介绍文章,单用这条指令:

pz to egg: punzip -o world.egg world.egg.pz

执行后,翻看world.egg文件发现start point写为如下方式:

<Group> start_point {

<DCS> { net }

<Transform> {

<Matrix4> {

1 0 0 0

0 1 0 0

0 0 1 0

-107.575 -0.490075 -26.6066 1

}

<Translate> { 0 0 0 }

}

}

于是弱弱的将这种写法拷贝到自己的egg文件中也读到了标记点。我准备先放放这里。

鼠标和键盘响应这一部分就不解释了,很好懂。

这里笔者想简单讲一下碰撞体添加的过程:

self.cTrav = CollisionTraverser()

self.ralphGroundRay = CollisionRay()

self.ralphGroundRay.setOrigin(0,0,1000)

self.ralphGroundRay.setDirection(0,0,-1)

self.ralphGroundCol = CollisionNode('ralphRay')

self.ralphGroundCol.addSolid(self.ralphGroundRay)

self.ralphGroundCol.setFromCollideMask(BitMask32.bit(0))

self.ralphGroundCol.setIntoCollideMask(BitMask32.allOff())

self.ralphGroundColNp = self.ralph.attachNewNode(self.ralphGroundCol)

self.ralphGroundHandler = CollisionHandlerQueue()

self.cTrav.addCollider(self.ralphGroundColNp, self.ralphGroundHandler)

首先建立CollisionTraverser来处理碰撞事件,然后建立碰撞体并绑定在ralph的身上:self.ralph.attachNewNode(self.ralphGroundCol)。建立碰撞体分为两步:1、确立碰撞类型self.ralphGroundRay=CollisionRay()和建立碰撞节点并将碰撞类型绑定在碰撞节点上:self.ralphGroundCol=CollisionNode('ralphRay'),self.ralphGroundCol.addSolid(self.ralphGroundRay)。最后建立碰撞处理方式并将碰撞体和碰撞处理句柄绑定在一起:

self.ralphGroundHandler = CollisionHandlerQueue()

self.cTrav.addCollider(self.ralphGroundColNp, self.ralphGroundHandler)

对于碰撞的处理方式,笔者有些不想写了,这个程序是利用task,处理每一帧的碰撞检测。其中涉及到CollisionEntry这个数据结构为碰撞发生时,存入collisionhandle句柄的数据结构如下图。



需要深入了解这个数据结构的朋友还需访问http://www.panda3d.org/manual/index.php/Collision_Entries
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: