Applying 4x4 transformation to 3-element vector with numpy

Christian Gollwitzer auriocus at gmx.de
Wed Oct 9 01:36:17 EDT 2013


Dear John,

Am 09.10.13 07:28, schrieb John Nagle:
>     This is the basic transformation of 3D graphics.  Take
> a 3D point, make it 4D by adding a 1 on the end, multiply
> by a transformation matrix to get a new 4-element vector,
> discard the last element.
>
>     Is there some way to do that in numpy without
> adding the extra element and then discarding it?
>

if you can discard the last element, the matrix has a special structure: 
It is an affine transform, where the last row is unity, and it can be 
rewritten as

A*x+b

where A is the 3x3 upper left submatrix and b is the column vector. You 
can do this by simple slicing - with C as the 4x4 matrix it is something 
like

	dot(C[0:3, 0:3], x) + C[3, 0:3]

(untested, you need to check if I got the indices right)

*IF* however, your transform is perspective, then this is incorrect - 
you must divide the result vector by the last element before discarding 
it, if it is a 3D-point. For a 3D-vector (enhanced by a 0) you might 
still find a shortcut.

	Christian



More information about the Python-list mailing list