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

SIQuaternion

unitary quaternion operand

q2

SIQuaternion

unitary quaternion operand

alpha

SIQuaternion

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

SIQuaternion.Normalize

SIVector3

SIMatrix3

SIMatrix4

SIRotation

SITransformation

SIQuaternion

 



Autodesk Softimage v7.5