48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
import vectors
|
|
|
|
class Matrix4x4:
|
|
def __init__(self):
|
|
self.row0 = None
|
|
self.row1 = None
|
|
self.row2 = None
|
|
self.row3 = None
|
|
|
|
def __init__(self, row0, row1, row2, row3):
|
|
if not isinstance(row0, vectors.Vector4d):
|
|
raise ValueError("Row must be a Vector4d object.", row0)
|
|
if not isinstance(row1, vectors.Vector4d):
|
|
raise ValueError("Row must be a Vector4d object.", row1)
|
|
if not isinstance(row2, vectors.Vector4d):
|
|
raise ValueError("Row must be a Vector4d object.", row2)
|
|
if not isinstance(row3, vectors.Vector4d):
|
|
raise ValueError("Row must be a Vector4d object.", row3)
|
|
|
|
self.row0 = row0
|
|
self.row1 = row1
|
|
self.row2 = row2
|
|
self.row3 = row3
|
|
|
|
def multiply_3d(self, vector3d):
|
|
x = vector3d.x * self.row0.x + vector3d.y * self.row1.x + vector3d.z * self.row2.x + self.row3.x
|
|
y = vector3d.x * self.row0.y + vector3d.y * self.row1.y + vector3d.z * self.row2.y + self.row3.y
|
|
z = vector3d.x * self.row0.z + vector3d.y * self.row1.z + vector3d.z * self.row2.z + self.row3.z
|
|
w = vector3d.x * self.row0.w + vector3d.y * self.row1.w + vector3d.z * self.row2.w + self.row3.w
|
|
|
|
if w != 0:
|
|
x /= w
|
|
y /= w
|
|
z /= w
|
|
|
|
return vectors.Vector3d(x, y, z)
|
|
|
|
class Matrix3x3:
|
|
def __init__(self):
|
|
self.row0 = None
|
|
self.row1 = None
|
|
self.row2 = None
|
|
|
|
def __init__(self, row0, row1, row2):
|
|
self.row0 = row0
|
|
self.row1 = row1
|
|
self.row2 = row2
|