Mod Tool/Scripting: Difference between revisions

From OniGalore
Jump to navigation Jump to search
(xsi scripting is getting to much)
 
m (extra anchors: rot -> mat; mat -> rot)
Line 1: Line 1:
   
   




Line 75: Line 74:
  sinn = sin(XSIMath.DegreesToRadians(n))
  sinn = sin(XSIMath.DegreesToRadians(n))
  end function
  end function
   
  {{Anchor|convert_XYZ_rotation_to_matrix}}
  ' #########################################################################################
  ' #########################################################################################
  ' convert XYZ rotation to matrix
  ' convert XYZ rotation to matrix
 
  logmessage "input"
  logmessage "input"
  x = 60 : logmessage x
  x = 60 : logmessage x
Line 100: Line 99:
  next
  next
  logmessage "##################"
  logmessage "##################"
   
  {{Anchor|convert_matrix_to_XYZ_rotation}}
  ' #########################################################################################
  ' #########################################################################################
  ' convert matrix to XYZ rotation
  ' convert matrix to XYZ rotation

Revision as of 23:09, 8 February 2014





euler rotation <-> matrix

' ### declare all functions first

function ToEuler(M00, M10, M20, M21, M22)
            a = M00
            b = M10
            dim c, s, r

            if b = 0 then
                c = Sgn(a)
                s = 0
                r = Abs(a)

            elseif a = 0 then
                c = 0
                s = Sgn(b)
                r = Abs(b)
                
            elseif Abs(b) > Abs(a) then
                t = a / b
                u = Sgn(b) * Sqr(1 + t * t)
                s = 1 / u
                c = s * t
                r = b * u

            else
                t = b / a
                u = Sgn(a) * Sqr(1 + t * t)
                c = 1 / u
                s = c * t
                r = a * u

	    end if
			
            Z = -Atan2(s, c)
            Y = Atan2(M20, r)
            X = -Atan2(M21, M22)

	    X = XSIMath.RadiansToDegrees(X)
	    Y = XSIMath.RadiansToDegrees(Y)
	    Z = XSIMath.RadiansToDegrees(Z)

	    ToEuler = array(X, Y, Z)
end function


Function Atan2(y, x)
  If x > 0 Then
    Atan2 = Atn(y / x)
  ElseIf x < 0 Then
    Atan2 = Sgn(y) * (XSIMath.PI - Atn(Abs(y / x)))
  ElseIf y = 0 Then
    Atan2 = 0
  Else
    Atan2 = Sgn(y) * XSIMath.PI / 2
  End If
End Function


function cosn (n)
	cosn = cos(XSIMath.DegreesToRadians(n))
end function


function sinn (n)
	sinn = sin(XSIMath.DegreesToRadians(n))
end function

' #########################################################################################
' convert XYZ rotation to matrix
 
logmessage "input"
x = 60 : logmessage x
y = 60 : logmessage y
z = 60 : logmessage z

logmessage "##################"
logmessage "converted"

set RotMatX = XSIMath.CreateMatrix3(1, 0, 0, 0, cosn(x), sinn(x), 0, -sinn(x), cosn(x))
set RotMatY = XSIMath.CreateMatrix3(cosn(y), 0, -sinn(y), 0, 1, 0, sinn(y), 0, cosn(y))
set RotMatZ = XSIMath.CreateMatrix3(cosn(z), sinn(z), 0, -sinn(z), cosn(z), 0, 0, 0, 1)

RotMatZ.MulInPlace RotMatY
RotMatZ.MulInPlace RotMatX

for i=0 to 2
	for j=0 to 2
		logmessage RotMatZ (i, j)
	next
next
logmessage "##################"

' #########################################################################################
' convert matrix to XYZ rotation

' store ouput values to array
ReXYZ = ToEuler(RotMatZ(0,0), RotMatZ(1,0), RotMatZ(2,0), RotMatZ(2,1), RotMatZ(2,2))

logmessage "reconverted"
logmessage ReXYZ(0)
logmessage ReXYZ(1)
logmessage ReXYZ(2)

logmessages:

' INFO : input
' INFO : 60
' INFO : 60
' INFO : 60
' INFO : ##################
' INFO : converted
' INFO : 0,25
' INFO : 0,808012701892219
' INFO : 0,53349364905389
' INFO : -0,433012701892219
' INFO : -0,399519052838329
' INFO : 0,808012701892219
' INFO : 0,866025403784439
' INFO : -0,433012701892219
' INFO : 0,25
' INFO : ##################
' INFO : reconverted
' INFO : 60
' INFO : 60
' INFO : 60