# Class: Rabbit::TrackBall::Vector

Inherits:
Array
• Object
show all
Defined in:
lib/rabbit/trackball.rb

## Instance Method Summary collapse

• Given an axis and angle, compute quaternion.

• Build a rotation matrix, given a quaternion rotation.

• Quaternions always obey: a^2 + b^2 + c^2 + d^2 = 1.0 If they don't add up to 1.0, dividing by their magnitued will renormalize them.

## Instance Method Details

### #axis_to_quat(phi) ⇒ Object

Given an axis and angle, compute quaternion.

 ``` 136 137 138 139``` ```# File 'lib/rabbit/trackball.rb', line 136 def axis_to_quat(phi) b, c, d = self.vnormal.vscale(Math.sin(phi/2.0)) Vector.new([b, c, d, Math.cos(phi/2.0)]) end```

### #build_rotmatrix ⇒ Object

Build a rotation matrix, given a quaternion rotation.

 ``` 120 121 122 123 124 125 126 127 128 129 130 131 132 133``` ```# File 'lib/rabbit/trackball.rb', line 120 def build_rotmatrix m = [] m << [1.0 - 2.0 * (self[1] * self[1] + self[2] * self[2]), 2.0 * (self[0] * self[1] - self[2] * self[3]), 2.0 * (self[2] * self[0] + self[1] * self[3]), 0.0] m << [2.0 * (self[0] * self[1] + self[2] * self[3]), 1.0 - 2.0 * (self[2] * self[2] + self[0] * self[0]), 2.0 * (self[1] * self[2] - self[0] * self[3]), 0.0] m << [2.0 * (self[2] * self[0] - self[1] * self[3]), 2.0 * (self[1] * self[2] + self[0] * self[3]), 1.0 - 2.0 * (self[1] * self[1] + self[0] * self[0]), 0.0] m << [0.0, 0.0, 0.0, 1.0] m end```

### #collect(&block) ⇒ Object

 ``` 141 142 143``` ```# File 'lib/rabbit/trackball.rb', line 141 def collect(&block) Vector.new(super) end```

### #normalize_quat ⇒ Object

Quaternions always obey: a^2 + b^2 + c^2 + d^2 = 1.0 If they don't add up to 1.0, dividing by their magnitued will renormalize them.

• Shoemake, K., Animating rotation with quaternion curves, Computer Graphics 19, No 3 (Proc. SIGGRAPH'85), 245-254, 1985.

• Pletinckx, D., Quaternion calculus as a basic tool in computer graphics, The Visual Computer 5, 2-13, 1989.

 ``` 115 116 117``` ```# File 'lib/rabbit/trackball.rb', line 115 def normalize_quat collect{|q| q = q / inject(0){|ret, i| ret + i ** 2}} end```

### #vadd(other, range = nil) ⇒ Object

 ``` 98 99 100 101``` ```# File 'lib/rabbit/trackball.rb', line 98 def vadd(other, range = nil) range = [size, other.size].min unless range (0...range).inject(Vector.new){|ret, i| ret << self[i] + other[i]} end```

### #vcross(other) ⇒ Object

 ``` 79 80 81 82 83 84``` ```# File 'lib/rabbit/trackball.rb', line 79 def vcross(other) dst = Vector.new dst << (self[1] * other[2]) - (self[2] * other[1]) dst << (self[2] * other[0]) - (self[0] * other[2]) dst << (self[0] * other[1]) - (self[1] * other[0]) end```

### #vdot(other, range = nil) ⇒ Object

 ``` 93 94 95 96``` ```# File 'lib/rabbit/trackball.rb', line 93 def vdot(other, range = nil) range = [size, other.size].min unless range (0...range).inject(0.0){|ret, i| ret + self[i] * other[i]} end```

### #vlength ⇒ Object

 ``` 86 87 88``` ```# File 'lib/rabbit/trackball.rb', line 86 def vlength Math.sqrt(inject(0){|ret, i| ret + i ** 2}) end```

### #vnormal ⇒ Object

 ``` 91``` ```# File 'lib/rabbit/trackball.rb', line 91 def vnormal; vscale(1.0 / vlength); end```

### #vscale(div) ⇒ Object

 ``` 90``` ```# File 'lib/rabbit/trackball.rb', line 90 def vscale(div); collect{|v| v *= div}; end```

### #vsub(other, range = nil) ⇒ Object

 ``` 74 75 76 77``` ```# File 'lib/rabbit/trackball.rb', line 74 def vsub(other, range = nil) range = [size, other.size].min unless range (0...range).inject(Vector.new){|ret, i| ret << self[i] - other[i]} end```