Create rotation matrix from 1 axis
Hi Everyone,
wondering if anyone has any insight to this problem. I have 2 points, p1 and p2. I calculate the vector from p2 - p1:
z-axis = p2 - p1
I'm parsing an armature, and it only supplies points (offsets) to each bone. I calculate the distance as:
distance = z-axis.magnitude()
but Im wondering how I can construct a matrix so that it will rotate the object (in this case a cylinder from 0 to length on z axis) to the vector we got from p2 - p1 as the new z-axis.
z-axis.normalize()
if we calculate the y-axis from any perpendicular axis :
y-axis = z-axis.cross(1,0,0)
then calculate the x as :
x-axis = y-axis.cross(z-axis)
then recalculate the y axis :
y-axis = x-axis.cross(z-axis)
should the matrix as shown not give the correct rotation?
[[x0], [y0], [z0]
[x1], [y1], [z1]
[x2], [y2], [z2]]
With what you've posted, the x and y axes will most likely not be unit length, which means you won't have a pure rotation.
It should go something like this:
It should go something like this:
vector3 z = normalize(p2 - p1);vector3 y = normalize(cross(z, vector3(1, 0, 0)));vector3 x = cross(y, z);
Note that this may fail if the z axis is parallel or nearly parallel to the cardinal x axis. To work around this, instead of always crossing with the x axis, you can cross the z axis with the cardinal axis whose index corresponds to the element of the z axis with the least magnitude. (That may sound confusing, but basically it means that if |z.x| is <= |z.y| and |z.z|, you cross with the x axis; if |z.y| <= |z.x| and |z.z|, you cross with the y axis; and similarly for z.z.)
Heya again,
Thanks for the reply. Yeah I knew I had to normalize. I think the problem was my library Im using in python. The Vector3.normalize() function didn't work in place so it was causing my problems :D
Mostly I was asking if the math made sense, and yes apparently it does! Hurrah!
Oh and PS I was already using the method you put at the end there and yes it makes perfect sense to me ;)
Thanks for the reply. Yeah I knew I had to normalize. I think the problem was my library Im using in python. The Vector3.normalize() function didn't work in place so it was causing my problems :D
Mostly I was asking if the math made sense, and yes apparently it does! Hurrah!
Oh and PS I was already using the method you put at the end there and yes it makes perfect sense to me ;)
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement