| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- #!/usr/bin/env python
- # Author: Shao Zhang and Phil Saltzman
- # Last Updated: 2015-03-13
- #
- # This tutorial shows how to take an existing particle effect taken from a
- # .ptf file and run it in a general Panda project.
- from direct.showbase.ShowBase import ShowBase
- from panda3d.core import TextNode
- from panda3d.core import AmbientLight, DirectionalLight
- from panda3d.core import LPoint3, LVector3
- from panda3d.core import Filename
- from panda3d.physics import BaseParticleEmitter, BaseParticleRenderer
- from panda3d.physics import PointParticleFactory, SpriteParticleRenderer
- from panda3d.physics import LinearNoiseForce, DiscEmitter
- from direct.particles.Particles import Particles
- from direct.particles.ParticleEffect import ParticleEffect
- from direct.particles.ForceGroup import ForceGroup
- from direct.gui.OnscreenText import OnscreenText
- import sys
- HELP_TEXT = """
- 1: Load Steam
- 2: Load Dust
- 3: Load Fountain
- 4: Load Smoke
- 5: Load Smokering
- 6: Load Fireish
- ESC: Quit
- """
- class ParticleDemo(ShowBase):
- def __init__(self):
- ShowBase.__init__(self)
- # Standard title and instruction text
- self.title = OnscreenText(
- text="Panda3D: Tutorial - Particles",
- parent=base.a2dBottomCenter,
- style=1, fg=(1, 1, 1, 1), pos=(0, 0.1), scale=.08)
- self.escapeEvent = OnscreenText(
- text=HELP_TEXT, parent=base.a2dTopLeft,
- style=1, fg=(1, 1, 1, 1), pos=(0.06, -0.06),
- align=TextNode.ALeft, scale=.05)
- # More standard initialization
- self.accept('escape', sys.exit)
- self.accept('1', self.loadParticleConfig, ['steam.ptf'])
- self.accept('2', self.loadParticleConfig, ['dust.ptf'])
- self.accept('3', self.loadParticleConfig, ['fountain.ptf'])
- self.accept('4', self.loadParticleConfig, ['smoke.ptf'])
- self.accept('5', self.loadParticleConfig, ['smokering.ptf'])
- self.accept('6', self.loadParticleConfig, ['fireish.ptf'])
- self.accept('escape', sys.exit)
- base.disableMouse()
- base.camera.setPos(0, -20, 2)
- base.camLens.setFov(25)
- base.setBackgroundColor(0, 0, 0)
- # This command is required for Panda to render particles
- base.enableParticles()
- self.t = loader.loadModel("teapot")
- self.t.setPos(0, 10, 0)
- self.t.reparentTo(render)
- self.setupLights()
- self.p = ParticleEffect()
- self.loadParticleConfig('steam.ptf')
- def loadParticleConfig(self, filename):
- # Start of the code from steam.ptf
- self.p.cleanup()
- self.p = ParticleEffect()
- self.p.loadConfig(Filename(filename))
- # Sets particles to birth relative to the teapot, but to render at
- # toplevel
- self.p.start(self.t)
- self.p.setPos(3.000, 0.000, 2.250)
- # Setup lighting
- def setupLights(self):
- ambientLight = AmbientLight("ambientLight")
- ambientLight.setColor((.4, .4, .35, 1))
- directionalLight = DirectionalLight("directionalLight")
- directionalLight.setDirection(LVector3(0, 8, -2.5))
- directionalLight.setColor((0.9, 0.8, 0.9, 1))
- # Set lighting on teapot so steam doesn't get affected
- self.t.setLight(self.t.attachNewNode(directionalLight))
- self.t.setLight(self.t.attachNewNode(ambientLight))
- demo = ParticleDemo()
- demo.run()
|