← circus
Shape Morphing
Smoothly animate from one SVG shape to another
Python Code
from dataclasses import replace
from vood.components.renderer.path import PathRenderer
from vood.components.states.path import PathState
from vood.converter.converter_type import ConverterType
from vood.tat.logger import configure_logging
from vood.velements import VElement
from vood.vscene import VScene
from vood.vscene.vscene_exporter import VSceneExporter
configure_logging(level="INFO")
START_COLOR = "#FDBE02"
END_COLOR = "#AA0000"
START_SHAPE = "M 0,-50 L 14.43,-15.45 L 47.55,-15.45 L 23.56,6.18 L 36.99,40.45 L 0,20 L -36.99,40.45 L -23.56,6.18 L -47.55,-15.45 L -14.43,-15.45 Z"
END_SHAPE = "M 50,0 C 50,27.6 27.6,50 0,50 C -27.6,50 -50,27.6 -50,0 C -50,-27.6 -27.6,-50 0,-50 C 27.6,-50 50,-27.6 50,0 Z"
/Users/dorjeduck/dev/2025/vood/output/20_shape_morphing.mp4
def main():
# Create the scene
scene = VScene(width=256, height=128, background="#000017")
start_state = PathState(
data=START_SHAPE,
fill_color=START_COLOR,
stroke_color=START_COLOR,
stroke_width=4,
)
end_state = replace(
start_state,
data=END_SHAPE,
fill_color=END_COLOR,
stroke_color=END_COLOR,
)
# Create a text renderer for all numbers
renderer = PathRenderer()
element = VElement(
renderer=renderer,
states=[start_state, end_state],
)
# Add all elements to the scene
scene.add_element(element)
# Create the exporter
exporter = VSceneExporter(
scene=scene,
converter=ConverterType.PLAYWRIGHT,
output_dir="output/",
)
# Export to mp4
exporter.to_mp4(
filename="shape_morphing",
total_frames=60,
framerate=30,
width_px=512,
)
if __name__ == "__main__":
main()
Remarks
- Vood uses flubber.js to morph shapes (closed paths). You need to install it as node package in your project root via:
npm install flubber