Mod Tool/Scripting: Difference between revisions
< Mod Tool
Jump to navigation
Jump to search
Paradox-01 (talk | contribs) mNo edit summary |
m (+cat) |
||
Line 1: | Line 1: | ||
===Math=== | |||
====Euler rotation -> matrix==== | |||
=== | |||
==== | |||
function cosn (n) | function cosn (n) | ||
cosn = cos(XSIMath.DegreesToRadians(n)) | cosn = cos(XSIMath.DegreesToRadians(n)) | ||
Line 53: | Line 47: | ||
==== | ====Matrix -> Euler rotation==== | ||
Function Atan2(y, x) | Function Atan2(y, x) | ||
If x > 0 Then | If x > 0 Then | ||
Line 129: | Line 123: | ||
==== | ====Euler rotation -> quaternion==== | ||
dim x, y, z, dRotation, qRotation | dim x, y, z, dRotation, qRotation | ||
x = 90 | x = 90 | ||
Line 155: | Line 149: | ||
==== | ====Quaternion -> Euler rotation==== | ||
dim qW, qX, qY, qZ, qRotation, x, y, z | dim qW, qX, qY, qZ, qRotation, x, y, z | ||
Line 179: | Line 173: | ||
'qW = ... * -1 | 'qW = ... * -1 | ||
'set qRotation = XSIMath.CreateQuaternion (qW, qX, qY, qZ) | 'set qRotation = XSIMath.CreateQuaternion (qW, qX, qY, qZ) | ||
[[Category:Windows-only modding tools]] |
Revision as of 20:29, 20 March 2014
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
Matrix -> Euler rotation
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) 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 ' ################################ set RotMat = XSIMath.CreateMatrix3( _ 0.25, 0.808012701892219, 0.53349364905389, _ -0.433012701892219, -0.399519052838329, 0.808012701892219, _ 0.866025403784439, -0.433012701892219, 0.25 ) ' convert matrix to euler rotation and store values to array ReXYZ = ToEuler(RotMat(0,0), RotMat(1,0), RotMat(2,0), RotMat(2,1), RotMat(2,2)) logmessage "reconverted" logmessage ReXYZ(0) logmessage ReXYZ(1) logmessage ReXYZ(2) ' 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 ' to calculate oni quaternions from euler rotations use this setup: ' LogMessage qRotation.X ' LogMessage qRotation.Y ' LogMessage qRotation.Z ' LogMessage qRotation.W * -1
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 ' to calculate euler rotations from oni quaternions use this setup: 'qX = ... 'qY = ... 'qZ = ... 'qW = ... * -1 'set qRotation = XSIMath.CreateQuaternion (qW, qX, qY, qZ)