def to_look_at_direction(self, direction, up): ''' Set this matrix to a *look at* matrix with a `direction` and a `up` vector. *Parameters:* - `direction`: Direction `Vector3` - `up`: Up `Vector3` ''' vec_z = Vector3(direction).nor() vec_x = Vector3(direction).nor() vec_x.crs(up.nor()).nor() vec_y = Vector3(vec_x).crs(vec_z).nor() self.to_identity() self.values[0] = vec_x.x self.values[4] = vec_x.y self.values[8] = vec_x.z self.values[1] = vec_y.x self.values[5] = vec_y.y self.values[9] = vec_y.z self.values[2] = -vec_z.x self.values[6] = -vec_z.y self.values[10] = -vec_z.z return self
def __init__(self): self.position = Vector3() self.direction = Vector3() self.up = Vector3() self.projection = Matrix4() self.view = Matrix4() self.combined = Matrix4() self.inv_projection_view = Matrix4() self.near = 1 self.far = 100 self.viewport_width = 0 self.viewport_height = 0
def update(self): aspect = self.viewport_width / self.viewport_height self.projection.to_projection(abs(self.near), abs(self.far), self.fov, aspect) self.view.to_look_at(Vector3().set(self.position).add(self.direction), self.up) self.combined.set(self.projection).mul(self.view)
def test_iter(): vector = Vector3(1, 2, 3) for t in zip(vector, [1, 2, 3]): assert t[0] == t[1] vector = Vector2(1, 2) for t in zip(vector, [1, 2]): assert t[0] == t[1]
def update(self, update_frustum=True): self.projection.to_orthographic( self.zoom * -self.viewport_width / 2, self.zoom * self.viewport_width / 2, self.zoom * -self.viewport_height / 2, self.zoom * self.viewport_height / 2, self.near, self.far ) target = Vector3(self.position).add(self.direction) self.view.to_look_at(self.position, target, self.up) self.combined.set(self.projection).mul(self.view) self.inv_projection_view.set(self.combined).inv()
def to_look_at(self, position, target, up): ''' Set this matrix to a *look at* matrix with a `position`, `target` and `up` vector. *Parameters:* - `position`: Position `Vector3` - `direction`: Direction `Vector3` - `up`: Up `Vector3` ''' # http://www.cs.virginia.edu/~gfx/Courses/1999/intro.fall99.html/lookat.html vec = Vector3(target).sub(position) self.to_look_at_direction(vec, up) translation = TransformationMatrix().to_translation( -position.x, -position.y, -position.z) self.mul(translation) return self
def __init__(self, fov, viewport_width, viewport_height): super().__init__() self.fov = fov self.viewport_width = viewport_width self.viewport_height = viewport_height self.tmp = Vector3()
def test_equals(): assert Vector3(1, 2, 3) == Vector3(1, 2, 3) assert Vector2(4, 5) == Vector2(4, 5)
def test_init(): assert len(Vector2(0, 0)) == 2 assert len(Vector3(0, 0, 0)) == 3
def test_operations_vector3(): # Add assert Vector3(1, 2, 3) + 2 == Vector3(3, 4, 5) assert Vector3(1, 2, 3) + (3, 2, 1) == Vector3(4, 4, 4) assert Vector3(1, 2, 3) + Vector3(3, 2, 1) == Vector3(4, 4, 4) # Sub assert Vector3(1, 2, 3) - 2 == Vector3(-1, 0, 1) assert Vector3(1, 2, 3) - (3, 2, 1) == Vector3(-2, 0, 2) assert Vector3(1, 2, 3) - Vector3(3, 2, 1) == Vector3(-2, 0, 2) # Mul assert Vector3(1, 2, 3) * 2 == Vector3(2, 4, 6) assert Vector3(1, 2, 3) * (3, 2, 1) == Vector3(3, 4, 3) assert Vector3(1, 2, 3) * Vector3(3, 2, 1) == Vector3(3, 4, 3) # Div assert Vector3(0, 2, 4) / 2 == Vector3(0, 1, 2) assert Vector3(0, 2, 4) / (3, 2, 1) == Vector3(0, 1, 4) assert Vector3(0, 2, 4) / Vector3(3, 2, 1) == Vector3(0, 1, 4)