Differences between revisions 3 and 11 (spanning 8 versions)
Revision 3 as of 2007-08-17 06:43:58
Size: 646
Editor: flyaflya
Comment:
Revision 11 as of 2007-08-23 09:58:34
Size: 2909
Editor: flyaflya
Comment:
Deletions are marked like this. Additions are marked like this.
Line 3: Line 3:
 树型结构

Render -> NodePath -> PandaNode(Geom) [GeomVertexData, GeomPrimitive]

GeomVertexData 保存顶点数据, GeomPrimitive 保存顶点的index
  树型结构
 * Render -> NodePath -> PandaNode(Geom)[GeomVertexData, GeomPrimitive]
 * GeomVertexData 保存顶点数据, GeomPrimitive 保存顶点的index
Line 10: Line 8:
 render(3d) X右,Y前,Z上  * render(3d) X右,Y前,Z上
 * render2d 坐标左下角(-1,0,-1)到右上角(1,0,1)
Line 12: Line 11:
 render2d 坐标左下角(-1,0,-1)到右上角(1,0,1)
 
Line 15: Line 12:
 NodePath.setPos(X,Y,Z) #位移  * 位移 NodePath.setPos(X,Y,Z) #位移
 * 旋转 NodePath.setHpr(H,P,R)
  * 旋转方向
   * Heading: 绕Y轴转
   * Pitch: 绕X轴转
   * Roll: 绕Z轴转
   * 旋转的例子: attachment:hprtest.py 使用simples/tutorial1中的model
 * 缩放 NodePath.setScale(uniform) #
Line 17: Line 21:
 NodePath.setHpr(H,P,R) #旋转 

 NodePath.setScale(uniform) #缩放

 * 旋转方向

 Heading: XZ平面逆时针转 

 Pitch: YZ平面

 Roll: 

 旋转的例子: attachment:hpr.py 使用simples/tutorial1中的model
== 文件格式 ==
=== EGG ===
==== 创建EGG ===
 * EggData()
  * .addChild
 * EggPolygon()
  * .addVertex
  * .recomputePolygonNormal
 * EggVertex()
 * EggVertexPool('')
  * .addVertex
 * .loadEggData()
Line 33: Line 36:

= 地形 =
== 高度图算法 ==
=== Diamond-Square Algorithm ==

= 碰撞 =
== solid ==
 * CollisionSphere 球型
 * CollisionTube 圆柱
 * CollisionInvSphere 反球体
 * CollisionPlane 平面
 * CollisionPolygon 多边型 (昂贵,不准确)
 * CollisionRay 射线
 * CollisionLine 双向射线
 * CollisionSegment 两点间线

== Collision Handlers ==
 * CollisionHandlerQueue 枚举碰撞
{{{
#!python
  queue = CollisionHandlerQueue()
  traverser.addCollider(fromObject, queue)
  traverser.traverse(render)
  for i in range(queue.getNumEntries()):
    entry = queue.getEntry(i)
    print entry
}}}
 * CollisionHandlerEvent 碰撞时产生事件(in again out)
{{{
#!python
class MyObject(DirectObject.DirectObject):
   def __init__(self):
     self.accept('car-into-rail', handleRailCollision) #接受in事件
   def handleRailCollision(self, entry):
     print entry
}}}

 * CollisionHandlerPusher
 * PhysicsCollisionHandler
 * CollisionHandlerFloor

== Collision Entries ==
碰撞发生时产生Entry,记录碰撞信息

== Collision Traversers ==
碰撞检测,付到base.cTrav后,每嵮自动检测
{{{
#!python
traverser = CollisionTraverser('traverser name')
base.cTrav = traverser
traverser.addCollider(fromObject, handler)
}}}
只用加入碰撞物(fromObject),不用被碰撞物,所有加入场景的物体自动成为被碰撞物

== 碰撞掩码(Collision Bitmasks) ==
碰撞物的“碰撞”掩码和被碰撞物的“被碰撞”掩码相与(AND),如果结果不等于0——意味着两个掩码至少有一位相同——那么进行碰撞测试。
 * nodePath.node().setFromCollideMask(BitMask32(0x10)) #设置碰撞掩码,必须在node上设置,不能在nodePath上设
 * nodePath.setCollideMask(BitMask32(0x04), BitMask32(0xff)) #设置被碰撞掩码
 * GeomNode.getDefaultCollideMask() #得到被碰撞掩码


== 基础 ==
 * .setCollideMask
 * .setIntoCollideMask
 * .setFromCollideMask

基础

组成结构

  • 树型结构

坐标

  • render(3d) X右,Y前,Z上
  • render2d 坐标左下角(-1,0,-1)到右上角(1,0,1)

移动、形变

  • 位移 NodePath.setPos(X,Y,Z) #位移

  • 旋转 NodePath.setHpr(H,P,R)

    • 旋转方向
      • Heading: 绕Y轴转
      • Pitch: 绕X轴转
      • Roll: 绕Z轴转
      • 旋转的例子: attachment:hprtest.py 使用simples/tutorial1中的model
  • 缩放 NodePath.setScale(uniform) #

文件格式

EGG

==== 创建EGG ===

镜头

  • base.camera

地形

高度图算法

=== Diamond-Square Algorithm ==

碰撞

== solid ==

Collision Handlers

   1   queue = CollisionHandlerQueue() 
   2   traverser.addCollider(fromObject, queue) 
   3   traverser.traverse(render) 
   4   for i in range(queue.getNumEntries()): 
   5     entry = queue.getEntry(i) 
   6     print entry 

   1 class MyObject(DirectObject.DirectObject):
   2    def __init__(self):
   3      self.accept('car-into-rail', handleRailCollision) #接受in事件
   4    def handleRailCollision(self, entry):
   5      print entry

Collision Entries

碰撞发生时产生Entry,记录碰撞信息

Collision Traversers

碰撞检测,付到base.cTrav后,每嵮自动检测

   1 traverser = CollisionTraverser('traverser name')
   2 base.cTrav = traverser
   3 traverser.addCollider(fromObject, handler)

只用加入碰撞物(fromObject),不用被碰撞物,所有加入场景的物体自动成为被碰撞物

碰撞掩码(Collision Bitmasks)

碰撞物的“碰撞”掩码和被碰撞物的“被碰撞”掩码相与(AND),如果结果不等于0——意味着两个掩码至少有一位相同——那么进行碰撞测试。

  • nodePath.node().setFromCollideMask(BitMask32(0x10)) #设置碰撞掩码,必须在node上设置,不能在nodePath上设

  • nodePath.setCollideMask(BitMask32(0x04), BitMask32(0xff)) #设置被碰撞掩码

  • GeomNode.getDefaultCollideMask() #得到被碰撞掩码

基础

  • .setCollideMask
  • .setIntoCollideMask
  • .setFromCollideMask

FlyaflyaPanda3dNote (last edited 2009-12-25 07:15:27 by localhost)