a | b/lib/Panotools/Matrix.pm | ||
---|---|---|---|

1 | package Panotools::Matrix; |
||

2 | |||

3 | =head1 NAME |
||

4 | |||

5 | Panotools::Matrix - Miscellaneous math for panoramic images |
||

6 | |||

7 | =head1 SYNOPSIS |
||

8 | |||

9 | $matrix = rollpitchyaw2matrix ($roll, $pitch, $yaw); |
||

10 | |||

11 | All angles are in radians not degrees. |
||

12 | |||

13 | =head1 DESCRIPTION |
||

14 | |||

15 | rollpitchyaw2matrix returns a Math::Matrix object that encapsulates a |
||

16 | transformation suitable for rotating a vector/point by three degrees of freedom |
||

17 | (roll, pitch and yaw). |
||

18 | |||

19 | roll is positive rotation around the x-axis |
||

20 | |||

21 | pitch is negative rotation around the y-axis |
||

22 | |||

23 | yaw is negative rotation around the z axis |
||

24 | |||

25 | =head1 USAGE |
||

26 | |||

27 | use Math::Matrix; |
||

28 | |||

29 | use Panotools::Matrix; |
||

30 | |||

31 | my $point = new Math::Matrix ([$x1], [$y1], [$z1]); |
||

32 | |||

33 | my $matrix = rollpitchyaw2matrix ($roll, $pitch, $yaw); |
||

34 | |||

35 | my $result = $matrix->multiply ($point); |
||

36 | |||

37 | ($x2, $y2, $z2) = ($result->[0][0], $result->[1][0], $result->[2][0]); |
||

38 | |||

39 | =head1 FILES |
||

40 | |||

41 | Requires Math::Matrix as this is all matrix mathematics. |
||

42 | |||

43 | =head1 COPYRIGHT |
||

44 | |||

45 | Copyright (c) 2001 Bruno Postle <bruno@postle.net>. All Rights Reserved. This |
||

46 | module is Free Software. It may be used, redistributed and/or modified under |
||

47 | the same terms as Perl itself. |
||

48 | |||

49 | This module is partly based on Math::Geometry by Greg McCarroll |
||

50 | <greg@mccarroll.demon.co.uk> |
||

51 | |||

52 | =cut |
||

53 | |||

54 | use Math::Matrix; |
||

55 | use Math::Trig; |
||

56 | use Math::Trig ':radial'; |
||

57 | use strict; |
||

58 | |||

59 | use Exporter; |
||

60 | use vars qw(@ISA @EXPORT); |
||

61 | @ISA = qw(Exporter); |
||

62 | @EXPORT = qw(rollpitchyaw2matrix matrix2rollpitchyaw); |
||

63 | |||

64 | sub rollpitchyaw2matrix { |
||

65 | my ($roll, $pitch, $yaw) = @_; |
||

66 | |||

67 | my $cosr = cos ($roll); |
||

68 | my $sinr = sin ($roll); |
||

69 | my $cosp = cos ($pitch); |
||

70 | my $sinp = sin (0 - $pitch); |
||

71 | my $cosy = cos ($yaw); |
||

72 | my $siny = sin (0 - $yaw); |
||

73 | |||

74 | my $rollm = new Math::Matrix ([ 1, 0, 0 ], |
||

75 | [ 0, $cosr,-1*$sinr ], |
||

76 | [ 0, $sinr, $cosr ]); |
||

77 | |||

78 | my $pitchm = new Math::Matrix ([ $cosp, 0, $sinp ], |
||

79 | [ 0, 1, 0 ], |
||

80 | [ -1*$sinp, 0, $cosp ]); |
||

81 | |||

82 | my $yawm = new Math::Matrix ([ $cosy,-1*$siny, 0 ], |
||

83 | [ $siny, $cosy, 0 ], |
||

84 | [ 0, 0, 1 ]); |
||

85 | |||

86 | $yawm->multiply ($pitchm)->multiply ($rollm); |
||

87 | } |
||

88 | |||

89 | # following copied from a spreadsheet by Stuart Milne |
||

90 | |||

91 | sub matrix2rollpitchyaw |
||

92 | { |
||

93 | my $matrix = shift; |
||

94 | my $roll = atan2 ($matrix->[2]->[1], $matrix->[2]->[2]); |
||

95 | my $pitch = -1 * asin (-1 * $matrix->[2]->[0]); |
||

96 | my $yaw = atan2 (-1 * $matrix->[1]->[0], $matrix->[0]->[0]); |
||

97 | return ($roll, $pitch, $yaw); |
||

98 | } |
||

99 | |||

100 | 1; |
||

101 |