Math::Quaternion

Math::Quaternion is a Perl class to represent quaternions.
Download

Math::Quaternion Ranking & Summary

Advertisement

  • Rating:
  • License:
  • Perl Artistic License
  • Price:
  • FREE
  • Publisher Name:
  • Jonathan Chin
  • Publisher web site:
  • http://search.cpan.org/~jchin/

Math::Quaternion Tags


Math::Quaternion Description

Math::Quaternion is a Perl class to represent quaternions. Math::Quaternion is a Perl class to represent quaternions.SYNOPSIS use Math::Quaternion qw(slerp); my $q = Math::Quaternion->new; # Make a new unit quaternion # Make a rotation about the axis (0,1,0) my $q2 = Math::Quaternion->new({axis=>,angle=>0.1}); my @v = (1,2,3); # A vector. my @vrotated = $q2->rotate_vector(@v); # Rotate @v about (0,1,0). my $q3 = Math::Quaternion::rotation(0.7,2,1,4); # A different rotation. my $q4 = slerp($q2,$q3,0.5); # Interpolated rotation. my @vinterp = $q4->rotate_vector(@v);This package lets you create and manipulate quaternions. A quaternion is a mathematical object developed as a kind of generalization of complex numbers, usually represented by an array of four real numbers, and is often used to represent rotations in three-dimensional space.See, for example, http://mathworld.wolfram.com/Quaternion.html for more details on the mathematics of quaternions.Quaternions can be added, subtracted, and scaled just like complex numbers or vectors -- they can also be multiplied, but quaternion multiplication DOES NOT COMMUTE. That is to say, if you have quaternions $q1 and $q2, then in general $q1*$q2 != $q2*$q1. This is related to their use in representing rotations, which also do not commute.If you just want to represent rotations and don't care about the internal mathematical details, this should be all you need to know:All quaternions have a quantity called the "norm", similar to the length of a vector. A quaternion with norm equal to 1 is called a "unit quaternion". All quaternions which represent rotations are unit quaternions.If you call new() without any arguments, it will give you a unit quaternion which represents no rotation: $q = Math::Quaternion->new;You can make a quaternion which represents a rotation of a given angle (in radians) about a given axis: $qrot = Math::Quaternion->new({ axis => 0.1, angle => });Say you have two rotations, $q1 and $q2, and you want to make a quaternion representing a rotation of $q1 followed by $q2. Then, you do: $q3 = $q2 * $q1; # Rotate by $q1, followed by $q2.Remember that this is NOT the same as $q1 * $q2, which will reverse the order of the rotations.If you perform many iterated quaternion operations, the result may not quite be a unit quaternion due to numerical inaccuracies. You can make sure any quaternion has unit length, by doing: $unitquat = $anyquat->normalize;If you have a rotation quaternion, and you want to find the 3x3 matrix which represents the corresponding rotation, then: @matrix = $q->matrix3x3;Similarly, you can generate a 4x4 matrix of the sort you'd pass to OpenGL: @glmatrix = $q->matrix4x4;If you have a vector representing a direction, and you want to rotate the vector by a quaternion $q: my @vector = (0,0,1); # Vector pointing in the Z direction. my @newvec = $q->rotate_vector(@vector); # New direction.Say you're using quaternions to represent the orientation of a camera, and you have two quaternions: one to represent a starting orientation, and another to represent a finishing position. If you want to find all the quaternions representing the orientations in between, allowing your camera to move smoothly from start to finish, use the slerp() routine: use Math::Quaternion qw(slerp); my ($qstart, $qend) = ... ; # Set $tween to 9 points between start and end, exclusive. for my $t (1..9) { my $tween = slerp($qstart,$qend,0.1*$t); ... } Requirements: · Perl


Math::Quaternion Related Software