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实时检测摄像机与‘1glb’碰撞完整代码

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

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