Graficador con VRML y Python
Computación Científica
Facultad de Ciencias Matemáticas
Universidad Nacional Mayor de San Marcos
22 de octubre de 2010
Resumen
El presente trabajo es una aplicación educativa usando VRML y Python para el curso de Computación Gráfica. Se desarrollo en Linux.
Abstract:
En el presente trabajo mostramos una aplicación usando VRML y Python.
1 Introducción
VRML permite, entre otros objetos, dibujar pequeños planos, o ``faces'', especificando cuatro puntos en el espacio. Por otro lado, la gráfica de una superficie se puede aproximar por medio de pequeños planos. En este proyecto usamos ``faces'' de VRML para aproximar la gráfica de una superficie.2 Herramientas
Para la realizacion del proyecto se usaron las siguientes herramientas.2.1 Ubuntu
El proyecto se desarrollo en Ubuntu 10.4, que es una distribución Linux basada en Debian GNU/Linux que proporciona un sistema operativo actualizado y estable.2.2 Python
El proyecto es basicamente un programa hecho en Python. Python es un lenguaje de programación creado por Guido van Rossum a principios de los años 90. Es un lemguaje similar a Perl, pero con una sintaxis muy limpia y que favorece un código ligible.Se trata de un lenguaje interpretado o de script, con tipado dinámico, fuertemente tipado, multiplataforma y orientado a objetos.
2.3 VRML y BS Contact
Para mostrar el resultado se uso el lenguaje VRML(sigla del inglés Virtual Reality Modeling Language - Lenguaje para Modelado de Realidad Virtual) y BS COntact. El lenguaje VRML posibilita la descripción de una escena compuesta por objetos 3D a partir de prototipos basados en formas geométricas básicas o de estructuras en las que se especifican los vertices y las aristas de cada polígono tridimensional y el color de su superficie. BS Contact es un software 3D para la visualización de modelos escritos en lenguajes VRML y X3D. BS Contact VRML/X3D permite la visualización de aplicaciones de Realidad Virtual y Realidad Aumentada a través de la integración de tecnología 3D interactiva en tiempo real.3 Contrucción
En VRML el nodo IndexedFaceSet especifica un conjunto de caras planas en el sistema de coordenadas locales. Entonces, la idea es construir, a partir de caras planas, una superficie determinada por una función de la forma f ( x , y ) = z
3.1 Funciones dentro del módulo graficador
3.1.1 Función copia()
Copia el contenido del archivo plantilla.wrl en en el archivo graficoVRML.wrl . De esta manera, el archivo gracficoVRML.wrl queda listo para contener las coordenadas de una nueva gráfica.3.1.2 Función graficar(lambda x,y:f(x,y),a,b,c,d,n,m)
Donde a,b,c,d son tal que a3.1.3 Función mostrar()
Abre el archivo graficoVRML.wrl con BS Contact.3.2 Como funciona
La función graficar recibe los parámetros. Crea una lista LX y una lista LY, que representan las particiones sobre el eje x y el eje y respectivamente. Luego calcula el valor de la función en cada par coordenado y lo guarda en la lista LZ. La lista LZ viene a comportarse como una matriz.Llamomos a la función copia() para limpiar el archivo graficoVRML.wrl .
Luego abre el archivo graficoVRML.wrl para comenzar a escribir en este.
Shape{
appearance Appearance{
material Material{
diffuseColor 0 0.5 0.5
emissiveColor 0 0.2 0.15
transparency 0.5}}
geometry IndexedFaceSet{
coord Coordinate{point[
Comenzamos creando el nodo Shape ,especificando el material y el IndexedFaced.
Escribimos las coordenadas de todos los puntos de la gráfica en point
Agrupamos los puntos y los escribimos en coorIndex.
Llammos a la función mostrar() para vizualizar la gráfica.
4 Ejecución
1.-Pegamos la carpeta GRAFICADOR el escritorio, abrimos un terminal y nos situamos en la carpeta.2.-Para entrar en la consola interactiva escribimos python. En este caso utilizamos iPython para la sesión interactiva.
3.-Importamos el modulo graficador.
4.-Introducimos la función a graficar y los parametros en la función graficar. La función la escribimos anteponiendo lambda x,y:f(x,y).
5.-Presionamos enter y visualizamos la grafica del paraboloide.
Código 1: graficador.py
import os
import math
def graficar(fun,a,b,c,d,n,m):
a=float(a); # x inf
b=float(b); # x sup
c=float(c); # y inf
d=float(d); # y sup
m=int(m);
n=int(n);
LX=[]
LY=[]
g=(d-c)/m
h=(b-a)/n
#mallado x
for i in range(0,n+1):
LX.append(a+i*h)
#mallado y
for j in range(0,m+1):
LY.append(c+j*g)
#LZ=[Lb(0),Lb(1),Lb(2),..,Lb(m)]
#Y_k1 : X_k2_0,.....,X_k2_n
LZ=[]
Lb=[]
for k1 in range(0,m+1):
for k2 in range(0,n+1):
fx=LX[k2]
fy=LY[k1]
Lb.append(fun(fx,fy))
LZ.append(Lb)
Lb=[]
copia()
inp=open("graficoVRML.wrl","a")
inp.write("Shape{appearance Appearance{material Material{"+\
"diffuseColor 0 0.5 0.5 emissiveColor 0 0.2 0.15 transparency 0.5"+\
"}}geometry IndexedFaceSet{coord Coordinate{point[")\
for k1 in range(0,m+1):
for k2 in range(0,n+1):
cad=str(LX[k2])+' '+str(LY[k1])+' '+str(LZ[k1][k2])+','
inp.write(cad+' ')
num=''
for j1 in range(1,m+1):
num=num+' '
for i1 in range(1,n+1):
ca=str(i1-1+(j1-1)*(n+1))+','+str(i1+(j1-1)*(n+1))+','+\
str(j1*(n+1)+i1)+','+str(j1*(n+1)+i1-1)+','+'-1,'
num=num+ca+' '
inp.write(']} coordIndex ['+num+'] solid FALSE } }')
inp.close()
mostrar()
def copia():
inp=open("plantilla.wrl","r")
outp=open("graficoVRML.wrl","w")
for linea in inp.readlines():
outp.write(linea)
inp.close()
outp.close()
def mostrar():
os.system('./bscontact graficoVRML.wrl')
Código 2: plantilla.wrl
#VRML V2.0 utf8
#PLANTILLA PARA EL GRAFICADOR
Background {
skyColor [0 0 0, 0 1 0, 1 1 1]
}
#____________________EJES_COORDENADOS_______________
Shape {
geometry IndexedLineSet {
coord Coordinate {
point [5 0 0,-5 0 0,0 5 0,0 -5 0,0 0 5,0 0 -5]}
coordIndex [0,1,-1,2,3,-1,4,5,-1]
color Color {
color [ 1 0 0,0 0 0,0 0 1]}
colorIndex [0,1,2]
colorPerVertex FALSE }
}
#____________________________________________________
Bs Contact: Lo puedes descargar de la página oficial.
Bibliography
- 1
- Python para todos.Raúl González Duque. http://mundogeek.net/tutorial-python/
No hay comentarios:
Publicar un comentario