40 cosine = math.cos(angle)
41 sine = math.sin(angle)
42 return np.array([[cosine, 0.0, sine, 0.0], [0.0, 1.0, 0.0, 0.0], [-sine, 0.0, cosine, 0.0], [0.0, 0.0, 0.0, 1.0]], dtype=np.float32)
45 return np.array([[x, 0.0, 0.0, 0.0], [0.0, y, 0.0, 0.0], [0.0, 0.0, z, 0.0], [0.0, 0.0, 0.0, 1.0]], dtype=np.float32)
48 return np.array([[1.0, 0.0, 0.0, x], [0.0, 1.0, 0.0, y], [0.0, 0.0, 1.0, z], [0.0, 0.0, 0.0, 1.0]], dtype=np.float32)
57def look_at_matrix(eye: tuple[float, float, float], center: tuple[float, float, float], up: tuple[float, float, float]) -> np.ndarray:
58 eye_vector = np.array(eye, dtype=np.float32)
59 center_vector = np.array(center, dtype=np.float32)
60 up_vector = np.array(up, dtype=np.float32)
63 camera_up = np.cross(side, forward)
65 matrix[0, 0] = side[0]
66 matrix[0, 1] = side[1]
67 matrix[0, 2] = side[2]
68 matrix[0, 3] = -float(np.dot(side, eye_vector))
69 matrix[1, 0] = camera_up[0]
70 matrix[1, 1] = camera_up[1]
71 matrix[1, 2] = camera_up[2]
72 matrix[1, 3] = -float(np.dot(camera_up, eye_vector))
73 matrix[2, 0] = -forward[0]
74 matrix[2, 1] = -forward[1]
75 matrix[2, 2] = -forward[2]
76 matrix[2, 3] = float(np.dot(forward, eye_vector))
79def perspective_matrix(fov_radians: float, aspect: float, near_plane: float, far_plane: float) -> np.ndarray:
80 tangent = math.tan(fov_radians * 0.5)
81 matrix = np.zeros((4, 4), dtype=np.float32)
82 matrix[0, 0] = 1.0 / (aspect * tangent)
83 matrix[1, 1] = 1.0 / tangent
84 matrix[2, 2] = far_plane / (near_plane - far_plane)
85 matrix[2, 3] = (far_plane * near_plane) / (near_plane - far_plane)
265 width_text, height_text = value.lower().split(
"x", 1)
266 width = int(width_text)
267 height = int(height_text)
269 except ValueError
as exception:
270 raise argparse.ArgumentTypeError(
"resolution must use WIDTHxHEIGHT, for example 1280x720")
from exception
272 if (width <= 0
or height <= 0):
273 raise argparse.ArgumentTypeError(
"resolution width and height must be greater than zero")
277 parser = argparse.ArgumentParser(description=
"MXVK textured Penguin Python example")
278 parser.add_argument(
"filename", nargs=
"?", default=
"", help=
"optional OBJ or MXMOD model path")
279 parser.add_argument(
"-i",
"--input", dest=
"input_filename", default=
"", help=
"optional OBJ or MXMOD model path")
280 parser.add_argument(
"-p",
"--path", default=str(EXAMPLE_DIR), help=
"resource root containing the data directory")
281 parser.add_argument(
"-r",
"--resolution", type=parse_resolution, default=(1280, 720), metavar=
"WIDTHxHEIGHT", help=
"window resolution (default: 1280x720)")
282 parser.add_argument(
"-f",
"--fullscreen", action=
"store_true", help=
"start fullscreen")
283 parser.add_argument(
"--enable-vsync", action=
"store_true", help=
"enable vertical synchronization")
284 return parser.parse_args()
288 width, height = args.resolution
289 if (args.input_filename):
290 filename = args.input_filename
292 filename = args.filename
295 window =
PenguinWindow(filename, args.path,
"MXVK Python Penguin", width, height, args.fullscreen, args.enable_vsync)
298 except mxvk.MXVKError
as exception:
299 print(f
"mxvk: Exception: {exception}", file=sys.stderr)
302 if (window
is not None):
__init__(self, str filename, str path, str title, int width, int height, bool fullscreen, bool enable_vsync)
np.ndarray look_at_matrix(tuple[float, float, float] eye, tuple[float, float, float] center, tuple[float, float, float] up)