Búscalo aquí:

Graficación de Objetos 3D

I. Introducción
  • Los orígenes de los fundamentos de las imágenes en tres dimensiones se remontan al renacimiento, época en la que los artistas aprendieron cómo engañar al ojo logrando una sensación de profundidad al contemplar una superficie plana bidimensional.
  • Con el correr de los años este trabajo a sido mejorado, hasta nuestros días, en lo que las películas mezclan el arte tridimensional y la animación con la fotografía y la cinematografía tradicionales haciendo que se desplieguen grandes esfuerzos para lograr un mejor fotorrealismo.
  • El fotorrealismo se refiere a imágenes generadas por ordenador que modelan las propiedades ópticas y físicas del mundo real de forma tan acertada que, al contemplarlas, dan la impresión de ser fotografías tomadas de escenas del mundo real.
  • Los programas de creación de imágenes en 3D codifican en una serie de algoritmos las leyes de la perspectiva y las complejas interrelaciones entre las superficies y la iluminación de las mismas.



II. Las Coordenadas Espaciales en el Computador

El filósofo y matemático René Descartes descansaba cuando una mosca entró en su habitación y empezó a revoletear en el techo. Entonces, el matemático concibió el sistema de coordenadas que actualmente lleva su nombre.

Descartes pensó que la posición de la mosca en cualquier punto del espacio podría describirse usando tres números, cada uno de los cuales serviría para representar la posición relativa a un punto preestablecido.

Debido al plano cartesiano se puede especificar la posición de cualquier punto de la pantalla mediante la utilización de un par de coordenadas.

Los tipos de coordenadas son:
  1. Coordenadas Específicas: son las coordenadas propias de cada tipo de dispositivo.
  2. Coordenadas Universales: son las coordenadas propias de cada objeto cuyo origen es ubicado en el centro.
  3. Coordenadas Visuales: se modifican las coordenadas de cada objeto mediante operaciones para situarlos en el sitio y en la posición del espacio que le orresponde a cada uno.
A. La Coordenada Z
En la graficación de objetos 3D, hace falta introducir una coordenada que represente la tercera dimensión. En los gráficos por computadora, la tercera dimensión siempre aporta la profundidad.

El objetivo de los graficos tidimensionales es proyectar un mundo tridimensional en una pantalla bidimensional, de tal manera que el observador siempre tenga la sensación de que existe una tercera dimensión: Z perpendicular a X e Y.


III. Proceso de Creación de un Objeto Tridimensional por Computador

El objetivo de esta entrada de blog es mostrar el desarrollo de un pequeño pero muy significativo software desarrollado netamente en el lenguaje Java y en el cual eh implementado mis propias funciones para el trazado, sombreado e iluminación de objetos tridimensionales, así como las principales transformaciones de coordenadas como el escalamiento, rotación, traslación, entre otras, y la puesta en escena del objeto creado con la respectiva proyección en coordenadas de vista. Todas estas condiciones permiten que el despliegue de la escena sea lo más real posible, logrando de esta manera el objetivo del fotorrealismo.

Para el desarrollo de este software demostrativo eh llevado a cabo 4 etapas, las cuales son llamadas las 4 etapas del proceso creativo, las cuales son:
  1. Planificación del Proyecto: Se realiza un boceto en papel para planificar la escena y la forma como se visualizará.
  2. Modelado: Creación de una versión generada por computador del boceto previo.
  3. Puesta en escena: En esta etapa se colocan los diversos objetos en un "escenario". Asimismo, se procede a crear un punto de vista colocando una cámara en la escena. Se añade iluminación para conseguir un efecto real (el color, sombreado y otros atibutos de la supeficie) .
  4. Rendering: Finalmente, la escena se renderiza. Se trata de un proceso que convierte los datos tridimensionales generados durante las etapas previas en una imagen.

IV. Software de Graficación Tridimensional.
Como se había mencionado líneas arriba, presentaré un software de graficación, en la que con la implementación de algoritmos eh logrado crear un objeto 3D como si lo hubiese realizado con un software especializado para este tipo de trabajos. Cabe resaltar que no hice uso de ninguna biblioteca o libreria de graficación, todos los métodos y funciones fueron implementados directamente en el lenguaje Java.

El objeto puesto en escena es un objeto simple: un cubo, el cual, ha sido renderizado en su totalidad. Para una mejor apreciación del cubo, las caras de este han sido sombreadas con colores distintos: la cara frontal con color azul, la cara lateral izquierda de color verde, la lateral derecha de color morado, la cara posterior de color amarillo, la cara superior de color rojo, y la cara inferior de color plomo.

A continuación se muestra el objeto cubo visto desde diferentes cámaras, las cuales permiten diferenciar claramente las diferentes caras del objeto tridimensional.



En la primera imagen se observa el objeto cubo visto frontalmente, en las demás imagenes se puede observar al mismo objeto cubo desde diferentes ángulos en los que se aprecian sus 6 caras distintas.

El objeto cubo ha sido diseñado teniendo especial cuidado con la superficie del mismo, a la cual se le ha dotado de caracterísiticas de superficie lisa. Cabe mencionar también que este software presenta condiciones de iluminación diferentes. En cada opción de iluminación se colocan dos fuentes de luz o focos dispuestos en distintas posiciones de la escena, esto se puede observar en la imagen que se presenta a continuación, en la que se muestra al objeto cubo dispuesto en una determinada posición pero iluminado de 4 maneras diferentes. Algunos de los algoritmos implementados son el de Z-Buffer para el backfacing y el algoritmo de Goraud para la iluminación, solo por mencionar algunos.

A manera de comentario, para la graficación de objetos tridimensionales hice uso de una estructura especial, a la que denomine FrameBuffer, la cual consiste en un arreglo bidimensional de listas enlazadas en las que almaceno datos con la información de los objetos encontrados para cada píxel de la pantalla. Además, como es muy sabido, el hecho de dibujar de izquierda a derecha y de arriba hacia abajo todos y cada uno de los puntos de la pantalla significa un costo elevadísimo de recursos (memoria) y de tiempo de ejecución, lo que conlleva a una importante reflexión si se desea realizar un software óptimo.

Para este inconveniente hice uso del método MemoryImageSource, el cual me pemite crear desde un arreglo de enteros el objeto que será dibujado en pantalla. Lo que hace el método MemoryImageSource es convertir un arreglo de enteros en una objeto Image de java (provisto en el paquete java.awt.image desde la versión jdk 1.1 en adelante).

El uso de la estructura FrameBuffer y del método MemoryImageSource son de fundamental importancia para el desarrollo del software presentado, y que de esta manera se evita recalcular a cada instante toda la escena, pues MemoryImageSource solo actualizará la información modificada en la estructura FrameBuffer, es decir, solo se modificará la información de los píxeles que sufren cambios (cambian de posición o son iluminados, por ejemplo).

Espero les sea de utilidad, saludos



Quieres leer más post como éste???...suscribete aquí!!!



20 comentarios:

  1. Buena brother, tu cubito esta chevere, tiene bastante mérito por haber sido graficado sin hacer uso de ninguna biblioteca de graficos, felicitaciones y sigue trabajando.

    ResponderEliminar
  2. Bien man, esta chevere, me baje tu ejecutable y me vacilo el programa, es muy bueno por que en él se pone en practica muchos conocimientos que unicamente quedan en teoria y que generalmente aplicamos haciendo uso d elibrerias de funciones como OpenGl o VTK, felicitaciones gran jorge, como siempre tu chancando, cdt.

    ResponderEliminar
  3. Hola jorgito, esta bonito tu blog, felicidades, jeje, me robe tu fotito, sales bien lindo...como siempre!!!

    ResponderEliminar
  4. Buena entrada de blog man, ta chvr

    ResponderEliminar
  5. Buena man, ta bacan, felicitaciones, y por cierto, la foto en la que sales con tu enemorada tb esta chvr, felicitaciones, te va bien en todo, enhorabueno , cdt nos estamos viendo

    ResponderEliminar
  6. Buena Jorge ya me estas igualando jajaja mentira sigue asi man y suerte en la JPC se q va ser aceptado tu proyecto que de hecho supongo que es bueno!!

    ResponderEliminar
  7. Enhorabuena mi lobito, espero que esten bien, como 100mpre, por ac te extrañamos, y vaya que eres famoso pues escribi tu nombre en el google y vine a para a tu blog, felicitaciones, como 100pre tapandole la boca a los demás, cdt, ahhhh, me estoy llevando tu jotito, espero ke no te moleste, besitos varios, bye.

    ResponderEliminar
  8. OSCAR:
    Esta bien chevere tu blog Sigue asi jorge tengo la seguridad de que llegaras muy lejos asi es que sigue rayandote jaaaaa.....

    ResponderEliminar
  9. Hola pes tocayo, me gusta tu blog..esta muy interesante y de seguro les sera de ayuda a muchas personas interesadas en este campo. Suerte y cuenta conmigo para lo que deseas...

    ResponderEliminar
  10. Asu, gracias por sus comentarios, no crei ke les gustaria este sitio, gracias y como dice el gran Oscar seguiré rayandome para igualra al gran micki.

    Mechita sorry por no ir a verte, ya lte caeré un día, bytes y muchas gracias, arrivaderchi, o como se diga.

    ResponderEliminar
  11. Hola amigo...estan shidos tus graficos...yo apenas empece con esto y puedo hacer graficos 2D...pero sabes se me esta complicando java 3D quiero hacer mis propias figuras con coordenadas predefinidas y no me sale..me gustaria saber si me puedes ayudar actualmente uso la clase GeneralPath en java para definir mis figuras pero no se como hacerlo para 3D...espero me puedas ayudar y ps suerte bytes

    ResponderEliminar
  12. Hola manuel, weno te podria ayudar en lo poco ke sé peo te recuerdo que en el trabajo que presento en esta entrada no uso ninguna clase de Java 3D, solo uso herramientas basicas para poner el color a los pixeles, cualquier cosa escribeme a mi correo: jorge.carlos14@gmail.com

    ResponderEliminar
  13. hola estoy investigando sobre la visualizacion de objetos 3D a apartir de imagenes 2D, he leido tu paper "deteccion de bordes mediante el algoritmo de canny" y tengo algunas dudas, sobre la tecnica que utilizas para hallar el gradiente y la funcion de la imagen de la cual aplicas, me podrias responder a js_miguelon@hotmail.com
    gracias

    ResponderEliminar
  14. Esat bacan master sigue asi (Y)

    ResponderEliminar
  15. Saludos!, oye mira tengo que realizar un automóvil en 3d utilizando VTK y java a partir de un modelo que yo genero, pero lo que no sé, es cómo representar ese modelo en java, es decir no se como crear las "facetas o celdas" para el carrito, espero puedas ayudarme o pasarme algunas referencias, saludos!!!! mi correo es rolamela@hotmail.com

    ResponderEliminar
  16. Hola, estoy trabajando en un digitalizador tridimensional que genera las coordenadas espaciales de la superficie de un objeto. Se crea un archivo de texto con tres columnas para las coordenadas y luego se importa el archivo a Rhinoceros. La nube de puntos y la malla se generan sin ningún problema pero quiero adicionarle color al modelo. Si tuviera el color de cada punto (RGB), ¿cómo haría para ingresar esta información a Rhinoceros?. Cualquier sugerencia, por favor me la haces llegar a mi correo and.reto@hotmail.com. Gracias.

    ResponderEliminar
  17. Para ingresar la información de color RGB a Rhinoceros deberas hacerlo de la misma manera, es decir, desde un archivo de texto plano (o cualquier otro archivo en un formato aceptado por Rhinoceros), sin embargo, para obtener esa informacion de color (RGB) de cada punto deberas encontrar un método que el digitalizador tridimensional que estes usando debe proveer, saludos

    ResponderEliminar
  18. buen post, buenos resultados obtenidos con renderizado obtenido con la implementación propia de este tipo de métodos, ojala puedas publicar más post al respecto.

    saludos

    ResponderEliminar
  19. haber doc para creerte lo que haces deja un fragmento de codigo especialmente con mallas

    ResponderEliminar
  20. Hola Anónimo, disculparás, ese código no se encuentra disponible en este momento y no se puede disponibilizar por ahora, lo cierto es que, para ser entendido, no se puede colocar un "fragmento", puesto que es un conjunto de clases.

    El trabajo lo realicé cuando estaba en pre-grado y fue parte de un evento en el que participe, no es necesario colocar el código para que "me creas".

    saludos

    ResponderEliminar

Bienvenido a jcGeorge's Blog!!!

Por favor deja tu comentario, consulta o sugerencia, procura mantener habilitado tu perfil de Blogger o deja un enlace a tu blog o web.

Gracias por leer este blog!!!

Related Posts Plugin for WordPress, Blogger...