Panda3D基础实例
创建一个简单的Panda3D场景,加载一个模型并显示:
from direct.showbase.ShowBase import ShowBaseclass MyApp(ShowBase):def __init__(self):ShowBase.__init__(self)self.scene = self.loader.loadModel("models/environment")self.scene.reparentTo(self.render)self.scene.setScale(0.25, 0.25, 0.25)self.scene.setPos(-8, 42, 0)app = MyApp()
app.run()
键盘控制实例
实现键盘控制模型移动:
from direct.showbase.ShowBase import ShowBase
from direct.actor.Actor import Actorclass MyApp(ShowBase):def __init__(self):ShowBase.__init__(self)self.panda = Actor("models/panda-model", {"walk": "models/panda-walk"})self.panda.reparentTo(self.render)self.panda.loop("walk")self.accept("arrow_left", self.turnLeft)self.accept("arrow_right", self.turnRight)self.accept("arrow_up", self.moveForward)self.accept("arrow_down", self.moveBackward)def turnLeft(self):self.panda.setH(self.panda.getH() + 5)def turnRight(self):self.panda.setH(self.panda.getH() - 5)def moveForward(self):self.panda.setY(self.panda, -0.5)def moveBackward(self):self.panda.setY(self.panda, 0.5)app = MyApp()
app.run()
碰撞检测实例
实现简单的碰撞检测系统:
from direct.showbase.ShowBase import ShowBase
from panda3d.core import CollisionTraverser, CollisionNode
from panda3d.core import CollisionHandlerQueue, CollisionRayclass MyApp(ShowBase):def __init__(self):ShowBase.__init__(self)self.cTrav = CollisionTraverser()self.picker = CollisionRay()pickerNode = CollisionNode('mouseRay')pickerNode.addSolid(self.picker)self.pickerNP = self.camera.attachNewNode(pickerNode)self.pickerQueue = CollisionHandlerQueue()self.cTrav.addCollider(self.pickerNP, self.pickerQueue)self.accept("mouse1", self.handleClick)def handleClick(self):if self.pickerQueue.getNumEntries() > 0:self.pickerQueue.sortEntries()pickedObj = self.pickerQueue.getEntry(0).getIntoNodePath()print("Clicked on:", pickedObj.getName())app = MyApp()
app.run()
光照效果实例
添加多种光源到场景中:
from direct.showbase.ShowBase import ShowBase
from panda3d.core import AmbientLight, DirectionalLight, PointLightclass MyApp(ShowBase):def __init__(self):ShowBase.__init__(self)self.scene = self.loader.loadModel("models/environment")self.scene.reparentTo(self.render)# 环境光ambientLight = AmbientLight("ambientLight")ambientLight.setColor((0.2, 0.2, 0.2, 1))self.render.setLight(self.render.attachNewNode(ambientLight))# 方向光directionalLight = DirectionalLight("directionalLight")directionalLight.setColor((0.8, 0.8, 0.5, 1))directionalLight.setShadowCaster(True, 512, 512)dlnp = self.render.attachNewNode(directionalLight)dlnp.setHpr(45, -45, 0)self.render.setLight(dlnp)# 点光源pointLight = PointLight("pointLight")pointLight.setColor((1, 0.5, 0.5, 1))plnp = self.render.attachNewNode(pointLight)plnp.setPos(10, 10, 10)self.render.setLight(plnp)app = MyApp()
app.run()
粒子系统实例
创建简单的粒子效果:
from direct.showbase.ShowBase import ShowBase
from panda3d.core import ParticlePool, ParticleSystem
from panda3d.core import PointParticles, SpriteParticleRenderer
from panda3d.core import BaseParticleEmitter, RingEmitterclass MyApp(ShowBase):def __init__(self):ShowBase.__init__(self)self.particles = ParticleSystem()self.particles.setPoolSize(100)renderer = SpriteParticleRenderer("particle.png")self.particles.addRenderer(renderer)emitter = RingEmitter()emitter.setAngle(10)emitter.setRadius(1)emitter.setEmissionRate(20)emitter.setLitterSize(5)self.particles.addEmitter(emitter)self.particles.reparentTo(self.render)self.particles.setPos(0, 10, 0)self.particles.enable()app = MyApp()
app.run()
物理引擎实例
使用Bullet物理引擎创建物理场景:
from direct.showbase.ShowBase import ShowBase
from panda3d.bullet import BulletWorld, BulletPlaneShape
from panda3d.bullet import BulletBoxShape, BulletRigidBodyNode
from panda3d.core import Vec3class MyApp(ShowBase):def __init__(self):ShowBase.__init__(self)self.world = BulletWorld()self.world.setGravity(Vec3(0, 0, -9.81))# 创建地面shape = BulletPlaneShape(Vec3(0, 0, 1), 0)node = BulletRigidBodyNode('Ground')node.addShape(shape)np = self.render.attachNewNode(node)np.setPos(0, 0, 0)self.world.attachRigidBody(node)# 创建盒子shape = BulletBoxShape(Vec3(0.5, 0.5, 0.5))node = BulletRigidBodyNode('Box')node.addShape(shape)node.setMass(1.0)np = self.render.attachNewNode(node)np.setPos(0, 0, 10)self.world.attachRigidBody(node)self.taskMgr.add(self.updatePhysics, 'updatePhysics')def updatePhysics(self, task):dt = globalClock.getDt()self.world.doPhysics(dt)return task.contapp = MyApp()
app.run()
GUI界面实例
创建简单的GUI界面:
from direct.showbase.ShowBase import ShowBase
from direct.gui.DirectGui import DirectButton, DirectLabelclass MyApp(ShowBase):def __init__(self):ShowBase.__init__(self)self.label = DirectLabel(text="Panda3D GUI Demo", scale=0.1,pos=(0, 0, 0.8))self.button = DirectButton(text="Click Me",scale=0.1,pos=(0, 0, 0),command=self.buttonPressed)def buttonPressed(self):self.label["text"] = "Button was clicked!"app = MyApp()
app.run()
动画混合实例
混合多个动画序列:
from direct.showbase.ShowBase import ShowBase
from direct.actor.Actor import Actorclass MyApp(ShowBase):def __init__(self):ShowBase.__init__(self)self.panda = Actor("models/panda-model", {"walk": "models/panda-walk","dance": "models/panda-dance"})self.panda.reparentTo(self.render)self.panda.setPos(0, 0, 0)# 混合动画self.panda.enableBlend()self.panda.setBlend(frameBlend=True)self.panda.setControlEffect("walk", 0.5)self.panda.setControlEffect("dance", 0.5)self.panda.loop("walk")self.panda.loop("dance")self.accept("w", self.setWalkWeight, [1.0])self.accept("d", self.setDanceWeight, [1.0])self.accept("s", self.setBothWeight, [0.5])