Module: Matrix3d
- Defined in:
- lib/ext/projector/matrix3d.rb
Class Method Summary collapse
- .frustum(left, right, bottom, top, znear, zfar) ⇒ Object
- .identity ⇒ Object
- .perspective(fov, aspect, znear, zfar) ⇒ Object
- .rotate(theta, axis) ⇒ Object
- .scale(v) ⇒ Object
- .translate(v) ⇒ Object
Class Method Details
.frustum(left, right, bottom, top, znear, zfar) ⇒ Object
10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# File 'lib/ext/projector/matrix3d.rb', line 10 def frustum(left, right, bottom, top, znear, zfar) x = 2.0 * znear / (right - left) y = 2.0 * znear / (top - bottom) a = (right + left) / (right - left) b = (top + bottom) / (top - bottom) c = -(zfar + znear) / (zfar - znear) d = -2.0 * zfar * znear / (zfar - znear) Matrix[ [x, 0.0, a, 0.0], [0.0, y, b, 0.0], [0.0, 0.0, c, d], [0.0, 0.0, -1.0, 0.0] ] end |
.identity ⇒ Object
8 |
# File 'lib/ext/projector/matrix3d.rb', line 8 def identity() Matrix.identity(4) end |
.perspective(fov, aspect, znear, zfar) ⇒ Object
25 26 27 28 29 30 31 |
# File 'lib/ext/projector/matrix3d.rb', line 25 def perspective(fov, aspect, znear, zfar) yhi = znear * Math.tan(fov * Math::PI / 360.0) ylo = -yhi xlo = ylo * aspect xhi = yhi * aspect frustum(xlo, xhi, ylo, yhi, znear, zfar) end |
.rotate(theta, axis) ⇒ Object
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/ext/projector/matrix3d.rb', line 53 def rotate(theta, axis) axis.size >= 3 or raise 'axis vector size >= 3.' theta = Math::PI / 180.0 * theta axis = Vector[axis[0], axis[1], axis[2]] axis_r = axis.r axis_r > axis_r * Float::EPSILON or raise 'r must not be zero vector.' x = axis[0] / axis_r y = axis[1] / axis_r z = axis[2] / axis_r s = Math.sin(theta) c = Math.cos(theta) cc = 1.0 - c Matrix[ [cc * x * x + c, cc * y * x - s * z, cc * z * x + s * y, 0.0], [cc * x * y + s * z, cc * y * y + c, cc * z * y - s * x, 0.0], [cc * x * z - s * y, cc * y * z + s * x, cc * z * z + c, 0.0], [0.0, 0.0, 0.0, 1.0] ] end |
.scale(v) ⇒ Object
43 44 45 46 47 48 49 50 51 |
# File 'lib/ext/projector/matrix3d.rb', line 43 def scale(v) v.size >= 3 or raise 'vector size >= 3.' Matrix[ [v[0], 0.0, 0.0, 0.0], [0.0, v[1], 0.0, 0.0], [0.0, 0.0, v[2], 0.0], [0.0, 0.0, 0.0, 1.0] ] end |
.translate(v) ⇒ Object
33 34 35 36 37 38 39 40 41 |
# File 'lib/ext/projector/matrix3d.rb', line 33 def translate(v) v.size >= 3 or raise 'vector size >= 3.' Matrix[ [1.0, 0.0, 0.0, v[0]], [0.0, 1.0, 0.0, v[1]], [0.0, 0.0, 1.0, v[2]], [0.0, 0.0, 0.0, 1.0] ] end |