Applying 4x4 transformation to 3-element vector with numpy

John Nagle nagle at animats.com
Wed Oct 9 02:10:16 EDT 2013


On 10/8/2013 10:36 PM, Christian Gollwitzer wrote:
> 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.

    I only need affine transformations.  This is just moving
the coordinate system of a point, not perspective rendering.
I have to do this for a lot of points, and I'm hoping numpy
has some way to do this without generating extra garbage on the
way in and the way out.

    I've done this before in C++.

				John Nagle





More information about the Python-list mailing list