Share via


Fusión de geometría (Direct3D 9)

Direct3D permite a una aplicación aumentar el realismo de sus escenas mediante la representación de objetos poligonales segmentados (especialmente caracteres) que tienen articulaciones combinadas sin problemas. Estos efectos se conocen a menudo como skinning. El sistema logra este efecto aplicando matrices de transformación del mundo adicionales a un único conjunto de vértices para crear varios resultados y, a continuación, realizar una combinación lineal entre los vértices resultantes para crear un único conjunto de geometría para la representación. En la ilustración siguiente de un plátano se muestra este proceso.

ilustración del proceso para mezclar dos objetos con textura de plátano

En la ilustración anterior se muestra cómo puede imaginar el proceso de fusión de geometría. En una sola llamada de representación, el sistema toma los vértices para el plátano, los transforma dos veces - una vez sin modificación, y una vez con una rotación simple - y combina los resultados para crear un plátano doblado. El sistema combina la posición del vértice, así como el vértice normal cuando se habilita la iluminación. Las aplicaciones no se limitan a dos rutas de acceso de mezcla; Direct3D puede combinar geometría entre hasta cuatro matrices mundiales, incluida la matriz mundial estándar, D3DTS_WORLD.

Nota

Cuando se habilita la iluminación, los valores normales de vértice se transforman mediante una matriz de vista global inversa correspondiente, ponderada de la misma manera que los cálculos de posición del vértice. El sistema normaliza el vector normal resultante si el estado de representación del D3DRS_NORMALIZENORMALS está establecido en TRUE.

 

Sin la combinación de geometría, los modelos articulados dinámicos a menudo se representan en segmentos. Por ejemplo, considere un modelo 3D del brazo humano. En la vista más sencilla, un brazo tiene dos partes: el brazo superior que se conecta al cuerpo y el brazo inferior, que se conecta a la mano. Los dos están conectados en el codo, y el brazo inferior gira en ese punto. Una aplicación que representa un brazo podría conservar los datos de vértices para el brazo superior e inferior, cada uno con una matriz de transformación del mundo independiente. En el siguiente ejemplo código se muestra cómo hacerlo.

typedef struct _Arm
{
    VERTEX upper_arm_verts[200];
    D3DMATRIX matWorld_Upper;

    VERTEX lower_arm_verts[200];
    D3DMATRIX matWorld_Lower;
} ARM, *LPARM;

ARM MyArm; // This needs to be initialized.

Para representar el brazo, se realizan dos llamadas de representación, como se muestra en el código siguiente.

// Render the upper arm.
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Upper );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );

// Render the lower arm, updating its world matrix to articulate
// the arm by pi/4 radians (45 degrees) at the elbow.
MyArm.matWorld_Lower = RotateMyArm(MyArm.matWorld, pi/4);
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Lower );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );

La ilustración siguiente es un plátano, modificado para usar esta técnica.

ilustración de un plátano combinado sin mezcla de geometría

Las diferencias entre la geometría combinada y la geometría noble son obvias. Este ejemplo es algo extremo. En una aplicación real, las juntas de modelos segmentados están diseñadas para que las costuras no sean tan obvias. Sin embargo, las costuras son visibles en ocasiones, lo que presenta desafíos constantes para los diseñadores de modelos.

La combinación de geometría en Direct3D presenta una alternativa al escenario clásico de modelado segmentado. Sin embargo, la calidad visual mejorada de los objetos segmentados conlleva el costo de los cálculos de fusión durante la representación. Para minimizar el impacto de estas operaciones adicionales, la canalización de geometría de Direct3D está optimizada para combinar la geometría con la menor sobrecarga posible. Las aplicaciones que usan inteligentemente los servicios de fusión de geometría ofrecidos por Direct3D pueden mejorar el realismo de sus caracteres, a la vez que evitan graves repercusiones en el rendimiento.

Combinar estados de transformación y representación

El método IDirect3DDevice9::SetTransform reconoce las macros D3DTS_WORLD y D3DTS_WORLDn , que corresponden a los valores que puede definir la macro D3DTS_WORLDMATRIX . Estas macros se usan para identificar las matrices entre las que se combinará la geometría.

El tipo enumerado D3DRENDERSTATETYPE incluye el estado de representación D3DRS_VERTEXBLEND para habilitar y controlar la combinación de geometría. Los valores válidos para este estado de representación se definen mediante el tipo enumerado D3DVERTEXBLENDFLAGS . Si la combinación de geometría está habilitada, el formato de vértice debe incluir el número adecuado de pesos de mezcla.

Mezcla de pesos

Un peso de mezcla, a veces denominado peso beta, controla la medida en que una matriz mundial determinada afecta a un vértice. Los pesos de fusión son valores de punto flotante que van de 0,0 a 1,0, codificados en el formato de vértice, donde un valor de 0,0 significa que el vértice no se combina con esa matriz y 1,0 significa que el vértice se ve afectado en su totalidad por la matriz.

Los pesos de fusión de geometría se codifican en el formato de vértice, que aparecen inmediatamente después de la posición de cada vértice, como se describe en Códigos FVF fijos de función (Direct3D 9). Para comunicar el número de pesos de fusión en el formato de vértice, incluya una de las constantes FVF en la descripción del vértice que proporcione a los métodos de representación.

El sistema realiza una combinación lineal entre los resultados ponderados de las matrices de mezcla. La siguiente ecuación es la fórmula de combinación completa.

ecuación de mezcla lineal, mediante matrices de transformación mundial

En la ecuación anterior, vBlend es el vértice de salida, los elementos v son los vértices generados por la matriz del mundo aplicada (D3DTS_WORLDn). Los elementos W son los valores de peso correspondientes dentro del formato de vértice. Un vértice combinado entre n matrices puede tener - 1 valores de peso de mezcla, uno para cada matriz de mezcla, excepto el último. El sistema genera automáticamente el peso de la última matriz mundial para que la suma de todos los pesos sea 1,0, expresada en notación sigma aquí. Esta fórmula se puede simplificar para cada uno de los casos admitidos por Direct3D, que se muestra en las siguientes ecuaciones.

ecuaciones de mezcla lineal para tres casos de combinación

Estas son las formas simplificadas de la fórmula de mezcla completa para los dos, tres y cuatro casos de matriz de mezcla.

Nota

Aunque Direct3D incluye descriptores FVF para definir vértices que contienen hasta cinco pesos de mezcla, solo se pueden usar tres en esta versión de DirectX.

 

La información adicional se incluye en los temas siguientes.

Canalización de vértices