Panda3D 碰撞检测:使用 CollisionSphere 检测碰撞

本教程演示了如何在 Panda3D 中使用 CollisionSphere 类检测两个物体之间的碰撞。我们将创建一个简单的场景,其中有两个立方体,并使用 CollisionSphere 来检测它们之间的碰撞。

代码:

from direct.showbase.ShowBase import ShowBase
from panda3d.core import CollisionTraverser, CollisionNode, CollisionHandlerQueue, CollisionRay, CollisionSphere

class MyApp(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)

        # 创建碰撞检测器
        self.cTrav = CollisionTraverser()
        self.cHandler = CollisionHandlerQueue()

        # 创建物体1的碰撞节点
        self.obj1 = self.loader.loadModel('models/box')
        self.obj1.reparentTo(self.render)
        obj1Collide = CollisionNode('obj1')
        obj1Collide.addSolid(CollisionSphere(0, 0, 0, 1))
        obj1Collide.setCollideMask(BitMask32.bit(0))
        self.obj1.attachNewNode(obj1Collide)
        self.cTrav.addCollider(obj1Collide, self.cHandler)

        # 创建物体2的碰撞节点
        self.obj2 = self.loader.loadModel('models/box')
        self.obj2.reparentTo(self.render)
        obj2Collide = CollisionNode('obj2')
        obj2Collide.addSolid(CollisionSphere(0, 0, 0, 1))
        obj2Collide.setCollideMask(BitMask32.bit(0))
        self.obj2.attachNewNode(obj2Collide)
        self.cTrav.addCollider(obj2Collide, self.cHandler)

        # 创建一个碰撞光线,用于检测物体1和物体2之间的碰撞
        self.cRay = CollisionRay(0, 0, 0, 0, 1, 0)
        self.cRayNode = CollisionNode('cRay')
        self.cRayNode.addSolid(self.cRay)
        self.cRayNode.setCollideMask(BitMask32.allOff())
        self.cRayNP = self.camera.attachNewNode(self.cRayNode)
        self.cTrav.addCollider(self.cRayNP, self.cHandler)

        # 设置碰撞检测回调函数
        self.accept('collision', self.onCollision)

    def onCollision(self, entry):
        # 物体1和物体2碰撞了
        print('Collision detected!')

    def update(self, task):
        # 更新碰撞光线的位置
        self.cRay.setOrigin(self.camera.getPos())
        self.cRay.setDirection(self.camera.getMat().getRow3(1))

        # 执行碰撞检测
        self.cTrav.traverse(self.render)

        return task.cont

app = MyApp()
app.run()

解释:

  1. 导入必要的类:

    • CollisionSphere 类用于创建球形碰撞体。
  2. 创建碰撞节点:

    • 为每个物体创建一个 CollisionNode,并使用 addSolid() 方法添加 CollisionSphere 作为碰撞体。
    • 设置 setCollideMask() 以指定碰撞节点的碰撞掩码。
  3. 创建碰撞光线:

    • 创建一个 CollisionRay,并将其附加到相机上,用于检测碰撞。
    • 设置 setCollideMask() 以指定碰撞光线的碰撞掩码。
  4. 设置碰撞检测回调函数:

    • 使用 accept() 方法注册一个回调函数,当发生碰撞时调用。
  5. 执行碰撞检测:

    • 使用 cTrav.traverse() 方法执行碰撞检测。
  6. 更新碰撞光线的位置:

    • 在每个帧中更新碰撞光线的位置,使其始终指向相机的方向。

注意:

  • 确保你的场景中包含了 models/box 文件。
  • 你可以修改 CollisionSphere 的半径来改变碰撞体的尺寸。
  • 你可以添加更多碰撞节点来检测场景中的其他物体之间的碰撞。

本教程仅介绍了使用 CollisionSphere 进行碰撞检测的基本方法。Panda3D 还提供了其他碰撞体类型,例如 CollisionBoxCollisionPolygon,你可以根据需要选择使用。


原文地址: https://www.cveoy.top/t/topic/okAK 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录