DKL9 GitList
Repositories
DKL9 home
voxels
Code
Commits
Branches
Tags
Search
Tree:
a93b274
Branches
Tags
master
voxels
src
camera.py
Move source to src/
dkl9
commited
a93b274
at 2025-183 13:45:25
camera.py
Blame
History
Raw
from libs import * class Camera: def __init__(self, **kwargs): self.pos = vec([0, 0, 0]) self.theta = 0 self.phi = 0 self.fovy = kwargs.get("fovy", 90) self.viewport = (640, 480) def looking(self): return vec([ np.cos(self.phi) * np.sin(self.theta), np.sin(self.phi), np.cos(self.phi) * np.cos(self.theta) ]) def up(self): return vec([0, 1, 0]) def aspect(self): return self.viewport[0] / self.viewport[1] def view_mat(self): ct, st = np.cos(self.theta), np.sin(self.theta) cp, sp = np.cos(self.phi), np.sin(self.phi) f = vec([cp * st, sp, cp * ct]) s = vec([-ct, 0, st]) u = vec([-sp * st, cp, -sp * ct]) m = np.identity(4, dtype=FLOAT) m[:3, :3] = [s, u, -f] p = self.pos m[:3, 3] = [-s @ p, -u @ p, f @ p] return m def persp_mat(self): near = 0.1 far = 100 f = 1.0 / np.tan(np.radians(self.fovy) / 2) depth = near - far return vec([ [f / self.aspect(), 0, 0, 0], [0, f, 0, 0], [0, 0, (near + far) / depth, (2 * near * far) / depth], [0, 0, -1, 0] ]) def mvp(self, ent): am = np.identity(4, dtype=FLOAT) vp = np.identity(4, dtype=FLOAT) if ent.hud: am[0, 0] = 1 / self.aspect() else: vp = self.persp_mat() @ self.view_mat() return vp @ ent.translate() @ am @ ent.orient def draw(self, ent): if not ent.verts.shape[0]: return if not ent.vao: ent.build_vao() glUniformMatrix4fv(UNIFORMS["MVP"][2], 1, GL_TRUE, self.mvp(ent)) glUniform3fv(UNIFORMS["camPos"][2], 1, self.pos) glBindVertexArray(ent.vao) glDrawArrays(ent.draw_mode, 0, len(ent.verts)) def target(self, scene): l = self.looking() d, c, n = None, None, None for ent in scene: r, i = ent.raycast(self.pos, l) if r and (d is None or r < d): d, c, n = r, ent, i return c, n