summaryrefslogtreecommitdiff
path: root/site/content/math/ray_vs_sphere.typ
blob: 75c60acc09cd66ad8ea6741575ec598266cdb56e (plain)
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// SPDX-License-Identifier: CC-BY-SA-4.0
// Copyright © Paweł Redman

#import "/common.typ": post, static, img

#show: post.with(
    title: "Ray vs. sphere",
    date: datetime(year: 2018, month: 5, day: 9),
)

#figure(
  img(static("math/ray_vs_sphere.png")),
  caption: [A drawing of a ray intersecting a sphere in two dimensions.],
)

In $RR^N$, a ray of origin $bold(x)_r$ and direction $bold(v)$ and an N-sphere of origin $bold(x)_s$ and radius $r$ intersect at $bold(x)_I$ given by:

$
  bold(x)_I = bold(x)_r + t_(plus.minus) bold(v)
$

where:
$
  t_(plus.minus) &= (bold(v) dot bold(u) plus.minus sqrt((bold(v) dot bold(u))^2 - v^2 (u^2 - r^2))) / v^2 \
  bold(u) &= bold(x)_s - bold(x)_r
$

If the expression under the square root is negative, there is no intersection. If it's zero, $t_+ = t_-$ and there is only one intersection.

Notice that since $t v$ is the distance to intersection, $t_-$ corresponds to the *closer one* and $t_+$ to the *further*. Depending on the application, you might want to discard negative $t$'s (intersections "behind" the ray).

= Surface normal

The surface normal $hat(bold(n))$ at an intersection is given by:

$
  bold(r) &= t_(plus.minus) bold(v) - bold(u) \
  hat(bold(n)) &= hat(bold(r))
$

= Normalized v

Notice that the expression for $t_(plus.minus)$ becomes appreciably simpler if $v = 1$:

$
  t_(plus.minus) &= bold(v) dot bold(u) plus.minus sqrt((bold(v) dot bold(u))^2 - (u^2 - r^2))
$

= Derivation

Notice that the point of intersection lies somewhere on the line defined by the ray:

$
  bold(x)_I = bold(x)_r + t bold(v)
$

for some real $t$. It also lies somewhere on the sphere:

$
  bold(x)_I = bold(x)_s + bold(r)
$

for some vector $bold(r)$ of length $r$. Combining the two equations and solving for $bold(r)$ yields:

$
  bold(x)_r + t bold(v) - bold(x)_s = bold(r)
$

To simplify the algebra, substitute $bold(x)_s - bold(x)_r = bold(u)$:

$
  t bold(v) - bold(u) = bold(r)
$

Since only the length of $bold(r)$ is known, the only thing that can be done at this point is equating the norms of both sides. Squared norms are more convenient in this particular case:

$
  (t bold(v) - bold(u))^2 &= r^2 \
  t^2 v^2 + u^2 - 2 t bold(v) dot bold(u) &= r^2 \
  v^2 t^2 - 2 bold(v) dot bold(u) t + u^2 - r^2 &= 0
$

Solving the quadratic equation and simplifying:

$
  t_(plus.minus) &= (2 bold(v) dot bold(u) plus.minus sqrt(4 (bold(v) dot bold(u))^2 - 4 v^2 (u^2 - r^2))) / (2 v^2) \
  t_(plus.minus) &= (bold(v) dot bold(u) plus.minus sqrt((bold(v) dot bold(u))^2 - v^2 (u^2 - r^2))) / v^2
$

As with any quadratic equation, there is no real solution if the expression under the square root is negative and if it's zero, the solutions coincide.

Notice that $bold(r)$ is perpendicular to the sphere at an intersection. Normalizing this vector yields the surface normal $hat(bold(n))$.