Пример #1
0
func (p Sphere) Intersect(ray, origin glm.Vec3) (b bool, raylen float64, normal glm.Vec3) {
	normal = glm.Vec3{}
	line := *p.Pos.Subtract(&origin)
	// Solve using cosine law for scalar coefficient of ray.
	raylens := quadraticRoots(ray.Dot(&ray), 2*line.Dot(&ray), line.Dot(&line)-p.Rad*p.Rad)
	switch len(raylens) {
	case 0:
		return false, 0, normal
	case 1:
		return ray_epsilon_check(-raylens[0], ray, line)
	case 2:
		if raylens[0] > raylens[1] { // NOTE: negative inversion
			tmp := raylens[0]
			raylens[0] = raylens[1]
			raylens[1] = tmp
		}
		if b, raylen, normal = ray_epsilon_check(-raylens[1], ray, line); b {
			return b, raylen, normal
		} else {
			return ray_epsilon_check(-raylens[0], ray, line)
		}
	}
	return false, 0, normal
}