mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-27 07:03:36 -04:00
samples: Add new motion trails sample
Co-authored-by: Entikan <momojo@rocketship.com>
This commit is contained in:
parent
19186781f3
commit
81ea202dea
81
samples/motion-trails/fireball.py
Executable file
81
samples/motion-trails/fireball.py
Executable file
@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
from random import choice
|
||||
|
||||
from panda3d.core import Point3, Vec4
|
||||
from direct.showbase.ShowBase import ShowBase
|
||||
from direct.motiontrail.MotionTrail import MotionTrail
|
||||
from direct.interval.LerpInterval import LerpPosInterval, LerpHprInterval
|
||||
from direct.interval.LerpInterval import LerpScaleInterval
|
||||
from direct.interval.LerpInterval import LerpTexOffsetInterval
|
||||
from direct.interval.IntervalGlobal import Sequence
|
||||
|
||||
|
||||
base = ShowBase()
|
||||
base.set_background_color(0.1, 0.1, 0.1, 1)
|
||||
|
||||
base.cam.set_pos(0, -128, 32)
|
||||
base.cam.look_at(render)
|
||||
|
||||
flame_colors = (
|
||||
Vec4(1.0, 0.0, 0.0, 1),
|
||||
Vec4(1.0, 0.2, 0.0, 1),
|
||||
Vec4(1.0, 0.7, 0.0, 1),
|
||||
Vec4(0.0, 0.0, 0.2, 1),
|
||||
)
|
||||
|
||||
# A NodePath, rotating in empty space.
|
||||
pivot = render.attach_new_node("pivot")
|
||||
pivot.hprInterval(3, (360, 0, 0)).loop()
|
||||
Sequence( # Bobs up and down
|
||||
LerpPosInterval(pivot, 0.3, (0, 0,-2), (0, 0, 1), blendType="easeInOut"),
|
||||
LerpPosInterval(pivot, 0.5, (0, 0, 1), (0, 0,-2), blendType="easeInOut")
|
||||
).loop()
|
||||
|
||||
# A little chunk of charcoal that rotates along the pivot with an offset.
|
||||
charcoal = loader.load_model("models/smiley").copy_to(pivot)
|
||||
charcoal.set_texture(loader.load_texture("models/plasma.png"), 1)
|
||||
charcoal.set_color(flame_colors[0] * 1.5)
|
||||
charcoal.set_x(-32)
|
||||
|
||||
# It leaves a trail of flames.
|
||||
fire_trail = MotionTrail("fire trail", charcoal)
|
||||
fire_trail.register_motion_trail()
|
||||
fire_trail.geom_node_path.reparent_to(render)
|
||||
fire_trail.set_texture(loader.load_texture("models/plasma.png"))
|
||||
fire_trail.time_window = 3 # Length of trail
|
||||
|
||||
# A circle as the trail's shape, by plotting a NodePath in a circle.
|
||||
center = render.attach_new_node("center")
|
||||
around = center.attach_new_node("around")
|
||||
around.set_z(1)
|
||||
res = 8 # Amount of angles in "circle". Higher is smoother.
|
||||
for i in range(res + 1):
|
||||
center.set_r((360 / res) * i)
|
||||
vertex_pos = around.get_pos(render)
|
||||
fire_trail.add_vertex(vertex_pos)
|
||||
|
||||
start_color = flame_colors[i % len(flame_colors)] * 1.7
|
||||
end_color = Vec4(1, 1, 0, 1)
|
||||
fire_trail.set_vertex_color(i, start_color, end_color)
|
||||
|
||||
'''
|
||||
# A simple flat line, tron lightcycle-style, would be like so:
|
||||
|
||||
fire_trail.add_vertex(Point3(0, 0, 1))
|
||||
fire_trail.add_vertex(Point3(0, 0,-1))
|
||||
fire_trail.set_vertex_color(0, flame_colors[0], flame_colors[0])
|
||||
fire_trail.set_vertex_color(1, flame_colors[1], flame_colors[1])
|
||||
'''
|
||||
|
||||
fire_trail.update_vertices()
|
||||
|
||||
# Adding intervals to the trail to give it swoops and bends.
|
||||
LerpHprInterval(fire_trail, 2, (0, 0, -360)).loop()
|
||||
LerpTexOffsetInterval(fire_trail.geom_node_path, 4, (1, 1), (1, 0)).loop()
|
||||
Sequence( # Grow and shrink
|
||||
LerpScaleInterval(fire_trail, 0.3, 1.4, 0.4, blendType="easeInOut"),
|
||||
LerpScaleInterval(fire_trail, 0.5, 0.4, 1.4, blendType="easeInOut")
|
||||
).loop()
|
||||
|
||||
base.run()
|
BIN
samples/motion-trails/models/plasma.png
Normal file
BIN
samples/motion-trails/models/plasma.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 146 KiB |
Loading…
x
Reference in New Issue
Block a user