blua tigro
Gebruiker
- Lid geworden
- 21 apr 2009
- Berichten
- 48
dit heb ik nodig voor mijn 3dengine
i denk niet dat ik .scale() nodig heb
maar voor anderen kan t nuttig zijn
.inverse() heb ik gekopieerd uit n freebasic file
t zou alemaal moeten werken
i denk niet dat ik .scale() nodig heb
maar voor anderen kan t nuttig zijn
.inverse() heb ik gekopieerd uit n freebasic file
t zou alemaal moeten werken
Code:
'' bluatigro 29 aug 2017
'' matrix 4 x 4 class
Public Class m4x4
Public m(3, 3) As Double
Private Const deg2rad as Double = Math.pi / 180
Public Sub New()
Dim i as Integer
Dim j as Integer
For i = 0 to 3
For j = 0 to 3
m(i, j) = 0.0
Next j
m(i, i) = 1.0
Next i
End Sub
Public Shared Operator *(a As m4x4, b As m4x4) As m4x4
Dim uit As m4x4
Dim i as Int16
Dim j as Int16
Dim k as Int16
For i = 0 to 3
For j = 0 to 3
uit.m(i, j) = 0.0
For k = 0 to 3
uit.m(i, j) += a.m(i, k) * b.m(k, j)
Next k
Next j
Next i
Return uit
End Operator
public function inverse() as m4x4
'' for the inverse rotation matrix
'' it wil NOT calculate inverse translation
dim d as double
dim uit as m4x4
dim q as m4x4 = Me
d = q.m(0,0)*q.m(1,1)*q.m(2,2) _
- q.m(0,0)*q.m(2,1)*q.m(1,2) _
+ q.m(1,0)*q.m(2,1)*q.m(0,2) _
- q.m(1,0)*q.m(0,1)*q.m(2,2) _
+ q.m(2,0)*q.m(0,1)*q.m(1,2) _
- q.m(2,0)*q.m(1,1)*q.m(0,2)
uit.m(0,0)=(q.m(1,1)*q.m(2,2)-q.m(1,2)*q.m(2,1))/d
uit.m(1,0)=(q.m(0,1)*q.m(2,2)-q.m(0,2)*q.m(2,1))/d
uit.m(2,0)=(q.m(0,1)*q.m(1,2)-q.m(0,2)*q.m(1,1))/d
uit.m(0,1)=(q.m(1,0)*q.m(2,2)-q.m(1,2)*q.m(2,0))/d
uit.m(1,1)=(q.m(0,0)*q.m(2,2)-q.m(0,2)*q.m(2,0))/d
uit.m(2,1)=(q.m(0,0)*q.m(1,2)-q.m(0,2)*q.m(1,0))/d
uit.m(0,2)=(q.m(1,0)*q.m(2,1)-q.m(1,1)*q.m(2,0))/d
uit.m(1,2)=(q.m(0,0)*q.m(2,1)-q.m(0,1)*q.m(2,0))/d
uit.m(2,2)=(q.m(0,0)*q.m(1,1)-q.m(0,1)*q.m(1,2))/d
return uit
end function
Public Sub translate(x As Double _
,y As Double ,z As Double)
m(3, 0) = x
m(3, 1) = y
m(3, 2) = z
End Sub
Public Sub rotate(deg As Double _
, ax As Int16 = 0)
Dim a As Int16 = 1
Dim b As Int16 = 2
If ax = 1 Then
a = 0
b = 2
End If
If ax = 2 Then
a = 0
b = 1
End If
m(a, a) = Math.cos(deg * deg2rad)
m(a, b) = -Math.sin(deg * deg2rad)
m(b, a) = Math.sin(deg * deg2rad)
m(b, b) = Math.cos(deg * deg2rad)
End Sub
Public Sub scale(x As Double _
,y As Double ,z As double)
m(0, 0) = x
m(1, 1) = y
m(2, 2) = z
End Sub