numpy
28 Nov 2016numpy is an excellent library for dealing with array-based math problems. According to the website:
NumPy is the fundamental package for scientific computing with Python
In today’s post, I’ll go through some very basic operations of the library while piecing together the transformation segment that you might see in the back-end of a 3D rendering pipeline. We’ll focus on some vector and matrix math, but most importantly we’ll look at the creation of specialised matricies and matrix multiplication.
Vectors
All points in our 3D world is going to be re-presented by a 4D Homogenous co-ordinate. numpy provide the perfect abstraction here with the array
function.
There are many other construction functions available for this single dimension value series that you can find in the documentation.
Once we’ve created the array, we can start to perform arithmetic on it.
Matrices
Graduating from the vector, we now need a tabular representation for our linear algebraic operations that we’ll perform. To do this, we’ll use a matrix which numpy has a direct analog for.
First of all, every math library needs a shortcut to the identity matrix:
Getting back into our 3D engine, we’re going to need a way to translate, scale and rotate the array points.
Translation
A translation matrix in 3-space using a 4x4 matrix looks like this:
So, when we apply this matrix to a column vector; we’ll end up with a simple addition of each of the components:
In python using numpy, this is greatly simplified:
With this function in hand, we can now start to move our vectors around in space:
With the output of this function:
Scale
We scale points geometry to adjust proportionality of objects. A scale matrix will do just this on any point around the origin 0, 0, 0, 1
.
Applying a matrix of this shape to a column vector, we now get a multiplication effect:
The python for this process is pretty simple, again:
Rotation
We’ll treat rotation on each axis separately.
x-axis rotation performs spherical movement between the y and z axis:
y-axis rotation performs spherical movement between the x and z axis:
z-axis rotation performs spherical movement between the x and y axis:
These translate really well into python code, too!
Armed with all of these functions, we have a basic (local) co-ordinate transform pipeline. We can start to make a little more sense out of these mathematical constructs by binding the results to variables that are named by their side effects.
What is interesting about the matricies that we’ve just created, is that they’re reusable for as many points as we want. We can uniformly transform a group of vectors with the same matrix.
So, if I wanted to not only move right by 2, but also make twice bigger and turn the other way; I could multiply these matricies together to form a new transformation:
Now we can use do_all_the_things
to transform our vector objects to perform all of these transformations at once:
We did start, pointing towards the camera 0, 0, 1
and then after moving to the right by 2
and doubling our size, we’re now at 4
on the x-axis. We turn around about the x
axis and we’re now facing away from the camera; twice the distance (-2
on the z-axis). Note that the y-axis has some epsilon garbage after our multiplies.
Well, it was a quick tour; but this has been numpy in (a little bit of) action.