Updated how the vertices and matrices can be accessed. That is via indices ([x][y]) or just by named properties (like x or y).

This commit is contained in:
2020-07-15 10:48:50 -05:00
parent cbdf666509
commit 813c1f531f
3 changed files with 110 additions and 39 deletions
+44 -12
View File
@@ -1,7 +1,30 @@
import math
from vectors import Vector3d, Vector4d
class Matrix4x4:
class Matrix3x3:
def __init__(self, row1, row2, row3):
self.rows = [row1, row2, row3]
@property
def row1(self):
return self.rows[0]
@property
def row2(self):
return self.rows[1]
@property
def row3(self):
return self.rows[2]
def __getitem__(self, key):
return self.rows[key]
def __setitem__(self, key, value):
self.rows[key] = value
class Matrix4x4(Matrix3x3):
def __init__(self, row1, row2, row3, row4):
if not isinstance(row1, Vector4d):
@@ -13,10 +36,11 @@ class Matrix4x4:
if not isinstance(row4, Vector4d):
raise ValueError("Row must be a Vector4d object.", row4)
self.row1 = row1
self.row2 = row2
self.row3 = row3
self.row4 = row4
self.rows = [row1, row2, row3, row4]
@property
def row4(self):
return self.rows[3]
def multiply_3d(self, vector3d):
x = vector3d.x * self.row1.x + vector3d.y * self.row2.x + vector3d.z * self.row3.x + self.row4.x
@@ -31,7 +55,14 @@ class Matrix4x4:
return Vector3d(x, y, z)
def multiply_matrix(self, matrix4x4):
out = Matrix4x4.get_identity_matrix()
for column in range(4):
for row in range(4):
out[row][column] = self.rows[row][0] * matrix4x4.rows[0][column] + self.rows[row][1] * matrix4x4.rows[1][column] + self.rows[row][2] * matrix4x4.rows[2][column] + self.rows[row][3] * matrix4x4.rows[3][column]
return out
def get_projection_matrix(fov_degrees, aspect_ratio, near_plane, far_plane):
fov_rad = 1 / math.tan(fov_degrees * 0.5 / 180.0 * math.pi)
@@ -73,10 +104,11 @@ class Matrix4x4:
row4 = Vector4d(0, 0, 0, 1)
return Matrix4x4(row1, row2, row3, row4)
class Matrix3x3:
def __init__(self, row1, row2, row3):
self.row1 = row1
self.row2 = row2
self.row3 = row3
def get_translation_matrix(vector3d):
row1 = Vector4d(1, 0, 0, 0)
row2 = Vector4d(0, 1, 0, 0)
row3 = Vector4d(0, 0, 1, 0)
row4 = Vector4d(vector3d.x, vector3d.y, vector3d.z, 1)
return Matrix4x4(row1, row2, row3, row4)