def render(self, time: float, frametime: float): self.ctx.enable(moderngl.DEPTH_TEST | moderngl.CULL_FACE) self.ctx.clear(1.0, 1.0, 0.5, 1.0) self.rotation.value = tuple( Matrix33.from_eulers((time/2, time/2, time/2)).reshape(9).tolist()) self.prog['time'].value = time self.texture.use(location=0) self.cube.render(self.prog)
def test_euler_equivalence(self): eulers = euler.create_from_x_rotation(np.pi / 2.) m = Matrix33.from_x_rotation(np.pi / 2.) q = Quaternion.from_x_rotation(np.pi / 2.) qm = Matrix33.from_quaternion(q) em = Matrix33.from_eulers(eulers) self.assertTrue(np.allclose(qm, m)) self.assertTrue(np.allclose(qm, em)) self.assertTrue(np.allclose(m, em))
import os from dataclasses import dataclass, field from itertools import combinations from typing import Any, TextIO import numpy as np from parse import parse from pyrr import Matrix33, Vector3 class ScannerMatched(Exception): pass ROTATIONS = [ Matrix33.from_eulers((0, 0, 0), dtype=np.int_), Matrix33.from_eulers((np.pi / 2, 0, 0), dtype=np.int_), Matrix33.from_eulers((np.pi, 0, 0), dtype=np.int_), Matrix33.from_eulers((3 * np.pi / 2, 0, 0), dtype=np.int_), Matrix33.from_eulers((0, 0, np.pi / 2), dtype=np.int_), Matrix33.from_eulers((np.pi / 2, 0, np.pi / 2), dtype=np.int_), Matrix33.from_eulers((np.pi, 0, np.pi / 2), dtype=np.int_), Matrix33.from_eulers((3 * np.pi / 2, 0, np.pi / 2), dtype=np.int_), Matrix33.from_eulers((0, 0, np.pi), dtype=np.int_), Matrix33.from_eulers((np.pi / 2, 0, np.pi), dtype=np.int_), Matrix33.from_eulers((np.pi, 0, np.pi), dtype=np.int_), Matrix33.from_eulers((3 * np.pi / 2, 0, np.pi), dtype=np.int_), Matrix33.from_eulers((0, 0, 3 * np.pi / 2), dtype=np.int_), Matrix33.from_eulers((np.pi / 2, 0, 3 * np.pi / 2), dtype=np.int_), Matrix33.from_eulers((np.pi, 0, 3 * np.pi / 2), dtype=np.int_), Matrix33.from_eulers((3 * np.pi / 2, 0, 3 * np.pi / 2), dtype=np.int_),