Debido a la poca, o extensa, confusa y en inglés documentación del formato .X3D me estoy viendo obligado a usar ingeniería inversa para entender bien como funciona este formato. Hasta ahora he descubierto lo siguiente:
- Los ficheros .X3D exportados por Blender usan la notación de la mano derecha, mientras que por defecto, DirectX usa la notación de la mano izquierda. Esto quiere decir que el eje Z esta invertido para su uso con DirectX. Para corregir esto, tengo que hacer 2 cosas:
- Cambiar el signo a todas las componentes Z del objeto leído desde el fichero .X3D.
- Invertir el orden natural en que son definidos los polígonos en el fichero .X3D.
- Los polígonos de los objetos son definidos dentro de los ficheros .X3D como vértices y grupos de índices. Los vértices son cadenas formadas por grupos de 3 coordenadas separadas por comas. Y los índices vienen definidos por grupos de 4 índices separados por la siguiente cadena: "-1,". Teniendo en cuenta lo expuesto en el punto 1. Tendré que tener en cuenta que para Blender los polígonos están formados por 4 vértices, mientras que para DirectX deberán ser triángulos exclusivamente, "rompiendo" cada polígono de 4 vértices en 2 polígonos de 3 vértices.
Por ejemplo: si leemos esta lista de índices: "0 1 2 3 -1, 4 5 6 7 -1, ", deberemos transformarla así:
- Cambiar el orden en que son definidos los vértices y pasar de un grupo 4 vértice a 2 grupos de 3 vértices: "0 2 1, 0 3 2".
En cuanto a los vértices leídos, bastará con invertir el signo de la componente Z para todos los vértices.
Actualización: Una vez aplicados estos conceptos a la lectura de ficheros .X3D, el programa ya es capaz de leer la geometría de objetos desde ficheros externos, creados en Blender y exportados como ficheros .X3D con formato XML. Incluso con geometrías mas complejas como la de la nave que diseñé hace unos meses, el programa lo lee sin problemas. El único fallo o contratiempo que encuentro son las proporciones de la nave, que parece algo "engordada", posiblemente por los parámetros con los que estoy configurando la cámara. Otro contratiempo es la falta de un Z-Buffer que esconda poligonos que no deberían verse.
Los posibles puntos siguientes serían:
- Activar un Z-Buffer para esconder polígonos no deseados.
- Empezar a trabajar con iluminación para dotar de más realismo a los objetos.
- Dar soporte para texturas.

No hay comentarios:
Publicar un comentario