package PDL::Graphics::TriD::Control3D; # Mustn't have empty package in some perl versions. ############################################## # # A quaternion-based controller framework with the following transformations: # 1. world "origin". This is what the world revolves around # 2. world "rotation" at origin. # 3. camera "distance" along z axis after that (camera looks # at negative z axis). # 4. camera "rotation" after that (not always usable). package PDL::Graphics::TriD::SimpleController; use strict; use fields qw/WOrigin WRotation CDistance CRotation/; sub new{ my ($class) = @_; my $self = fields::new($class); $self->reset(); $self; } sub normalize { my($this) = @_; $this->{WRotation}->normalize_this(); $this->{CRotation}->normalize_this(); } sub reset { my($this) = @_; $this->{WOrigin} = [0,0,0]; $this->{WRotation} = PDL::Graphics::TriD::Quaternion->new(1,0,0,0); # $this->{WRotation} = PDL::Graphics::TriD::Quaternion->new( # 0.847, -0.458, -0.161, -0.216); # $this->{WRotation} = PDL::Graphics::TriD::Quaternion->new( # 0.347, -0.458, -0.161, -0.216); $this->{CDistance} = 5; $this->{CRotation} = PDL::Graphics::TriD::Quaternion->new(1,0,0,0); } sub set { my($this,$options) = @_; foreach my $what (keys %$options){ if($what =~ /Rotation/){ $this->{$what}[0] = $options->{$what}[0]; $this->{$what}[1] = $options->{$what}[1]; $this->{$what}[2] = $options->{$what}[2]; $this->{$what}[3] = $options->{$what}[3]; }elsif($what eq 'WOrigin'){ $this->{$what}[0] = $options->{$what}[0]; $this->{$what}[1] = $options->{$what}[1]; $this->{$what}[2] = $options->{$what}[2]; }else{ $this->{$what} = $options->{$what}; } } } 1;