2012-01-04 8 views
6

Para un proyecto de hobby mío que involucre una impresora 3D, me gustaría capturar modelos en 3D de varios juegos de computadora. Los juegos se ejecutan en Windows y generalmente usan DirectX9, pero también hay uno que se puede configurar para usar OpenGL.Volcado de datos de geometría en 3D de una aplicación Direct3D u OpenGL en ejecución

¿Hay alguna herramienta/software que me permita tomar una escena completa de una aplicación en ejecución y volcarla en un archivo que pueda convertirse en algún formato popular en 3D como OBJ?

Lo que necesito es solo la geometría; puntos, bordes, polígonos. No necesito texturas o datos de sombreado. ¿Es esto posible?

Respuesta

4

¿Hay alguna herramienta/software que me permita tomar una escena completa de una aplicación en ejecución y volcarla en un archivo que se pueda convertir a algún formato popular en 3D como OBJ?

Sí, y no. Es perfectamente posible interceptar los datos enviados a OpenGL o Direct3D. El problema es que ni OpenGL ni Direct3D son gráficos de escena. Están dibujando API, así que lo que terminas son montones de comandos de dibujo.

Y esos racimos no son necesariamente por objeto o por objetos enteros. Por ejemplo, dibujar al personaje en los juegos modernos ocurre en múltiples pases y trozos (la animación facial requiere sombreadores mucho más complejos que el resto del cuerpo).

Técnicamente puede suponer matrices de vértices o objetos de búfer de vértices que contienen al menos objetos enteros, por lo que es razonable descartar objetos basados ​​en llamadas glDrawElements o glDrawArrays y los punteros de matriz de vértices usados ​​o VBO.

El modo inmediato es sorprendente: no tiene la más mínima información, qué se representa cuando. Técnicamente, podrías probar algunas heurísticas usando el tiempo y el orden de las llamadas. Pero eso es inútil.

¿Hay alguna herramienta/software que me permita tomar una escena completa de una aplicación en ejecución y volcarla en un archivo que se pueda convertir a algún formato popular en 3D como OBJ?

En mi hackerspace local, un interceptor OpenGL muy rudimentario fue escrito para esa tarea. Y corrimos en todos los problemas que mencioné.

+0

No necesito necesariamente los datos por objeto, bastará con tener un volcado de toda la escena. Pero, por lo que yo sé, ¿la única forma de hacerlo es reconstruir la escena desde históricos glDrawArrays? ¿Puedo al menos asumir que solo importa el OpenGL actual? – CodeTwice

+0

El problema es que lo que ve en la pantalla no es necesariamente una sopa triangular coherente (una sopa triangular es simplemente una colección de triángulos que comparten el mismo espacio). Por ejemplo, el fondo puede usar las mismas dimensiones como la escena normal, solo que se representa primero, luego se borra el búfer de profundidad. Y lo que olvidé por completo es que la teselación, la geometría y los sombreadores de vértices pueden alterar por completo el resultado. Y si te enfrentas a un programa básico de OpenGL-3, no sabes qué atributo es qué. Tendrá que adaptar su dumper al programa en cuestión para poder extraer cosas. – datenwolf

Cuestiones relacionadas