Class: Rubytracer::PointLight
- Inherits:
-
Object
- Object
- Rubytracer::PointLight
- Defined in:
- lib/rubytracer/lights/point.rb
Instance Method Summary collapse
- #check_shadow(point, direction, distance, scene) ⇒ Object
- #diffuse(normal, point, scene) ⇒ Object
- #distance_loss(distance) ⇒ Object
-
#initialize(value, point) ⇒ PointLight
constructor
A new instance of PointLight.
- #specular(normal, view_vector, point, scene) ⇒ Object
Constructor Details
#initialize(value, point) ⇒ PointLight
Returns a new instance of PointLight.
5 6 7 8 |
# File 'lib/rubytracer/lights/point.rb', line 5 def initialize(value, point) @value = value @point = point end |
Instance Method Details
#check_shadow(point, direction, distance, scene) ⇒ Object
10 11 12 13 14 15 |
# File 'lib/rubytracer/lights/point.rb', line 10 def check_shadow(point, direction, distance, scene) ray = Geom3d::Ray.new(point + direction * 0.00001, direction) obj, alpha = scene.intersect(ray) pos = ray.pos(alpha) alpha < distance end |
#diffuse(normal, point, scene) ⇒ Object
34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/rubytracer/lights/point.rb', line 34 def diffuse(normal, point, scene) vector = @point - point dir = vector.unit dis = vector.length if check_shadow(point, dir, dis, scene) Colour.new(0,0,0) else @value * distance_loss(dis) * [0, dir.dot(normal)].max end end |
#distance_loss(distance) ⇒ Object
17 18 19 |
# File 'lib/rubytracer/lights/point.rb', line 17 def distance_loss(distance) ([0, 8 - distance].max / 8) ** 3 end |
#specular(normal, view_vector, point, scene) ⇒ Object
21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/rubytracer/lights/point.rb', line 21 def specular(normal, view_vector, point, scene) vector = @point - point dir = vector.unit dis = vector.length if check_shadow(point, dir, dis, scene) Colour.new(0,0,0) else d = (2 * view_vector.dot(normal) * normal - view_vector).unit @value * distance_loss(dis) * [0, d.dot(dir)].max end end |