I’ve been doing some more research and it seems that I need to learn how to projection map world coordinates onto the camera plane. I found this 2.49 .blend which I hope will be a good start. The code looks like this:

```
# ----------------------------
# http://blenderunderground.com
# - projects vertices from a
# cube onto a plane
# ----------------------------
from Blender import *
from Blender.Mathutils import *
from math import *
FOV = 90
# ----------------------------
def clamp( val, min, max ):
if val < min: return min
if val > max: return max
return val
# ----------------------------
source = Object.Get('Cube') # Source cube
dest = Object.Get('Cube-Proj') # Projected cube
screen = Object.Get('Plane') # Screen surface
# distance calculation
radfov = pi * FOV / 180
dist = screen.LocY/tan(radfov/2)
# get the mesh data
smesh = source.data # read only
dmesh = dest.getData(False, True) # write
# we need the object's rotation
# so we can rotate the vertices
euler = source.getEuler()
# step through vertices
for v in range(8):
vertex = Vector(smesh.verts[v]) # source cube
# use euler angles to build rotation matrix
rotx = Matrix([1,0,0], [0,cos(euler.x),sin(euler.x)], [0,-sin(euler.x),cos(euler.x)])
roty = Matrix([cos(euler.y),0,-sin(euler.y)], [0,1,0], [sin(euler.y),0,cos(euler.y)])
rotz = Matrix([cos(euler.z),sin(euler.z),0], [-sin(euler.z),cos(euler.z),0], [0,0,1])
rotationMatrix = rotx * roty * rotz
# build scale matrix
scaleMatrix = Matrix([source.SizeX,0,0], [0,source.SizeY,0], [0,0,source.SizeZ])
# concatenate matrices
worldmatrix = scaleMatrix * rotationMatrix
# transform vertex
# this provides a set of
# verts in world space
vnew = vertex * worldmatrix
# manual translation
dx = vnew.x + source.LocX
dy = vnew.y + source.LocY
dz = vnew.z + source.LocZ
# keep origin collisions from
# getting too ugly
dy = clamp(dy, 0.01, dy)
# manual projection
nx = -dist * dx / dy
ny = screen.LocY
nz = -dist * dz / dy
# output transformed vertices
dmesh.verts[v].co.x = nx
dmesh.verts[v].co.y = ny
dmesh.verts[v].co.z = nz
```

Can anyone tell me if this the most straight-forward way to approach it?