public function intersect($ray) { $info = new RayTracer_IntersectionInfo(); $Vd = $this->position->dot($ray->direction); if ($Vd == 0) { return $info; } // no intersection $t = -($this->position->dot($ray->position) + $this->d) / $Vd; if ($t <= 0) { return $info; } $info->shape = $this; $info->isHit = true; $info->position = RayTracer_Vector::add($ray->position, RayTracer_Vector::multiplyScalar($ray->direction, $t)); $info->normal = $this->position; $info->distance = $t; if ($this->material->hasTexture) { $vU = new RayTracer_Vector($this->position->y, $this->position->z, -$this->position->x); $vV = $vU->cross($this->position); $u = $info->position->dot($vU); $v = $info->position->dot($vV); $info->color = $this->material->getColor($u, $v); } else { $info->color = $this->material->getColor(0, 0); } return $info; }
public function __construct(RayTracer_Vector $pos, RayTracer_Vector $lookAt, RayTracer_Vector $up) { $this->up = $up->normalize(); $this->position = $pos; $this->lookAt = $lookAt; $this->equator = $lookAt->normalize()->cross($this->up); $this->screen = RayTracer_Vector::add($this->position, $this->lookAt); }
public function intersect($ray) { $info = new RayTracer_IntersectionInfo(); $info->shape = $this; $dst = RayTracer_Vector::subtract($ray->position, $this->position); $B = $dst->dot($ray->direction); $C = $dst->dot($dst) - $this->radius * $this->radius; $D = $B * $B - $C; if ($D > 0) { // intersection! $info->isHit = true; $info->distance = -$B - sqrt($D); $info->position = RayTracer_Vector::add($ray->position, RayTracer_Vector::multiplyScalar($ray->direction, $info->distance)); $info->normal = RayTracer_Vector::subtract($info->position, $this->position)->normalize(); $info->color = $this->material->getColor(0, 0); } else { $info->isHit = false; } return $info; }
public function getReflectionRay($P, $N, $V) { $c1 = -$N->dot($V); $R1 = RayTracer_Vector::add(RayTracer_Vector::multiplyScalar($N, 2 * $c1), $V); return new Raytracer_Ray($P, $R1); }