panda3d实时检测摄像机与‘1glb’碰撞完整代码
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模型添加一些元数据,例如名称、描述、作者、许可证等
原文地址: https://www.cveoy.top/t/topic/fEDy 著作权归作者所有。请勿转载和采集!