def cast_ray(self, orig, direction): material, intersect = self.scene_intersect(orig, direction) if material is None: return self.activeTexture light_dir = norm(sub(self.light.position, intersect.point)) light_distance = length(sub(self.light.position, intersect.point)) offset_normal = mul(intersect.normal, 1.1) # avoids intercept with itself shadow_orig = sub( intersect.point, offset_normal) if dot(light_dir, intersect.normal) < 0 else sum( intersect.point, offset_normal) shadow_material, shadow_intersect = self.scene_intersect( shadow_orig, light_dir) shadow_intensity = 0 if shadow_material and length(sub(shadow_intersect.point, shadow_orig)) < light_distance: shadow_intensity = 0.9 intensity = self.light.intensity * max( 0, dot(light_dir, intersect.normal)) * (1 - shadow_intensity) reflection = reflect(light_dir, intersect.normal) specular_intensity = self.light.intensity * (max( 0, -dot(reflection, direction))**material.spec) diffuse = material.diffuse * intensity * material.albedo[0] specular = color(255, 255, 255) * specular_intensity * material.albedo[1] return diffuse + specular
def cast_ray(self, orig, direction): #funcion de rayo que nos va a retorar un color impacted_material = self.scene_intersect(orig, direction) if impacted_material: #si si impacto retornamos el ojo #print('impacted material', impacted_material.diffuse) return impacted_material.diffuse #return color (200, 0, 0) else: #print('color', color(0,0,200)) return color(77, 158, 179)
#MATERIALS from mathfunc import color from dataclasses import dataclass class Material(object): def __init__(self, diffuse, albedo, spec): self.diffuse = diffuse self.albedo = albedo self.spec = spec ivory = Material(diffuse=color(100, 100, 80), albedo=(0.6, 0.3, 0.1), spec=5) brown = Material(diffuse=color(212, 163, 108), albedo=(0.6, 0.3, 0.1), spec=5) darkbrown = Material(diffuse=color(143, 86, 23), albedo=(0.6, 0.3, 0.1), spec=5) green = Material(diffuse=color(139, 150, 18), albedo=(0.9, 0.1, 0, 0, 0), spec=10) red = Material(diffuse=color(224, 47, 16), albedo=(0.9, 0.1, 0, 0, 0), spec=10) snow = Material(diffuse=color(209, 232, 237), albedo=(0.6, 0.3, 0.1), spec=5) coal = Material(diffuse=color(0, 0, 0), albedo=(0.6, 0.3, 0.1), spec=5) carrot = Material(diffuse=color(227, 110, 14), albedo=(0.9, 0.1, 0, 0, 0), spec=10) white = Material(diffuse=color(255, 255, 255), albedo=(0.6, 0.3, 0.1), spec=5) yellow = Material(diffuse=color(252, 186, 3), albedo=(0.9, 0.1, 0, 0, 0), spec=10)
#MATERIALS from mathfunc import color class Material(object): def __init__(self, diffuse): self.diffuse = diffuse ivory = Material(diffuse=color(100, 100, 80)) snow = Material(diffuse=color(209, 232, 237)) coal = Material(diffuse=color(0, 0, 0)) carrot = Material(diffuse=color(227, 110, 14)) white = Material(diffuse=color(255, 255, 255))
#181202 #Graficas por Computadora - 10 #RT2: Teddys #snowman import struct from materials import coal, snow, ivory, carrot, white, red, green, yellow from sphere import Sphere from mathfunc import norm, V3, color, char, dword, word, sub, length, dot, mul, reflect, sum from collections import namedtuple import random from numpy import matrix, cos, sin, tan, pi import math from light import Light BLACK = color(0, 0, 0) WHITE = color(255, 255, 255) class Render(object): def __init__(self, width, height): self.width = width self.height = height self.scene = [] self.activeTexture = WHITE self.clear() def clear(self): self.framebuffer = [[self.activeTexture for x in range(self.width)] for y in range(self.height)]