Implementación de un visor molecular con HOpenGL

18
Juan Antonio Chaves Naranjo Oscar Noel Amaya García Valentín Adolfo Acosta García

description

Implementación de un visor molecular con HOpenGL. Juan Antonio Chaves Naranjo Oscar Noel Amaya García Valentín Adolfo Acosta García. Índice. Motivaciones Herramientas para su desarrollo Estructuras de datos para manejo de modelos moleculares 3D Implementación Visor 3D molecular - PowerPoint PPT Presentation

Transcript of Implementación de un visor molecular con HOpenGL

Page 1: Implementación de un visor molecular con  HOpenGL

Juan Antonio Chaves NaranjoOscar Noel Amaya García

Valentín Adolfo Acosta García

Page 2: Implementación de un visor molecular con  HOpenGL

21/04/23UMA, Programación Declarativa Avanzada

Curso 08/09

1. Motivaciones2. Herramientas para su desarrollo3. Estructuras de datos para manejo de modelos

moleculares 3D4. Implementación Visor 3D molecular5. Comparación de código con visor similar en

lenguaje Imperativo (Tcl/Tk)6. Comparación rendimiento con visor similar en

lenguaje Imperativo (Tcl/Tk)7. Conclusiones8. Bibliografía

2/18

Page 3: Implementación de un visor molecular con  HOpenGL

21/04/23UMA, Programación Declarativa Avanzada

Curso 08/09

Elección del tema respondiendo a la curiosidad del uso de OpenGL en un lenguaje funcional.

Comparativa de uso/rendimiento de OpenGL en Haskell y en un lenguaje imperativo. En este caso usamos Tcl/Tk (John Ousterhout, 1999).

A priori no buscamos un fin educativo.

3/18

Page 4: Implementación de un visor molecular con  HOpenGL

21/04/23

Tcl/Tk Wrapper OpenGL Lenguaje Interpretado

4/18

Page 5: Implementación de un visor molecular con  HOpenGL

21/04/23UMA, Programación Declarativa Avanzada

Curso 08/095/18

Haskell (U. Yale y U. Glasgow, 1990)◦ Lenguaje funcional

OpenGL (Silicon Graphics Inc. 1992)◦ API gráfica multiplataforma y multilenguaje para

la modelización 2D y 3D. Orientado a lenguajes imperativos.

Haskell y OpenGL: HOpenGL (1999)◦ La eclosión de las mónadas hace que programas

en Haskell se comporten como los programas imperativos y por tanto facilita la interacción entre Haskell y OpenGL.

Page 6: Implementación de un visor molecular con  HOpenGL

21/04/23UMA, Programación Declarativa Avanzada

Curso 08/096/18

El estándar en representaciones moleculares son los ficheros “.mol”.

18 18 0 0 0 0 0 0 0 0 1 V2000 2.4333 -0.7208 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0

......... 3.1454 0.2032 -0.8617 H 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 0 0 0 0 .......18 6 1 0 0 0 0

Dichos datos son encapsulados dentro de una mónada IO para su posterior acceso en el visor 3D.

Nº de Átomos

Nº de Enlaces

Átomo de Carbono en la posición

definidaÁtomo de Hidrógeno en la posición definida

Define el enlace entre el átomo nº

18 y el 6

Page 7: Implementación de un visor molecular con  HOpenGL

21/04/23UMA, Programación Declarativa Avanzada

Curso 08/097/18

-- leerMol :: (Num a, Num b, … , Num d) =>-- [Char] -> IO (d,a,[((f,g,e),[Char])],[(c,b)]))leerMol nombreFichero = docad <- readFile nombreFicheroreturn (leerMol2 cad)

leerMol2 cad = (nAtomos, nEnlaces, atomos, enlaces)where

(l1,r1) = leeLínea cad(l2,r2) = leeLínea r1(l3,r3) = leeLínea r2(l4,r4) = leeLínea r3(nAtomos,nEnlaces) = leeNAtomNEnl l4(atomos,r5) = leeAtomos nAtomos r4(enlaces,r6) = leeEnlaces nEnlaces r5

Page 8: Implementación de un visor molecular con  HOpenGL

21/04/23UMA, Programación Declarativa Avanzada

Curso 08/098/18

Page 9: Implementación de un visor molecular con  HOpenGL

21/04/23UMA, Programación Declarativa Avanzada

Curso 08/099/18

main = do

(progName,_) <- getArgsAndInitialize

initialDisplayMode $= [ RGBMode, WithDepthBuffer, DoubleBuffered ]

initialWindowSize $= Size 500 500

createWindow "Visor Haskell + OpenGL"

depthFunc $= Just Less

clearColor $= Color4 0.1 0.2 0.4 0

shadeModel $= Smooth

position (Light 0) $= Vertex4 1 1 1 0

lighting $= Enabled

light (Light 0) $= Enabled

depthFunc $= Just Less

 

frontFace $= CW

lighting $= Enabled

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(500,500);

glClearColor(0.1,0.2,0.4,0);glShadeMode(GL_SMOOTH);

glEnable(GL_LIGHTING);

Page 10: Implementación de un visor molecular con  HOpenGL

21/04/23UMA, Programación Declarativa Avanzada

Curso 08/0910/18

light (Light 0) $= Enabled autoNormal $= Enabled normalize $= Enabled depthFunc $= Just Less fontOffset <- makeRasterFont listName <- iniciarDisplayListMol "aspirina.mol" pPos <- new (90::Int,270::Int,2.0)  keyboardMouseCallback $= Just (keyboard pPos)  displayCallback $= display pPos listName fontOffset reshapeCallback $= Just reshape  mainLoop

glutDisplayFunc(display);glutReshapeFunc(reshape);

Page 11: Implementación de un visor molecular con  HOpenGL

21/04/23UMA, Programación Declarativa Avanzada

Curso 08/0911/18

iniciarDisplayListMol fichero = do [listName] <- genObjectNames 1 defineList listName Compile $ do

(nAt,nEnl,atom,enl) <- leerMol ficheropintaAtomos atompintaEnlaces atom enl

return listName

listName=glGenList(1);glNewList(listName, GL_COMPILE);

Page 12: Implementación de un visor molecular con  HOpenGL

21/04/23UMA, Programación Declarativa Avanzada

Curso 08/0912/18

 display pPos listName fontOffset = do loadIdentity setPointOfView pPos clear [ColorBuffer,DepthBuffer] translate (Vector3 0.0 0.5 0.0 :: Vector3 GLdouble)

rotate 90 (Vector3 1.0 0.0 0.0 :: Vector3 GLdouble)

callList listName  swapBuffers

glLoadIdentity();glClearutReshapeFunc(reshape);

glTranslated(0.0,0.5,0.0);glRotated(1.0,0.0,0.0);

Page 13: Implementación de un visor molecular con  HOpenGL

21/04/23UMA, Programación Declarativa Avanzada

Curso 08/0913/18

Imperativo VS Funcional

Iteradores – F. RecursivasWrapers OpenGL

Estructuras especiales

Page 14: Implementación de un visor molecular con  HOpenGL

21/04/23UMA, Programación Declarativa Avanzada

Curso 08/0914/18

pintaEnlaces atom [] = do-- Posibles accionesreturn ()

pintaEnlaces atom ((id1,id2):xs) = dolet p1 = posAtomo id1 atomlet p2 = posAtomo id2 atom

let c = vectorSub p1 p2let long = vectorNorm clet ang = (vectorAngle (0,0,1) c) * 57.2957795131let (ex,ey,ez) = vectorCrossProduct (0,0,1) clet longSeg = long/2.0

let (tx,ty,tz) = vectorSum p1 (vectorScale 0.0 c)preservingMatrix $ do

translate (Vector3 tx ty tz :: Vector3 GLdouble)rotate ang (Vector3 ex ey ez)currentColor $= Color4 0 0 1 1materialAmbientAndDiffuse Front $= colorAtomo (simboloAtomo id1 atom)renderObject Solid (Cylinder' 0.07 longSeg 15 15)

ASIGNACIONES

ACCIONES SECUENCIALES

Page 15: Implementación de un visor molecular con  HOpenGL

21/04/23UMA, Programación Declarativa Avanzada

Curso 08/0915/18

let (tx,ty,tz) = vectorSum p1 (vectorScale 0.5 c)

preservingMatrix $ do

translate (Vector3 tx ty tz :: Vector3 GLdouble)

rotate ang (Vector3 ex ey ez)

materialAmbientAndDiffuse Front $= colorAtomo (simboloAtomo id2 atom)

renderObject Solid (Cylinder' 0.07 longSeg 15 15)

pintaEnlaces atom xs

return ()

LLAMADA RECURSIVA

Page 16: Implementación de un visor molecular con  HOpenGL

21/04/23UMA, Programación Declarativa Avanzada

Curso 08/0916/18

Lenguaje Imperativo Interpretado Vs

Lenguaje Funcional + Mónadas compilado

¿Qué pensáis?

Page 17: Implementación de un visor molecular con  HOpenGL

21/04/23UMA, Programación Declarativa Avanzada

Curso 08/0917/18

Amplia nuestros conocimiento de Haskell, que es uno de los objetivos de esta asignatura.

No nos resulta muy útil en comparación con los lenguajes imperativos:◦ Bajo rendimiento◦ Pocas ventajas en la programación◦ No parece ser el lenguaje de programación más

adecuado para el modelado 3D, como así lo demuestra el mercado.

Page 18: Implementación de un visor molecular con  HOpenGL

21/04/23UMA, Programación Declarativa Avanzada

Curso 08/0918/18

Material y documentación◦ http://www.haskell.org/haskellwiki/Opengl/ (2009)

Tutoriales◦ http://www.cin.ufpe.br/~haskell/hopengl/ (2002)◦ http://public.tfh-berlin.de/~panitz/hopengl/ (2003)

PFC – Oscar Noel Amaya García◦ http://www.lcc.uma.es (2007)