mesh fabrication

fabricating other objects

material slots

animation and fcurves

incorporating python libraries


shape keys

animating curve bevel


UV layers



video sequence editor (VSE)

images and textures

analytic geometry

node trees


import bpy
import math

class VertexAccumulator:
    # use this class when you can't come up with a good deterministic numbering scheme for your vertices.

    def __init__(self):
        self.verts_ = []
        self.vertIdxs = {}

    def keyFor(v):
        return "%f,%f,%f"%(v[0], v[1], v[2])

    def idxFor(self, v):
        key = VertexAccumulator.keyFor(v)
        rval = self.vertIdxs.get(key)
        if None==rval:
            rval = len(self.verts_)
            self.vertIdxs[key] = rval
        return rval

    def verts(self):
        return self.verts_

def image_to_mesh(img):
    pix = img.pixels[:]
    w = img.size[0]
    h = img.size[1]

    def is_solid(pix, off):
        return pix[off]  < 0.5

    va = VertexAccumulator()

    faces = []
    for y in range(h):
        for x in range(w):
            off= 4* ( y*w + x )
            solid = is_solid(pix, off)

            x1 = x
            x2 = x + 1
            if True:
                y1 = y
                y2 = y+1
                y2 = h-y
                y1 = y2-1
            if solid:
                i0 = va.idxFor([x1, y1, 0])
                i1 = va.idxFor([x2, y1, 0])
                i2 = va.idxFor([x1, y2, 0])
                i3 = va.idxFor([x2, y2, 0])
                i4 = va.idxFor([x1, y1, -1])
                i5 = va.idxFor([x2, y1, -1])
                i6 = va.idxFor([x1, y2, -1])
                i7 = va.idxFor([x2, y2, -1])

                # top
                faces.append( [i0, i1, i3, i2,] )
                # bottom
                faces.append([i4, i6, i7, i5,])

                if x <1 or not is_solid(pix, off-4):
                    # x--
                    faces.append( [ i0, i2, i6, i4])

                if x+1 >w or not is_solid(pix, off+4):
                    faces.append( [i1, i5, i7, i3])
                if y<1 or not is_solid(pix, off-4*w):
                    faces.append( [i0, i4, i5, i1])
                if y+1>h or not is_solid(pix, off+4*w):
                    faces.append( [ i2, i3, i7, i6])

    mesh ='stencil')
    mesh.from_pydata(va.verts(), [], faces)
    mesh.show_normal_face = True

    return mesh

def mission1(scn):
    img =['frog-trace-post.png']
    #img =['test.png']
    mesh = image_to_mesh(img)

    obj ="stencil", mesh)
    s = 1/max(img.size[0], img.size[1])
    obj.scale = (s,s,1)


Blender python API quick-start

Syntax highlighting by Pygments.