Panda3D 实时检测摄像机与 GLB 模型碰撞
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/okAm 著作权归作者所有。请勿转载和采集!