Slerp (SIQuaternion)
Description
Calculates a spherical linear interpolation between q1 and q2 (two unitary quaternions).
Note: In versions earlier than v3.5 the method name was called SLerp. The unnecessary capitialization has been removed. Plug-ins will remain binary compatible but those that need to be recompiled will need editing to rename SLerp to Slerp.
Scripting Syntax
SIQuaternion.Slerp( q1, q2, alpha )
C# Syntax
SIQuaternion.Slerp( SIQuaternion in_pQuat1, SIQuaternion in_pQuat2, Double in_dU );Parameters
|
Parameter |
Type |
Description |
|
q1 |
unitary quaternion operand |
|
|
q2 |
unitary quaternion operand |
|
|
alpha |
Interpolation factor Possible Values: • [0.0, 1.0]: Validity domain |
Examples
1. JScript Example
/* Example showing how to use SIQuaternion.Slerp to blend between two rotations */ // // Code for the example scripted operator // strDeclOperatorGlobals = "var gQA, gQB, gQC;" ; function Slerper_Init( ctx ) { // The SIQuaternion objects are global // to avoid recreating them at each update gQA = XSIMath.CreateQuaternion() ; gQB = XSIMath.CreateQuaternion() ; gQC = XSIMath.CreateQuaternion() ; } function Slerper_Update( ctx, outC, inA, inB ) { slerpFactor = ctx.Parameters( "Slerp" ).Value ; oATrans = inA.Value.Transform ; oATrans.GetRotationQuaternion( gQA ) ; oBTrans = inB.Value.Transform ; oBTrans.GetRotationQuaternion( gQB ) ; gQA.Normalize() ; gQB.Normalize() ; gQC.Slerp( gQA, gQB, slerpFactor ) ; oCTrans = outC.Value.Transform ; oCTrans.SetRotationFromQuaternion( gQC ) ; // Very important: oCTrans is just a temporary // so we must set it back to change it outC.Value.Transform = oCTrans ; } // // Demo the scripted operator // // Build 3 cones. C will show the blended rotation of A and B NewScene( null,false) ; var oConeA = ActiveSceneRoot.AddPrimitive( "Cone", "A" ) ; var oConeB = ActiveSceneRoot.AddPrimitive( "Cone", "B" ) ; var oConeC = ActiveSceneRoot.AddPrimitive( "Cone", "C" ) ; // // Set some initial position/rotation // oTransA = XSIMath.CreateTransform() ; oTransA.SetTranslationFromValues( 5, 0 , 0 ) ; oTransA.SetRotationFromXYZAnglesValues( 0, 0 , -90 ) ; oConeA.Kinematics.Global.Transform = oTransA ; oTransB = XSIMath.CreateTransform() ; oTransB.SetTranslationFromValues( -5, 0 , 0 ) ; oTransB.SetRotationFromXYZAnglesValues( 0, 0 , 90 ) ; oConeB.Kinematics.Global.Transform = oTransB ; // // Connect the Kinematics // strOpCode = strDeclOperatorGlobals + Slerper_Init.toString() + Slerper_Update.toString() ; oOp = XSIFactory.CreateScriptedOp( "Slerper", strOpCode, "JScript" ) ; oOp.AddOutputPort( oConeC.Kinematics.Global ) ; oOp.AddInputPort( oConeA.Kinematics.Global ) oOp.AddInputPort( oConeB.Kinematics.Global ) ; oSlerp = oOp.AddParameter ( XSIFactory.CreateParamDef2("Slerp", siDouble, 0.5, 0, 1) ); oOp.Connect() ; // Show the operator so that the Slerp amount can be changed with a slider InspectObj( oOp ) ;
2. VBScript Example
dim q1, q2, q3 ' Create Quaternions. set q1 = XSIMath.CreateQuaternion(1.0, 1.0, 2.0, 3.0) set q2 = XSIMath.CreateQuaternion(1.0, 4.0, 5.0, 6.0) set q3 = XSIMath.CreateQuaternion q1.Normalize q2.Normalize for alpha = 0 to 1 step .1 q3.Slerp q1, q2, alpha 'do something with q3 next
See Also
|
|
Autodesk Softimage v7.5