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])