Mauricio Emilio Gomez - mgomez1974

Doris Evolution

Pagina Principal  Mauricio Emilio Gomez Sanabria 

Laboratorios correspondientes a la Materia de Introduccion a la Realidad Virtual y la Telepresencia en Bogotá - Colombia.

La ayuda en linea de doris es:

http://lua-users.org/files/wiki_insecure/users/ntrout/doris.html

En esta  pagina se publica por primera vez el codigo modificado del Original Doris con el cual resulto Doris Evolution.  A partir de este código se puede interactuar con mundos virtuales de Realidad Virtual logrando desarrollar dispositivos de captura de movimiento.

El codigo fuente para ser compilado en visual c++ lo puede descargar de  aqui . Bueno proximamente ;), o si quiere me escribe y se lo adelanto jeje.

Desarrollando en Doris sin ningún tipo de acceso a puertos:

  • Con este instalador usted podra ver una buena demostración realizada con doris evolution
  • La aplicación automaticamente instalara este archivo:  glut32.dll en c:/windows/system32
  • La aplicación automaticamente instalara este archivo: libmysql.dll en c:/windows/system32 
  • Paso 2:  Baje estos ejemplos de doris Evolution funcionando sin acceso a puertos ni a hardware especial para familizarse con Doris Evolution y todas las nuevas funciones incorporadas al Doris Original..
  • Este ejemplo se ejectuta mendiante presentacion_UMB.bat y consiste en una presentacion 3D de diapositivas.

Para trabajar en doris con acceso a puerto paralelo  en windows XP deben hacer los siguientes pasos:

  • Paso O:  Coloque la libreria glut32.dll en la carpeta c:/windows/system32
  • Paso 1:  La estructura que se plantea para el funcionamiento de Doris Evolution consiste en colocar todo en c:/EXOCAP,
  • Paso 2: Luego dentro se coloca una carpeta llamada "/Doris" (dentro de exocap).  En esta encontramos el programa ejecutable de Doris Evolution: Lo hay en dos sabores: Version con manejo del puerto paralelo   Doris.exe y sin manejo del puerto paralelo:  Doris_sin_io.exe  Si usted no es el administrador de la maquina en la que esta trabajando le recomiendo el sabor sin puertos.
  • Como se puede ver en la pagina original de Doris, este es un interprete de lua, por lo que todas las aplicaciones realizadas en Doris son *.lua

Nota:  Cabe aclarar que si usted trata de ejecutar Doris.exe en windows 98 no hay ningun problema pero en windows xp seguramente no le funcionara y obtendra un mensaje malevolo del sistema operativo que le indicara que la aplicación a dejado de funcionar y la razon es muy simple,  el hardware que se ha desarrollado para Doris Evolution tiene acceso al puerto paralelo y windows XP no permite accesar a dicho puerto por seguridad. Es por esa razon que le deje la opcion de Doris_sin_io.exe, Esta version seguro le funcionara sin mayores problemas.

Mis documentos/exocap/ejemplos

Paso 3: Ejecute dentro de la carpeta ejemplos  hierarchy.bat

Y ahora si le funciono si podemos comenzar a estudiar Doris Evolution.

 

Para el funcionamiento de doris con puertos y acceso a hardware siga los siguientes pasos:  

  • Estar en modo administrador en la maquina que queremos manejar
  • Paso 1:  Ahora si quiere poner a funcionar Doris.exe debe utilizar la aplicacion allowio.rar de porttalk.  Con esta utilidad usted puede accesar al puerto paralelo, siempre y cuando el Firewall de XP este abajo.
    De este deben salir tres archivos:
     
    AllowIo.exe  Este es el ejecutable que debe estar en la carpeta /doris
     
    PORTTALK.reg este se debe ejecutar para que altere el registro de windows y permita la ejecucion del programa para dar acceso a los puertos
    PORTTALK.sys este debe estar en C:\WINDOWS\system32\drivers

Si le funciona, tonz tambien podemos comenzar por aqui.

Laboratorio 1: 

Construccion de la tarjeta digitalizadora diseñada por Mauricio Gomez y Daniel Barrero. con el chip MCP3008.  tarjetaMCP3008.JPG

Laboratorio 2: 

Primer laboratorio de integracacion de Doris Evolution con Hardware MCP3008. Diseño de un detector de luz e incrustado dentro de Doris Evolution.

Funcion de Doris Evolution para activar y leer el hardware

canal = {}
canal[1]=0
canal[2]=0
canal[3]=0
canal[4]=0
canal[5]=0
canal[6]=0
canal[7]=0
canal[8]=0

                LeerCanales(canal)
                 glPushMatrix()
                    glScale(canal[1]*0.02,1,1)
                    glutSolidCube(1)
                glPopMatrix()

En el caso de querer correr doris.exe con puertos recuerde que la estructura del .bat es:

..\doris\allowio ..\doris\doris.exe archivo.lua /a

Estos dos archivos demostraron el correcto funcionamiento de la tarjeta dentro del laboratorio, con doris + hardware

light.lua

light.bat

Minimanual de lua - Manual de lua 

Definitivamente para aprender lua la primera pagina que se debe consultar es esta, dar click aqui.

Como ejemplo de doris Evolution doris.rar puede darle click a este ejemplo y bajarlo, mundo_red.rar y mide mas o menos 3.5 megas

Para trabajar en un editor decente de lua le recomiendo bajar El editor libre  Scite http://scintilla.sourceforge.net/SciTEDownload.html 

Cuando usted baje este codigo para cambiarlo lo primero que debe abrir es mundo_red.lua.

Dentro de algunas partes del cógido usted encontrara la instruccion "dofile", usted debe interpretar esta linea como una inserción de código dentro de otro, es para poder organizarlo correctamente.

La forma de declarar una variables en lua es simplemente utilizandola:
variable1=1+2
en el ejemplo anterior la variable1 quedo instanciada y queda funcionando mientras que se conserve el ambito igual que en c++, yo particularmente para ahorrarme el asunto del ambito coloco la variable al principio del código y la inicializo, de esta manera es valida en cualquier parte del mismo.

 

Como se puede ver en el siguiente codigo queda la estructura de un brazo de realidad virtual con codigo hecho en lua:

EstablecerFiltro(filtro)  

  • Con esta funcion establecemos el filtro que se hace por software.  Se hace una pila de datos de forma que se van tomando medidas analogas del mundo real y a manera de una pila el primer dato en entrar es el ultimo dato en salir y el resultado de la lectura de puerto se convierte en un promedio de la cantidad de datos que se le pase como parametro a esta funcion, por ejemplo:
    Digamos que el filtro esta en 5, cuando leamos el puerto tendremos:
          Dato1: 4.0
          Dato2: 4.1
          Dato3: 4.2
          Dato4: 4.3
          Dato5: 4.4
    Cuando por ejemplo se utilize la funcion
       
    "glRotateADC(5,-1,rotate01,0,1024,0,1,0)"
    el valor de la rotación sera:  (4.0+4.1+4.2+4.3+4.4)/5=4.2
    Esto metera un poco de latencia dentro de la animación tridimensional pero tambien disminuira el ruido.  Continuando con el codigo para modelar un brazito 3D con captura de movimiento en lua tenemos:

glPushMatrix();
            glTranslate(0*cons,0*cons,0*cons)   
            glRotateADC(5,-1,rotate01,0,1024,0,1,0) --

  • Con la funcion glRotateADC se puede hacer una lectura de la tarjeta de adquisicion de datos y aplicar la medida directamente como una rotación, en este caso se ha implementado con los valores:
    glRotateADC(canal, por,mas,limiteinferior,limitesuperior,x,y,z)
    Donde los datos significan:
    Canal:  Canal que se quiere digitalizar en el momento
    por y mas son valores que se le pueden colocar a una medida analoga de manera que
    Valor de rotación = Valor leido * por + mas, de manera que si se quiere que el angulo cambie mas rapido o mas despacio  se utiliza la variable por ( si el valor es uno pues cambia a velocidad real) mientras que el punto en el que se quiere que arranque la numeracion es la variable mas, de manera que si mas es 0 la rotación comienza en el valor que este entregando el digitalizador en ese momento.


            glPushMatrix() -- jump into new frame
            glRotate(-90,1,0,0)
            glScale(escala01,escala01,escala01*0.80)
             Importar3DS("c:/exocap/brazo_aluminio_08_2006/2_3.3ds",1)

  • Esta funcion se encarga de importar los modelos realizados en 3DStudioMax a Doris Evolution.  el primer varlor es un string que representa la ubicación del archivo con todas sus texturas y el segundo valor es un contador manual de la respectiva importación.  Si hay dos funciones con el mismo número de importación se perdera el ultimo de los objetos. 

            glPopMatrix()
            glTranslate(0*cons,24*cons,0*cons)
            glTranslate(lado02*cons,0*cons,0*cons)
            glRotateADC(4,1,rotate02,0,1024,1,0,0) --canal, por,mas,limiteinferior,limitesuperior,x,y,z
            glTranslate(0*cons,0*cons,57*cons)
            glPushMatrix() -- jump into new frame
            glRotate(90,1,0,0)
            glScale(escala01,escala01,escala01)
             Importar3DS("c:/exocap/brazo_aluminio_08_2006/2_3.3ds",2)
            glPopMatrix()
            glTranslate(0*cons,0*cons,30*cons)
            glTranslate(lado03*cons,0*cons,0*cons)
            glRotateADC(3,-1,rotate03,0,1024,1,0,0) --canal, por,mas,limiteinferior,limitesuperior,x,y,z
            glPushMatrix() -- jump into new frame
            glRotate(90,1,0,0)
            glScale(escala01,escala01,escala01)
             Importar3DS("c:/exocap/brazo_aluminio_08_2006/2_4.3ds",3)
            glPopMatrix()
            glTranslate(0*cons,0*cons,30*cons)
            glTranslate(lado04*cons,0*cons,0*cons)
            glRotateADC(2,1,rotate04,0,1024,1,0,0) --canal, por,mas,limiteinferior,limitesuperior,x,y,z
            glPushMatrix() -- jump into new frame
            glRotate(90,1,0,0)
            glScale(escala01,escala01,escala01)
             Importar3DS("c:/exocap/brazo_aluminio_08_2006/2_5.3ds",4)
            glPopMatrix()
            glTranslate(0*cons,0*cons,9.5*cons)
            glTranslate(0*cons,lado05*cons,0*cons)
            glTranslate(lado06*cons,0*cons,0*cons)
            glRotateADC(1,-1,rotate05,0,1024,0,1,0) --canal, por,mas,limiteinferior,limitesuperior,x,y,z
            glPushMatrix() -- jump into new frame
            glRotate(90,1,0,0)
            glScale(escala01,escala01,escala01)
             Importar3DS("c:/exocap/brazo_aluminio_08_2006/2_6.3ds",5)
            glPopMatrix()
            glTranslate(0*cons,0*cons,14.5*cons)
            glColor(255,0,0,1)
            glutSolidSphere(0.1,7,7);
            glTranslate(-10*cons,-10*cons,-10*cons)
            glTranslate(0*cons,0*cons,30*cons)
            glMatrixMode(GL_MODELVIEW)
            glGet1(GL_MODELVIEW_MATRIX,m)

  • Para recuperar el valor de la matriz en un momento determinado OpenGl y Doris entregan la funcion glGet1 que es la encargada de retornar los valores en los que se encuentra en ese momento la matrix de transformación recuperando así por ejemplo el valor x,y,z en coordenadas del mundo que tenga un objeto determinado en ese momento. 

            a=m[0]+m[4]+m[8]+m[12]
            b=m[1]+m[5]+m[9]+m[13]
            c=m[2]+m[6]+m[10]+m[14]
            d=m[3]+m[7]+m[11]+m[15]

  • Luego se suman los valores de la matriz como se indica y finalmente se hace la siguiente operación:

                m_Translate_X_capturado=(a/d)
                m_Translate_Y_capturado=(b/d)
                m_Translate_Z_capturado=(c/d)
                m_Translate_X_capturadoAux=m_Translate_X_capturado
                m_Translate_Y_capturadoAux=m_Translate_Y_capturado
                m_Translate_Z_capturadoAux=m_Translate_Z_capturado
                if (escanear==1) then
                Escribir_Coordenadas(    "coordenadas3dB.txt",
                                m_Translate_X_capturado,
                                m_Translate_Y_capturado,
                                m_Translate_Z_capturado,
                                m_Translate_X_capturado_ant,
                                m_Translate_Y_capturado_ant,
                                m_Translate_Z_capturado_ant)
  • Con la funciono Escribir_Coordenadas se puede escribir un archivo plano con 6 valores flotantes en linea separados por coma para ser utilizado como mejor se quiera.  En este caso para guardar las coordenadas de la punta del brazo.
     

                                escanear=0
                                end
                               

    glPopMatrix();
     

Si lo que usted quiere es poner a funcionar el teclado para controlar una camara o un objeto en Doris le recomiendo que copie el siquiente codigo: 

  • Como puede observar el código original de Doris a sido modificado para que las teclas F1, F2, ... F12, las flechas, PageUp y Page Down y todas las teclas especiales funcionen correctamente, de manera que al colocarle los siguientes valores al archivo *.lua estos valores queden funcionando correctamente:

GLUT_KEY_F1=1+1000
GLUT_KEY_F2=2+1000
GLUT_KEY_F3=3+1000
GLUT_KEY_F4=4+1000
GLUT_KEY_F5=5+1000
GLUT_KEY_F6=6+1000
GLUT_KEY_F7=7+1000
GLUT_KEY_F8=8+1000
GLUT_KEY_F9=9+1000
GLUT_KEY_F10=10+1000
GLUT_KEY_F11=11+1000
GLUT_KEY_F12=12+1000
--/* directional keys */
GLUT_KEY_LEFT=100+1000
GLUT_KEY_UP=101+1000
GLUT_KEY_RIGHT=102+1000
GLUT_KEY_DOWN=103+1000
GLUT_KEY_PAGE_UP=104+1000
GLUT_KEY_PAGE_DOWN=105+1000
GLUT_KEY_HOME=106+1000
GLUT_KEY_END=107+1000
GLUT_KEY_INSERT=108+1000
GLUT_KEY_DELETE=127

Para hacer los videos:  camtasia o captivate