import pyglet import ratcave as rc import numpy as np from numpy.random import random import itertools def lerp(vecA, vecB, time): ''' Linear interpolation between two vectors. Function from pyGameMath: https://github.com/explosiveduck/pyGameMath ''' return (vecA * time) + (vecB * (1.0 - time)) win = pyglet.window.Window() reader = rc.WavefrontReader(rc.resources.obj_primitives) mesh = reader.get_mesh('MonkeySmooth', position=(0, 0, -2), scale=.2) scene = rc.Scene(meshes=[mesh], bgColor=(0.5, 0, 0), camera=rc.Camera(projection=rc.OrthoProjection())) fps_label = pyglet.window.FPSDisplay(window=win) @win.event def on_draw(): with rc.default_shader: scene.draw() fps_label.draw() def animation_sequence(mesh, nframes=50): verts_orig = mesh.arrays[0][:, :3].copy() verts_normed = (verts_orig.T / np.linalg.norm(verts_orig, axis=1)).T norms_orig = mesh.arrays[1][:, :3].copy() norms_normed = verts_normed for t in itertools.cycle(itertools.chain(np.linspace(0, 1, nframes), np.ones(nframes), np.linspace(0, 1, nframes)[::-1], np.zeros(nframes))): vv = lerp(verts_orig, verts_normed, t) nn = lerp(norms_orig, norms_normed, t) mesh.arrays[0][:, :3] = vv mesh.arrays[1][:, :3] = nn yield anim = animation_sequence(mesh) def update(dt): mesh.rotation.y += 120 * dt next(anim) pyglet.clock.schedule(update) pyglet.app.run()