Skip to content

Instantly share code, notes, and snippets.

@zeffii
Created September 18, 2015 08:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zeffii/cdcd9380227edc697657 to your computer and use it in GitHub Desktop.
Save zeffii/cdcd9380227edc697657 to your computer and use it in GitHub Desktop.
import bpy
from math import floor
scalar_z = 2.3
scalar_xy = 0.2
def generate_face_keys(num_x, num_y):
faces = []
verts_per_side_x = num_x
for i in range((num_x - 1) * (num_y - 1)):
x = (i % (num_x - 1))
y = floor(i / (num_x - 1))
level = x + (y * verts_per_side_x)
idx1 = level
idx2 = level + 1
idx3 = level + verts_per_side_x + 1
idx4 = level + verts_per_side_x
faces.append([idx1, idx2, idx3, idx4])
return faces
def geometry_function(image_name):
img = bpy.data.images[image_name]
num_x = w = img_width = img.size[0]
num_y = h = img_height = img.size[1]
# work on copy only
pxls = img.pixels[:]
num_pixels = int(len(pxls) / 4)
verts = []
add_vertex = verts.append
# generator expression
gen_obj = (i for i in pxls)
for idx in range(num_pixels):
y = int(idx / w) * scalar_xy
x = (idx % w) * scalar_xy
r = next(gen_obj)
g = next(gen_obj)
b = next(gen_obj)
a = next(gen_obj)
# height-map, would be grayscale, so z can be set to r*scalar
z = r * scalar_z
add_vertex((x, y, z))
faces = generate_face_keys(num_x, num_y)
return verts, faces
def generate(func, image_name, geometry_name):
verts, faces = func(image_name)
mesh = bpy.data.meshes.new(geometry_name + "_mesh")
mesh.from_pydata(verts, [], faces)
mesh.update()
obj = bpy.data.objects.new(geometry_name, mesh)
bpy.context.scene.objects.link(obj)
obj.select = True
obj.show_bounds = True
generate(geometry_function, "arch_00MMM.png", "3d_Surface_Object")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment