func MakeViewRay(u, v, k float64) geometry.Ray { //var d1 float64 = math.Sqrt(1/(2+4*sinθ2)) // = math.Sqrt(5/14) const d1 float64 = 0.5976143046671968 //var d2 float64 = -2*sinθ*d1 const d2 float64 = -2 * sinθ * d1 // = -math.Sqrt(2/7) d := geometry.MakeVector(d1, d2, d1) bu := geometry.MakeVector(1.0/math.Sqrt(2), 0, -1.0/math.Sqrt(2)) var bv1 float64 = math.Sqrt(1.0 / 7.0) //math.Sqrt(1/(2 + 1/sinθ2)) var bv2 float64 = math.Sqrt(5.0 / 7.0) //bv1/sinθ bv := geometry.MakeVector(bv1, bv2, bv1) //fmt.Println(bu.Dot(d), bv.Dot(d), bu.Dot(bv)) o := (bu.Mul(u)).Add(bv.Mul(v)).Add(d.Mul(k)) return geometry.MakeRay(o, d) }
func calculateColour(r geometry.Ray, depth float64, scene geometry.Object, object geometry.Object, mat geometry.Material, recursionLimit uint) (colour geometry.Vector) { colour = mat.BaseColour.Mul(mat.CBase) if mat.CReflectance != 0 && recursionLimit != 0 { //calculate normal normal := object.Normal(r, depth) dir_proj := normal.Mul(normal.Dot(r.GetDirectionVector())) reflectedDirection := dir_proj.Mul(2).Sub(r.GetDirectionVector()) incidence := r.Point(depth) reflectedRay := geometry.MakeRay(incidence.Add(reflectedDirection.Mul(0.01)), reflectedDirection) //add a small amount so that it doesn't intersect the mirror _, reflectedColour := castRay(reflectedRay, scene, recursionLimit-1) colour = colour.Add(reflectedColour.Mul(mat.CReflectance)) } return }