Mattias Brändström wrote: > Hello! > > I'm trying to find what package I should use if I want to: > > 1. Create 3d vectors. > 2. Normalize those vectors. > 3. Create a 3x3 rotation matrix from a unit 3-d vector and an angle in > radians. > 4. Perform matrix multiplication. > > It seems to me that perhaps numpy should be able to help me with this. > However, I can only figure out how to do 1 and 4 using numpy. Meybe > someone knows a way to use numpy for 2 and 3? If not, what Python > package helps me with geometry related tasks such as 2 and 3? > > Any help here would be greatly appreciated! > > Regards, > Mattias >
As Paul is hinting, your best bet is to make use of quaternions, you will save yourself a lot of frustration as soon as you need to do anything with them outside of matrix-multiplying a bunch of 3D coordinates. See the Scientific Python module: Scientific.Geometry.Quaternion. To make a matrix from Quaternion, q, use "q.asRotations().tensor". To make a quaternion from an axis and an angle, here is what I use: ####################################################################### # axis_angle_to_quaternion() ####################################################################### def axis_angle_to_quaternion(axis, angle): """ Takes an I{axis} (3x1 array) and an I{angle} (in degrees) and returns the rotation as a I{Scientific.Geometry.Quaternion.Quaternion}. @param axis: 3x1 array specifiying an axis @type axis: numarray.array @param angle: C{float} specifying the rotation around I{axis} @type angle: float @return: a I{Quaternion} from an I{axis} and an I{angle} @rtype: Quaternion """ axis = normalize(axis) angle = math.radians(float(angle)) qx = float(axis[0]) qy = float(axis[1]) qz = float(axis[2]) sin_a = math.sin(angle / 2.0) cos_a = math.cos(angle / 2.0) qx = qx * sin_a qy = qy * sin_a qz = qz * sin_a qw = cos_a return Quaternion(qw, qx, qy, qz).normalized() See your linear algebra text on how to normalize a 1x3 vector. James -- http://mail.python.org/mailman/listinfo/python-list