import sys
from direct.showbase.ShowBase import ShowBase
from direct.actor.Actor import Actor
from panda3d.core import CollisionTraverser, CollisionHandlerPusher
from panda3d.core import CollisionNode, CollisionSphere, BitMask32

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

        # Load the environment model
        self.scene = self.loader.loadModel('models/environment')
        self.scene.reparentTo(self.render)

        # Load the panda model
        self.pandaActor = Actor('models/panda-model', {'walk': 'models/panda-walk4'})
        self.pandaActor.reparentTo(self.render)
        self.pandaActor.setScale(0.005, 0.005, 0.005)
        self.pandaActor.setPos(0, 0, 0)
        self.pandaActor.loop('walk')

        # Create a collision sphere for the panda
        self.pandaCollider = CollisionSphere(0, 0, 0, 1)
        self.pandaColliderNode = CollisionNode('pandaCollider')
        self.pandaColliderNode.addSolid(self.pandaCollider)
        self.pandaColliderNode.setFromCollideMask(BitMask32.bit(0))
        self.pandaColliderNode.setIntoCollideMask(BitMask32.allOff())
        self.pandaColliderNp = self.pandaActor.attachNewNode(self.pandaColliderNode)
        self.pandaColliderNp.show()

        # Create a collision sphere for the glb model
        self.glbCollider = CollisionSphere(0, 0, 0, 1)
        self.glbColliderNode = CollisionNode('glbCollider')
        self.glbColliderNode.addSolid(self.glbCollider)
        self.glbColliderNode.setFromCollideMask(BitMask32.bit(1))
        self.glbColliderNode.setIntoCollideMask(BitMask32.allOff())
        self.glbColliderNp = self.loader.loadModel('1.glb')
        self.glbColliderNp.reparentTo(self.render)
        self.glbColliderNp.setScale(0.005, 0.005, 0.005)
        self.glbColliderNp.setPos(-10, 0, 0)
        self.glbColliderNp.setTag('type', 'glb')
        self.glbColliderNp.setTag('id', '1')
        self.glbColliderNp.setTag('name', 'glb1')
        self.glbColliderNp.setTag('description', 'This is a glb model.')
        self.glbColliderNp.setTag('author', 'John Doe')
        self.glbColliderNp.setTag('license', 'MIT License')
        self.glbColliderNp.setTag('date', '2022-01-01')
        self.glbColliderNp.setTag('version', '1.0')
        self.glbColliderNp.setTag('url', 'https://example.com/1.glb')
        self.glbColliderNp.setTag('thumbnail', 'https://example.com/1.png')
        self.glbColliderNp.show()
        
        # Set up the collision traverser and handler
        self.cTrav = CollisionTraverser()
        self.pusher = CollisionHandlerPusher()
        self.pusher.addCollider(self.pandaColliderNp, self.pandaActor)
        self.cTrav.addCollider(self.pandaColliderNp, self.pusher)
        self.cTrav.addCollider(self.glbColliderNp, self.pusher)

        # Set up the camera
        self.disableMouse()
        self.camera.setPos(-20, 0, 10)
        self.camera.lookAt(self.pandaActor)

        # Set up the task to move the panda
        self.taskMgr.add(self.movePanda, 'movePanda')

    def movePanda(self, task):
        dt = globalClock.getDt()

        # Move the panda
        self.pandaActor.setPos(self.pandaActor.getPos() + dt * 5 * self.pandaActor.getNetTransform().getMat().getRow3(1))

        # Check for collisions
        self.cTrav.traverse(self.render)

        # Check if the camera collides with the glb model
        for i in range(self.pusher.getNumEntries()):
            entry = self.pusher.getEntry(i)
            if entry.getFromNodePath().getTag('type') == 'glb':
                print('Camera collided with glb model:', entry.getFromNodePath().getTag('name'))
                self.camera.setPos(-20, 0, 10)
                self.camera.lookAt(self.pandaActor)

        return task.cont

app = MyApp()
app.run()

在这个例子中,我们创建了一个带有碰撞检测的场景,包括一个移动的熊猫和一个静态的 GLB 模型。我们使用 Panda3D 的碰撞检测器来检测熊猫和 GLB 模型之间的碰撞,并在发生碰撞时,将相机位置重置并重新定位到熊猫。在这个例子中,我们还使用了标签来为 GLB 模型添加一些元数据,例如名称、描述、作者、许可证等。

Panda3D 实时检测摄像机与 GLB 模型碰撞

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

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