/*
This example illustrates how to get the orientation of
one object relative to another.
*/
// CREATE OBJECTS A & B
var A = ActiveSceneRoot.AddNull("A");
var B = ActiveSceneRoot.AddNull("B");
// GET GLOBAL TRANSFORM OF A & B
var gksA = A.Kinematics.Global;
var gksB = B.Kinematics.Global;
var tgA = gksA.Transform;
var tgB = gksB.Transform;
// TRANSLATE & ROTATE A
var vA = XSIMath.CreateVector3(2, 2, 0);
tgA.SetTranslation(vA);
var rA = XSIMath.CreateRotation( 0, 0, XSIMath.DegreesToRadians(45) );
tgA.SetRotation(rA);
gksA.Transform = tgA;
// GET LOCAL TRANSFORM OF B RELATIVE TO A
var mA = XSIMath.CreateMatrix3();
var mB = XSIMath.CreateMatrix3();
tgA.GetRotationMatrix3(mA);
tgB.GetRotationMatrix3(mB);
mA.TransposeInPlace();
mB.MulInPlace(mA);
// GET ORIENTATION OF B RELATIVE TO A AS A QUATERNION
var qB = XSIMath.CreateQuaternion();
mB.GetQuaternion(qB);
// LOG RESULT
Application.LogMessage("Q(" + qB.w + "," + qB.x + "," + qB.y + "," + qB.z);
// Verify result by creating a child on A and transform it to
// have the same orientation as B
var oChild = A.AddNull("Child");
var lksChild = oChild.Kinematics.Local;
var tlChild = XSIMath.CreateTransform();
tlChild.SetRotationFromQuaternion(qB);
lksChild.Transform = tlChild;
// Expected results:
// INFO : Q(0.9238795325112867,0,0,-0.3826834323650898 |