-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcamera.go
47 lines (41 loc) · 1.13 KB
/
camera.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package raytracing
import "math"
type (
CameraParams struct {
LookFrom Point3D
LookAt Point3D
VUP Point3D
VerticalFOV float64
Aspect float64
}
Camera struct {
Origin Point3D
LowerLeftCorner Point3D
FocalLength float64
Horizontal Point3D
Vertical Point3D
CameraParams
}
)
func NewCamera(params CameraParams) Camera {
theta := DegreesToRadians(params.VerticalFOV)
halfHeight := math.Tan(theta / 2)
halfWidth := params.Aspect * halfHeight
w := params.LookFrom.Sub(params.LookAt).Unit()
u := params.VUP.Cross(w).Unit()
v := w.Cross(u)
return Camera{
Origin: params.LookFrom,
LowerLeftCorner: params.LookFrom.Sub(u.Multiply(halfWidth)).Sub(v.Multiply(halfHeight)).Sub(w),
Horizontal: u.Multiply(2 * halfWidth),
Vertical: v.Multiply(2 * halfHeight),
FocalLength: params.LookFrom.Sub(params.LookAt).Length(),
CameraParams: params,
}
}
func (self Camera) GetRay(u, v float64) Ray {
return Ray{
Origin: self.Origin,
Direction: self.LowerLeftCorner.Add(self.Horizontal.Multiply(u)).Add(self.Vertical.Multiply(v)).Sub(self.Origin),
}
}