Superficie en malla con asignación del valor de Z

Resultado del ejercicio

El ejercicio consiste en hacer una superficie de 100 x 100 teselas cuadradas, asignando a cada vertices un valor de Z según una función que depende del valor de X e Y, en este caso z=sin((i-50)*(j-50)*0.01)*0.15 , donde i es el valor de X y j es el valor de Y.

El script que usamos es el siguiente, probado con la versión 2.64 de Blender. Si no conoce bien como correr un script python en Blender le recomiendo leer este ejercicio detallado Primeros pasos para usar un script python en Blender

import bpy from mathutils import * from math import * alturas=[] coords=[] faces=[] i=0 j=0 z=0 filas=100 columnas=100 def createMesh(name, origin, verts, edges, faces): # Create mesh and object me = bpy.data.meshes.new(name+'Mesh') ob = bpy.data.objects.new(name, me) ob.location = origin ob.show_name = True # Link object to scene bpy.context.scene.objects.link(ob) # Create mesh from given verts, edges, faces. Either edges or # faces should be [], or you ask for problems me.from_pydata(verts, edges, faces) # Update mesh with new data me.update(calc_edges=True) return ob ############# # Principal # ############# while i < filas: j=0 while j < columnas: z=sin((i-50)*(j-50)*0.01)*0.15 coords.append([j*0.1,i*0.1,z]) j=j+1 i=i+1 a=0 i=0 j=0 while i < filas-1: j=0 while j < columnas-1: cara=[] cara.append(a+i+j) cara.append(a+i+j+1) cara.append(a+i+j+columnas+1) cara.append(a+i+j+columnas) faces.append(cara) j=j+1 a=a+columnas-1 i=i+1 # creamos la superficie en base a los vertices # y las caras calculadas anteriormente ob1=createMesh('Alfombra',(0,0,0),coords,[],faces) ob1.select = True bpy.ops.transform.translate(value=(-5,-5,0))

Como siempre comenzamos importando la librería bpy con import bpy, también importamos la librería mathutils y la librería math, que precisamos para el calculo del seno en Z.

Luego hacemos un while en i y dentro de este un while de j de este modo generamos los valores X,Y,Z de las coordenadas de cada vertice, en nuestro caso 100 x 100 y los vamos cargando en la lista coords (inicialmente declarada como lista vacía coords=[] )

Una vez cargados todos los vertices en la lista coords, procedemos a cargar los 4 puntos de cada cara en la lista vacía faces declara así faces=[] Se hace notar que se utiliza una lista auxiliar llamada cara, que reutilizamos cada vez, esto se hace porque los puntos que definen una cara, se incorporan como una lista. Es decir que faces es una lista de listas de cuatro elementos.

En este ejercicio hemos incorporado una nueva definición createMesh, que hemos tomado de este sitio < Dev:2.5 | Py | Scripts | Cookbook | Code snippets | Meshes , que utilizamos en esta sentencia

ob1=createMesh('Alfombra',(0,0,0),coords,[],faces)

Luego con esta sentencia

bpy.ops.transform.translate(value=(-5,-5,0)) trasladamos la superficie para centrarla en el origen, fijarse que en esta sentencia hemos multiplicado por 0.1 de modo que en vez de 100 unidades tenemos 10 unidades por lado de la superficie, de ese modo basta trasladar en X -5 y en Y -5 para que nos quede centrada en el origen la superficie.

Cualquier duda o dificultad que Usted tenga al realizar este ejercicio, la escribe en forma de carta a marioantonio.herreromachado at gmail.com, . Si tiene alguna inquietud o duda no cubierta por este ejercicio también lo comenta y lo incluiremos en esta página u otra si fuera necesario. Gracia por su visita.

Mario Antonio Herrero Machado