-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcamera.go
56 lines (45 loc) · 1.54 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
48
49
50
51
52
53
54
55
56
package main
import "github.com/chewxy/math32"
// Camera represents a camera.
type Camera struct {
Origin Vec3
Horizontal Vec3
Vertical Vec3
LowerLeftCorner Vec3
LensRadius float32
U, V, W Vec3
}
// NewCamera gets a camera with some defaults
func NewCamera(lookFrom, lookAt, up Vec3, fov, aspect, aperture, focusDistance float32) Camera {
// var u, v, w Vec3
var camera Camera
camera.LensRadius = aperture / 2
theta := fov * math32.Pi / 180
halfHeight := math32.Tan(theta / 2)
halfWidth := aspect * halfHeight
camera.Origin = lookFrom
camera.W = lookFrom.Subtract(lookAt).Normalized()
camera.U = up.Cross(camera.W).Normalized()
camera.V = camera.W.Cross(camera.U)
// camera.LowerLeftCorner = Vec3{-halfWidth, -halfHeight, -1.0}
camera.LowerLeftCorner = camera.Origin.
Subtract(camera.U.ScalarMultiply(halfWidth * focusDistance)).
Subtract(camera.V.ScalarMultiply(halfHeight * focusDistance)).
Subtract(camera.W.ScalarMultiply(focusDistance))
camera.Horizontal = camera.U.ScalarMultiply(2.0 * halfWidth * focusDistance)
camera.Vertical = camera.V.ScalarMultiply(2.0 * halfHeight * focusDistance)
return camera
}
// GetRay gets the ray from the camera.
func (c Camera) GetRay(s, t float32) Ray {
rd := RandomInUnitSphere().ScalarMultiply(c.LensRadius)
offset := c.U.ScalarMultiply(rd.X()).Add(c.V.ScalarMultiply(rd.Y()))
return Ray{
c.Origin.Add(offset),
c.LowerLeftCorner.
Add(c.Horizontal.ScalarMultiply(s)).
Add(c.Vertical.ScalarMultiply(t)).
Subtract(c.Origin).
Subtract(offset),
}
}