Browse Source

samples: Add new motion trails sample

Co-authored-by: Entikan <[email protected]>
rdb 3 years ago
parent
commit
81ea202dea

+ 81 - 0
samples/motion-trails/fireball.py

@@ -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()

+ 0 - 0
samples/motion-trails/main.py → samples/motion-trails/framebuffer-feedback.py


BIN
samples/motion-trails/models/plasma.png