Jump to content

Mod Tool/Scripting: Difference between revisions

moving scripting content peu a peu
m (extra anchors: rot -> mat; mat -> rot)
(moving scripting content peu a peu)
Line 5: Line 5:




===math===
====euler rotation -> matrix====
function cosn (n)
cosn = cos(XSIMath.DegreesToRadians(n))
end function
function sinn (n)
sinn = sin(XSIMath.DegreesToRadians(n))
end function
' ################
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
' 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




====euler rotation <-> matrix====
====matrix -> euler rotation====
  ' ### declare all functions first
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 ToEuler(M00, M10, M20, M21, M22)
  function ToEuler(M00, M10, M20, M21, M22)
Line 40: Line 97:
   
   
      end if
      end if
             Z = -Atan2(s, c)
             Z = -Atan2(s, c)
             Y = Atan2(M20, r)
             Y = Atan2(M20, r)
Line 52: Line 109:
  end function
  end function
   
   
' ################################
set RotMat = XSIMath.CreateMatrix3( _
0.25, 0.808012701892219, 0.53349364905389, _
-0.433012701892219, -0.399519052838329, 0.808012701892219, _
0.866025403784439, -0.433012701892219, 0.25 )
   
   
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
   
   
  ' convert matrix to euler rotation and store values to array
function sinn (n)
  ReXYZ = ToEuler(RotMat(0,0), RotMat(1,0), RotMat(2,0), RotMat(2,1), RotMat(2,2))
sinn = sin(XSIMath.DegreesToRadians(n))
end function
{{Anchor|convert_XYZ_rotation_to_matrix}}
' #########################################################################################
' 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 "##################"
{{Anchor|convert_matrix_to_XYZ_rotation}}
' #########################################################################################
  ' 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 "reconverted"
Line 110: Line 123:
  logmessage ReXYZ(1)
  logmessage ReXYZ(1)
  logmessage ReXYZ(2)
  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
  ' INFO : 60
  ' INFO : 60
  ' INFO : 60
====euler rotation -> quaternion====
dim x, y, z, dRotation, qRotation
x = 90
y = 0
z = 0
set dRotation = XSIMath.CreateRotation(XSIMath.DegreesToRadians(x), XSIMath.DegreesToRadians(y), XSIMath.DegreesToRadians(z))
set qRotation = XSIMath.CreateQuaternion()
dRotation.GetQuaternion (qRotation)
LogMessage qRotation.W
LogMessage qRotation.X
LogMessage qRotation.Y
LogMessage qRotation.Z
' INFO : 0,707106781186548
' INFO : 0,707106781186547
' INFO : 0
' INFO : 0
====quaternion -> euler rotation====
dim qW, qX, qY, qZ, qRotation, x, y, z
qW = 0.707106781186548
qX = 0.707106781186547
qY = 0
qZ = 0
set qRotation = XSIMath.CreateQuaternion (qW, qX , qY, qZ)
qRotation.GetXYZAngleValues x, y, z
logmessage XSIMath.RadiansToDegrees(x)
logmessage XSIMath.RadiansToDegrees(y)
logmessage XSIMath.RadiansToDegrees(z)
' INFO : 89,9999999999999
' INFO : 0
' INFO : 0
8,452

edits