geQKFrame

Description: Quaternion keyframe interface.

Source file: …\genesis3d\OpenSource\Source\Actor\QKFrame.h

Contents:

Functions: LinearCreate, SlerpCreate, SquadCreate, Insert, Query, Modify, LinearInterpolation, SlerpInterpolation, SquadInterpolation, SquadRecompute, SlerpRecompute, LinearRead, SlerpRead, SquadRead, CreateFromBinaryFile, WriteToBinaryFile, CreateFromFile, WriteToFile, WriteToFile

Types: geQKFrame_InterpolationType

Notes: view

Changes for Genesis3D v1.6: None

Types:

geQKFrame_InterpolationType
typedef enum {
     QKFRAME_LINEAR,
     QKFRAME_SLERP,
     QKFRAME_SQUAD
} geQKFrame_InterpolationType;
 
Return to Contents

Functions:

geTKArray* GENESISCC geQKFrame_LinearCreate(void);

NOTES:

Creates a frame list for linear interpolation

 

Return to Contents

geTKArray* GENESISCC geQKFrame_SlerpCreate();

NOTES:

Creates a frame list for spherical linear interpolation

 
Return to Contents

geTKArray* GENESISCC geQKFrame_SquadCreate();

NOTES:

Creates a frame list for spherical linear interpolation

 

Return to Contents

 geBoolean GENESISCC geQKFrame_Insert(geTKArray** KeyList, geTKArray_TimeType Time, const geQuaternion* Q, int * Index);

ARGUMENTS:

KeyList is keyframe list to insert into

Time is time of new keyframe

Q is quaternion at new keyframe

Index is index of new frame

NOTES:

Inserts a new keyframe with the given time and vector into the list.

 

Return to Contents

 void GENESISCC geQKFrame_Query(const geTKArray* KeyList, int Index, geTKArray_TimeType* Time, geQuaternion* V);

ARGUMENTS:

KeyList is keyframe list

Index is index of frame to return

Time is time of the frame is returned

V is vector from the frame is returned

NOTES:

Returns the vector and the time at keyframe[index]

 
Return to Contents

void GENESISCC geQKFrame_Modify(geTKArray* KeyList, int Index, const geQuaternion* Q);

ARGUMENTS

KeyList is keyframe list

Index is index of frame to change

Q is vector for the new key

NOTES

Modifies a vector at keyframe[index]

 
Return to Contents

void GENESISCC geQKFrame_LinearInterpolation(const void * KF1, const void * KF2, geFloat T, void * Result);

ARGUMENTS

KF1 is pointer to first keyframe

KF2 is pointer to second keyframe

T is blending parameter, 0 <= T <= 1

Result holds results

NOTES

Interpolates to get a vector between the two vectors at the two keyframes where T==0 returns the vector for KF1 and T==1 returns the vector for KF2 interpolates linearly

 
Return to Contents

void GENESISCC geQKFrame_SlerpInterpolation(const void * KF1, const void * KF2, geFloat T, void * Result);

ARGUMENTS:

KF1 is pointer to first keyframe

KF2 is pointer to second keyframe

T is blending parameter, 0 <= T <= 1

Result holds results

NOTES:

Interpolates to get a vector between the two vectors at the two keyframes where T==0 returns the vector for KF1 and T==1 returns the vector for KF2 interpolates using spherical linear blending

 
Return to Contents

void GENESISCC geQKFrame_SquadInterpolation(const void * KF1, const void * KF2, geFloat T, void * Result);

ARGUMENTS

KF1 is pointer to first keyframe

KF2 is pointer to second keyframe

T is blending parameter, 0 <= T <= 1

Result holds results

NOTES

Interpolates to get a vector between the two vectors at the two keyframes where T==0 returns the vector for KF1 and T==1 returns the vector for KF2 interpolates using spherical quadratic blending

 
Return to Contents

void GENESISCC geQKFrame_SquadRecompute(int Looped, geTKArray* KeyList);

NOTES

Looped indicates if keylist has the first key connected to last key

Rebuild precomputed data for keyframe list.

 
Return to Contents

void GENESISCC geQKFrame_SlerpRecompute( geTKArray* KeyList);

ARGUMENTS

KeyList: list of keys to recompute hermite values for

NOTES:

Rebuild precomputed data for keyframe list.

 

Return to Contents

geBoolean GENESISCC geQKFrame_LinearRead(geVFile* pFile, void * geQKFrame);

 
Return to Contents

geBoolean GENESISCC geQKFrame_SlerpRead(geVFile* pFile, void * geQKFrame);

 
Return to Contents

geBoolean GENESISCC geQKFrame_SquadRead(geVFile* pFile, void * geQKFrame);

 
Return to Contents

 geTKArray* GENESISCC geQKFrame_CreateFromBinaryFile(geVFile* pFile, int * InterpolationType, int * Looping);

 
Return to Contents

geBoolean GENESISCC geQKFrame_WriteToBinaryFile(geVFile* pFile, geTKArray* KeyList, geQKFrame_InterpolationType InterpolationType, int Looping);

 
Return to Contents

geTKArray* GENESISCC geQKFrame_CreateFromFile(geVFile* pFile, geQKFrame_InterpolationType* InterpolationType, int * Looping);

(Note: if being compiled for Borland C compiler, then geQKFrame_InterpolationType* type is replaced with int *)

 
Return to Contents

geBoolean GENESISCC geQKFrame_WriteToFile(geVFile* pFile, void * geQKFrame, geQKFrame_InterpolationType InterpolationType, int Looping);

 

Note: if being compiled for Borland C Compiler, then the following function is defined instead of above

geBoolean GENESISCC geQKFrame_WriteToFile(geVFile* pFile, geTKArray* KeyList, geQKFrame_InterpolationType InterpolationType, int Looping);

  

Return to Contents

Notes:

This module handles interpolation for keyframes that contain a quaternion.

This is intended to support Path.c

geTKArray supplies general support for a time-keyed array, and this supplements that support to include the specific time-keyed arrays:

An array of geQuaternion interpolated linearly
An array of geQuaternion with spherical linear interpolation (SLERP)
An array of geQuaternion with spherical quadrangle interpolation (SQUAD) as defined by: Advanced Animation and Rendering Techniques by Alan Watt and Mark Watt

These are phycially separated and have different base structures because the different interpolation techniques requre different additional data.

The two lists are created with different creation calls, interpolated with different calls, but insertion and queries share a call.

Quadrangle interpolation requires additional computation after changes are made to the keyframe list. Call geQKFrame_SquadRecompute() to update the calculations.

 

Return to Contents