jueves, 15 de julio de 2010

¿3D en C?

Cualquier persona puede creer que hacer gráficos en 3 dimensiones, programando en C, es algo absurdo e innecesario. Pero, realmente es algo útil, pues con el mas simple ejemplo de rotar un cubo, tenemos que aplicar operaciones con 8 vértices a la vez, ala par de controlar zonas visibles, etc.

Y ya que hablábamos del cubo, vamos a poner ejemplos, en primer lugar, con un cubo.

Antes de empezar, decir que trabajamos con la cabecera graphics.h desde Borland C++ 3.1 (No es estándar, desgraciadamente).

Una vez tengamos el entorno preparado, debemos clasificar nuestro programa en 2 partes: Operaciones y database.

En operaciones, evidentemente, haremos las operaciones básicas del cubo, crearlo, moverlo, etc.

En database, almacenaremos los distintos valores que necesitemos: En el caso de un cubo, nos sobra con las posiciones de los vértices. Si deseamos crear movimiento en el cubo, necesitamos que nuestros datos sean completamente accesibles (No usar constantes) y a ser posible, poder acceder lo mas rápidamente a ellos. Por ello, una de las mejores es crear estructuras para cada uno de los objetos (No confundir con objetos de POO).

Por lo cual, para dibujar un cubo, necesitaremos mínimo 8 vértices, los cuales podemos crear de esta forma:

typedef struct vertices
{
int ver0;
int ver1;
int ver2;
int ver3;
int ver4;
int ver5;
int ver6;
int ver7;
} vertices;


También podríamos crearlo con punteos para optimizar el rendimiento. Y para los mas vagos, podemos crear solamente un vector de la siguiente forma:

int vertices[8];
Tras definir esta parte (la base de datos para el objeto) debemos pasar a construirlo. Para ello debemos distinguir 2 partes, el cuadrado superior y el inferior.

Al superior, le corresponden los vértices del 0 al 3, y al inferior, del 4 al 7.



Para dibujarlo, nos basta con usar la función line. Una línea del vértice 0 al 1 y del 0 al 2. Por igual, otra del 3 al 2 y del 3 al 1. La misma operación con el cuadrado inferior. Para terminar el cubo, faltan 4 líneas, uniendo los vértices: Del 0 al 4, del 2 al 6, del 1 al 5 y del 3 al 7.

Una vez formado, podemos modificar su forma, o moverlo, modificando los valores sobre la base de datos, pero, ¿Cómo hacemos para eliminar la parte oculta?


Métodos de Espacio-Objeto

Hay varios métodos para eliminar las "Partes traseras" de nuestros objetos. Y es que, como comprenderéis, no es necesario mantener algo que no vemos.

Método 1: Preclasificación Radial: El mas sencillo, si conocemos con adelanto la dirección desde la cual será visto el objeto, el programa solo creará las partes visibles.

Pros: Ahora memoria y optimiza la velocidad.
Contras: Incapacidad de rotar y ver el objeto desde otros ángulos de visión.

Método 2: Clasificación Radial: El programa determina que partes son visibles y cuales no, dependiendo del ángulo de visión. Esto se calcula, generalmente (Aunque no únicamente) con la posición de los vértices.

Pros: Rápida ejecución.
Contras: Hace demasiado uso de la base de datos, lo que puede llegar a ser pesado.

Método 3: Ecuación del plano: Utilizando el producto vectorial, es posible determinar la posición de los planos, por lo que el programa puede determinar que parte mostrar y cual no.

Pros: Hace poco uso de la base de datos.
Contras: Es mas lento, respecto a los 2 otros métodos.

Por lo tanto, qué método es mejor para ocultar las superficies no visibles de un cubo?

Dependiendo de si lo vamos a rotar:

Si no queremos rotarlo: Evidentemente, la preclasificación radial, optimiza la memoria y la db.

Si queremos rotarlo: Una mezcla de la clasificación radial y la ecuación de plano puede ser bastante óptimo: En vez de tomar como valor el producto, podemos usar la posición de los vértices para determinar lo oculto y lo visible.

En futuras entradas, explicaré métodos de rotación y distintos objetos.

4 comentarios:

  1. Como me gustaría poder entender todo esto tío...

    ResponderEliminar
  2. esto se podra hacer solo con c, no C++... ?
    sin librerias open gl ni sdl, etc.

    ResponderEliminar
  3. Si quereis implementar graficos en c++ rapido y facil usar la glut, os la podreis enlazar desde el nuevo proyecto de varios profesores de la UPm llamado biicode ..sinceramente yo fui alumno de ellos y no me llevo nada por decirlo pero os la recomiendo ..y sino tiempo al tiempo oireis hablar de ello en el futuro

    ResponderEliminar