Función D3DXQuaternionSquadSetup (D3DX10Math.h)

Nota

La biblioteca de utilidades D3DX10 está en desuso. Se recomienda usar DirectXMath en su lugar.

Configura puntos de control para la interpolación esférica cuadrángulo.

Sintaxis

void D3DXQuaternionSquadSetup(
  _In_       D3DXQUATERNION *pAOut,
  _In_       D3DXQUATERNION *pBOut,
  _In_       D3DXQUATERNION *pCOut,
  _In_ const D3DXQUATERNION *pQ0,
  _In_ const D3DXQUATERNION *pQ1,
  _In_ const D3DXQUATERNION *pQ2,
  _In_ const D3DXQUATERNION *pQ3
);

Parámetros

pAOut [in]

Tipo: D3DXQUATERNION*

Puntero a AOut.

pBOut [in]

Tipo: D3DXQUATERNION*

Puntero a BOut.

pCOut [in]

Tipo: D3DXQUATERNION*

Puntero a COut.

pQ0 [in]

Tipo: const D3DXQUATERNION*

Puntero al punto de control de entrada, Q0.

pQ1 [in]

Tipo: const D3DXQUATERNION*

Puntero al punto de control de entrada, Q1.

pQ2 [in]

Tipo: const D3DXQUATERNION*

Puntero al punto de control de entrada, Q2.

pQ3 [in]

Tipo: const D3DXQUATERNION*

Puntero al punto de control de entrada, Q3.

Valor devuelto

Ninguno.

Comentarios

Esta función toma cuatro puntos de control, que se proporcionan a las entradas pQ0, pQ1, pQ2 y pQ3. A continuación, la función modifica estos valores para encontrar una curva que fluye a lo largo del trazado más corto. Los valores de q0, q2 y q3 se calculan como se muestra a continuación.

q0 = |Q0 + Q1| < |Q0 - Q1| ? -Q0 : Q0
q2 = |Q1 + Q2| < |Q1 - Q2| ? -Q2 : Q2
q3 = |Q2 + Q3| < |Q2 - Q3| ? -Q3 : Q3

Después de calcular los nuevos valores de Q, los valores de AOut, BOut y COut se calculan de la siguiente manera:

AOut = q1 * e[-0.25\ *(\ Ln[Exp(q1)*q2]\ +\ Ln[Exp(q1)*q0]\ )\ ]

BOut = q2 * e[-0.25\ *(\ Ln[Exp(q2)*q3]\ +\ Ln[Exp(q2)*q1]\ )\ ]

COut = q2

Nota

Ln es el método de API D3DXQuaternionLn y Exp es el método de API D3DXQuaternionExp.

 

Use D3DXQuaternionNormalize para cualquier entrada de cuaternión que aún no esté normalizada.

Ejemplos

En el ejemplo siguiente se muestra cómo usar un conjunto de claves de cuaternión (Q0, Q1, Q2, Q3) para calcular los puntos cuadrángulos internos (A, B, C). Esto garantiza que las tangentes sean continuas entre segmentos adyacentes.

      A     B
Q0    Q1    Q2    Q3

En el ejemplo de código siguiente se muestra cómo se puede interpolar entre Q1 y Q2.

// Rotation about the z-axis
D3DXQUATERNION Q0 = D3DXQUATERNION(0,  0, 0.707f, -.707f);
D3DXQUATERNION Q1 = D3DXQUATERNION(0,  0, 0.000f, 1.000f);
D3DXQUATERNION Q2 = D3DXQUATERNION(0,  0, 0.707f, 0.707f);
D3DXQUATERNION Q3 = D3DXQUATERNION(0,  0, 1.000f, 0.000f);
D3DXQUATERNION A, B, C, Qt;
FLOAT time = 0.5f;

D3DXQuaternionSquadSetup(&A, &B, &C, &Q0, &Q1, &Q2, &Q3);
D3DXQuaternionSquad(&Qt, &Q1, &A, &B, &C, time);

Nota

  • C es +/- Q2 en función del resultado de la función.
  • Qt es el resultado de la función .

El resultado es un giro de 45 grados alrededor del eje Z para el tiempo = 0,5.

 

Requisitos

Requisito Value
Encabezado
D3DX10Math.h
Biblioteca
D3DX10.lib

Vea también

Funciones matemáticas