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