miércoles, 31 de agosto de 2011

Humanoide con esqueleto y posando

En las siguientes imágenes se encuentra el modelo humanoide con su esqueleto bien definido en la ventana de blender 2.59.




En los cuadros de abajo se presentan algunas poses hechas rápidamente con el esqueleto asignado, hay algunos errores en los hombros eso debido a que falta aun este par de huesos y algunos pivotes también.




De aquí en adelante a realizar animaciones para que sean asignadas en los engines que se quiera. Hay una excelente pagina con excelentes tutoriales, la cual me parece muy buena por eso, dejo el link abajo.



jueves, 25 de agosto de 2011

Humanoide en Ogre3D

Ahora pongo un vídeo y una fotos desde distintos lugares de el modelo humanoide en el motor Ogre 3D.
Para el bump mapping se usan shaders creados en CG.

Enseguida el vídeo:

Algunas Fotos:





Esto es todo, próximamente humanoide animado.


miércoles, 17 de agosto de 2011

Ejecutando y compilando programas CG

En este post coloco el código para ejecutar el sencillo ejemplo de cambiar el color.
Para comenzar creamos un widget que contenga opengl.
El header es:

#ifndef QGLWIDGET_H_INCLUDED
#define QGLWIDGET_H_INCLUDED
#include <QtOpenGL/QGLWidget>
#include <Cg/cg.h>
#include <Cg/cgGL.h>


class Glwidget : public QGLWidget     //hereda de QGLwidget
{
    public:
    Glwidget(QWidget *parent=0);
    ~Glwidget();
    protected:
   //funciones a sobrescribir de opengl
    void initializeGL();
    void paintGL();
    void resizeGL(int,int);
    private:
    //Miembros de CG
    CGcontext contexto;
    CGprofile perfil;   //para crear el perfil dependiendo de la api y la gpu
    CGparameter modelViewMatrix;  //parámetro para ingresar
    CGprogram programa;
};

Ahora el archivo cpp. qglwidget.cpp es:

#include <QtGui>
#include "qglwidget.h"
#include <iostream>
//Estos includes siguientes son necesarios para utilizar code-completion de codeblocks sin problemas
#include <GL/gl.h>
#include <GL/glu.h>


//función para el manejador de errores
void MyErrorHandler(CGcontext contexto, CGerror error, void *data) {
    CGcontext alf=cgCreateContext();
    if(contexto!=NULL){//para arreglar un problema de salida del programa
    alf=contexto;}
    const char *lastListing = cgGetLastListing(alf);
    qDebug() << (lastListing == 0 ? "No error." : lastListing);
}


Glwidget::Glwidget(QWidget *parent){};
Glwidget::~Glwidget(){
    cgDestroyProgram(programa);
    cgDestroyContext(contexto);
    cgDestroyParameter(modelViewMatrix);
}


void Glwidget::initializeGL(){
    contexto=cgCreateContext();
  //Creamos un manejador de errores con la función MyErrorHandler es muy útil utilizarlo para 
   // encontrar los errores facilmente en el archivo CG.
    cgSetErrorHandler(MyErrorHandler,NULL);
    //Se crea el perfil a partir de la ultima versión soportada por nuestra GPU.
    //Este es simplemente un Vertex shader, para hacer shaders mas realistas es necesario
    //utilizar también pixel shaders y para eso poner CG_GL_FRAGMENT
    perfil= cgGLGetLatestProfile(CG_GL_VERTEX);
    cgGLSetOptimalOptions(perfil);
//mi archivo cg se llama simplemente red.cg únicamente cambia el color del polígono.
//mainv es la función principal en nuestro programa.
    programa = cgCreateProgramFromFile(contexto,CG_SOURCE,"red.cg",perfil,"mainv",NULL);
    cgGLLoadProgram(programa);
    //Relacionamos nuestro parámetro a la variable literalmente de nuestro programa en cg
    modelViewMatrix = cgGetNamedParameter(programa, "ModelViewProj");
    glShadeModel(GL_SMOOTH); 
    glClearColor(0.0,0.0,0.0,0.0);
    glClearDepth(1.0f); // Depth buffer setup
    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LEQUAL); 
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // R
}
void Glwidget::resizeGL(int width,int height){
    if (height == 0)
        height = 1;
    glViewport(0, 0, width, height); // Reset current viewport
    glMatrixMode(GL_PROJECTION); // Select projection matrix
    glLoadIdentity(); // Reset projection matrix
    gluPerspective (45.0f, (GLfloat)(width)/(GLfloat)(height),0.1f, 100.0f); // Calculate The Aspect Ratio
    glMatrixMode(GL_MODELVIEW); // Select modelview matrix
}
void Glwidget::paintGL(){
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glLoadIdentity(); 
     //las transformaciones siempre antes de aplicar el shader
     glTranslatef(0.0f, 0.0f, -5.0f);
    //ingresar nuestra matriz de proyección.
     cgGLSetStateMatrixParameter(modelViewMatrix, CG_GL_MODELVIEW_PROJECTION_MATRIX,        CG_GL_MATRIX_IDENTITY);
      //activamos el perfil y el programa.
     cgGLEnableProfile(perfil);
     cgGLBindProgram(programa);
    //Hacemos un sencillo cuadrado
    glBegin(GL_QUADS); 
        glVertex2f(0.7f,  0.7f); 
        glVertex2f(0.7f, -0.7f); 
        glVertex2f(-0.7f, -0.7f); 
        glVertex2f(-0.7f, 0.7f); 
       glEnd(); 
       cgGLDisableProfile(perfil);
       glFlush ();
}

creamos una archivo main.cpp con el siguiente código:

#include <iostream>
#include "qglwidget.h"  //el widget creado
#include <QApplication>
using namespace std;


int main(int argc,char *argv[])
{
    QApplication app2(argc,argv);
    Glwidget wid;
    wid.show();
    return app2.exec();
}
De esta manera podemos utilizar nuestro shader creado con CG.



martes, 16 de agosto de 2011

Un simple programa en CG

En este post pongo el codigo de un sencillo programa en cg llamado red.cg, lo pueden editar en codeblocks en File->new->File escogen Empty File y le ponen nombredearchivo.cg y listo para editarlo.

El programa para cambiar el color a rojo es el siguiente:

struct Salida{

  float4 position : POSITION;

  float4 color    : COLOR;

};

Salida mainv(uniform float4x4 ModelViewProj,float2 position : POSITION)
{
  Salida OUT;
  OUT.position = mul(ModelViewProj, float4(position, 0, 1));
  OUT.color    = float4(1, 0, 0, 1);  //poniendo el color en rojo
  return OUT;
}

El resultado es el siguiente:

Sin shader                                         Shader aplicado     
Este es un sencillo ejemplo. Para comenzar creo que esta bien.
Ahora a crear y desarrollar! .....


martes, 9 de agosto de 2011

Configurar CG en Codeblocks

Configuración de opengl en codeblocks con Qt para realizar las pruebas.

1. En Codeblocks agregar las librerias de opengl:
 
En settings->compiler and debugger en la pestaña Linker settings  agregar libopengl32.a y libglu32.a que     se encuentan en la carpeta lib de mingw y libQTOpenGL4.a que se encuentra en la carpeta lib de Qt.

2. Luego seguir los ejemplos de qt para opengl que se encuentran en assistant de qt y listo!

3. Es necesario incluir gl.h y glu.h en los archivos para poder utilizar code-completion de codeblocks.

Nota1: en el punto 2 adicionarlibQTOpenGL4.a para modo debug y release, No agregar la librería lógica para modo debug libQTOpenGLd4.a ya que genera problemas con qglwidget.



Configurando CG

1. bajar el cg toolkit de la pagina de nvidia(hay que registrarse).

2. En settings->compiler and debugger en la pestaña Linker settings la librerias de cg que se encuentran en la carpeta lib del cg toolkit estas son cg.lib que es para todos y cgGl.lib para opengl, para direct3d escoger la librería con la version del sistema.

3. En search directories agregar la ruta de include del cg, y en el archivo de opengl incluir cg.h y cgGl.h si se trabaja con opengl.

4. Los archivos cg se editan en codeblocks aunque no es posible utilizar code-completion ni nada por el estilo, codeblocks abre los archivos cg ya que estan relacionados con el entorno.

5. Para encontrar errores en los archivos cg es posible utilizar el compilador cgc.exe antes de ejecutar el programa, pero como la compilacion de los archivos cg viene en tiempo de ejecución yo prefiero utilizarlo de esta manera, en mi siguiente post pondre un ejemplo sencillo para poder iniciar.

Nota2: al adicionar las librerias e includes en settings->compiler and debugger estamos agragando estos elementos para todos los proyectos, si se quiere se puede adicionar esto a cada proyecto con click derecho sobre el proyecto y escogiendo Build options.

lunes, 1 de agosto de 2011

Instalar QT para Codeblocks

Primero que todo descargar las librerías de Qt para minGW ya que si se esta utilizando codeblocks es muy acertado utilizar las librerías de minGW para compilar. Las librerias se encuentran en: http://qt.nokia.com/downloads

Seguir los siguientes pasos:
1. Instalar las librerías preferiblemente en la unidad C: , D: etc.
2. En settings->compiler and debugger->Linker settings en link libraries adicionar:

     C:\Qt\4.7.3\lib\libQtGui4.a
     C:\Qt\4.7.3\lib\libQtCore4.a

3. En search directories adicionar
     C:\Qt\4.7.3\include
     C:\Qt\4.7.3\include\QtCore
     C:\Qt\4.7.3\include\QtGui

4. En settings->gloval variables new en el textbox poner el nombre, que puede ser: qt
    En base poner C:\Qt\4.7.3\
    En user-defined fields:
    Primer texbox  mkspecs
    Segundo texbox $(#qt)mkspecs
 
NOTA1: no olvidar agregar la carpeta C:\Qt\4.7.3\bin al path en las variables de entorno de windows ya que sin esto no podrán utilzar moc, qmake ni uic directamente.

Para utilizar el Qtdesigner es necesario lo siguiente:

1. crear el widget o window en el QTdesigner.
2. guardar el archivo en la carpeta de nuestro proyecto.
3. crear el header del archivo ui. Para crear el header en consola estando en el directorio del proyecto:
   uic nombrearchivo.ui -o nombrearchivo.h
4. incluir el archivo de cabecera donde sea necesario este sera el archivo generado con nombrearchivo.h
5. es necesario crear los makefiles y el archivo .pro para esto en consola estando en el directorio del proyecto. qmake -proyect y luego qmake.

NOTA2: Hay un error (undefined reference to `vtable for ') que se genera por utilizar la macro Q_OBJECT sin tener los archivos moc generados para eso:
En consola y en el directorio del proyecto:

1. Poner en consola moc nombrearchivo.h -o moc_nombrearchivo.cpp
2. Luego en el archivo nombrearchivo.cpp poner #include "include moc_nombrearchivo.cpp"

En este caso el archivo nombrearchivo utiliza la macro Q_OBJECT necesaria para utilizar signals y slots.