exam 2 progress

This commit is contained in:
Michael Zhang 2023-04-30 16:01:21 -05:00
parent ac6920c288
commit 6a4f173604
Signed by: michael
GPG key ID: BDA47A31A3C8EE6B
2 changed files with 167 additions and 13 deletions

View file

@ -11,29 +11,55 @@ author: |
---
\renewcommand{\c}[1]{\textcolor{gray}{#1}}
\newcommand{\now}[1]{\textcolor{blue}{#1}}
## Reflection and Refraction
1. Consider a sphere $S$ made of solid glass ($\eta$ = 1.5) that has radius $r =
1. \c{Consider a sphere $S$ made of solid glass ($\eta$ = 1.5) that has radius $r =
3$ and is centered at the location $s = (2, 2, 10)$ in a vaccum ($\eta =
1.0$). If a ray emanating from the point $e = (0, 0, 0)$ intersects $S$ at a
point $p = (1, 4, 8)$:
point $p = (1, 4, 8)$:}
a. (2 points) What is the angle of incidence $\theta_i$ ?
a. \c{(2 points) What is the angle of incidence $\theta_i$?}
First, the normal at the point $(1, 4, 8)$ is determined by subtracting
that point from the center $(2, 2, 10)$, which gets us $N = (2 - 1, 2 - 4,
10 - 8) = (1, -2, 2)$. Then, to determine the angle between
The incoming ray is in the direction $I = p - e = (1, 4, 8)$, and the normal at
that point is $N = p - s = (1, 4, 8) - (2, 2, 10) = (1, -2, 2)$. The angle can
be found by taking the opposite of the incoming ray $-I$ and using the
formula $\cos \theta_i = \frac{-I \cdot N}{|I| |N|} = \frac{(-1, -4, -8)
\cdot (1, -2, 2)}{9 \cdot 3} = \frac{-1 + 8 - 16}{27} = -\frac{1}{3}$. So the
angle $\boxed{\theta_i = \cos^{-1}(-\frac{1}{3})}$.
b. (1 points) What is the angle of reflection $\theta_r$ ?
b. \c{(1 points) What is the angle of reflection $\theta_r$?}
c. (3 points) What is the direction of the reflected ray?
d. (3 points) What is the angle of transmission $\theta_t$ ?
e. (4 points) What is the direction of the transmitted ray?
The angle of reflection always equals the angle of incidence, $\theta_r =
\theta_i = \boxed{cos^{-1}(-\frac{1}{3})}$.
Using Snell's law, we know that $\eta_1 \sin \theta_1 = \eta_2 \sin
\theta_2$. In this case, let material 1 be the vacuum, and material 2 be
the glass. Then, we have $1.0 \times \sin \theta_1$
c. \c{(3 points) What is the direction of the reflected ray?}
The reflected ray can be found by first projecting the incident ray $-I$ onto
the normalized normal $N$, which is $v = N \times |-I|\cos(\theta_i) =
(\frac{1}{3}, -\frac{2}{3}, \frac{2}{3}) \times 9 \times \frac{1}{3} = (-1,
2, -2)$. Then, we know the point on N where this happened is $p' = p + v =
(1, 4, 8) + (-1, 2, -2) = (0, 6, 6)$.
Now, we can subtract this point from where the ray originated to know the
direction to add in the other direction, which is still $(0, 6, 6)$ in this
case since the ray starts at the origin. Adding this to the point $p'$ gets
us $(0, 12, 12)$, which means a point from the origin will get reflected to
$(0, 12, 12)$.
Finally, subtract the point to get the final answer $(0, 12, 12) - (1, 4, 8)
= \boxed{(-1, 8, 4)}$.
d. \c{(3 points) What is the angle of transmission $\theta_t$?}
Using Snell's law, we know that $\eta_i \sin \theta_i = \eta_t \sin \theta_t
= 1.0 \times \sin(\cos^{-1}(-\frac{1}{3})) = 1.5 \times \sin(\theta_t)$. To
find the angle $\theta_t$ we can just solve: $\theta_t =
\sin^{-1}(\frac{2}{3} \times \sin(\cos^{-1}(-\frac{1}{3}))) \approx
\boxed{0.6796}$ (in radians).
e. \c{(4 points) What is the direction of the transmitted ray?}
## Geometric Transformations
@ -66,6 +92,26 @@ author: |
Since the direction of flight was originally $(0, 0, 1)$, we have to
transform it to $(2, 1, -2)$.
8. Consider the perspective projection-normalization matrix P which maps the
contents of the viewing frustum into a cube that extends from 1 to 1 in $x,
y, z$ (called normalized device coordinates).
Suppose you want to define a square, symmetric viewing frustum with a near
clipping plane located 0.5 units in front of the camera, a far clipping plane
located 20 units from the front of the camera, a 60 ̊vertical field of view,
and a 60 ̊horizontal field of view.
a. \c{(2 points) What are the entries in P?}
$$\begin{bmatrix}
\end{bmatrix}$$
b. (3 points) How should be matrix P be re-defined if the viewing window is
re-sized to be twice as tall as it is wide?
c. (3 points) What are the new horizontal and vertical fields of view after
this change has been made?
## Clipping
9. \c{Consider the triangle whose vertex positions, after the viewport
@ -90,4 +136,62 @@ author: |
$p_6 = (10, 8)$. Which of these would be considered to lie inside the
triangle, according to the methods taught in class?}
10. \c{When a model contains many triangles that form a smoothly curving surface
patch, it can be inefficient to separately represent each triangle in the
patch independently as a set of three vertices because memory is wasted when
the same vertex location has to be specified multiple times. A triangle
strip offers a memory-efficient method for representing connected strips
of triangles. For example, in the diagram below, the six vertices v0 .. v5
define four adjacent triangles: (v0, v1, v2), (v2, v1, v3), (v2, v3, v4),
(v4, v3, v5). [Notice that the vertex order is switched in every other
triangle to maintain a consistent counter-clockwise orientation.] Ordinarily
one would need to pass 12 vertex locations to the GPU to represent this
surface patch (three vertices for each triangle), but when the patch is
encoded as a triangle strip, only the six vertices need to be sent and the
geometry they represent will be interpreted using the correspondence pattern
just described.}
\c{(5 points) When triangle strips are clipped, however, things
can get complicated. Consider the short triangle strip shown below in the
context of a clipping cube.}
- \c{After the six vertices v0 .. v5 are sent to be clipped, what will the
vertex list be after clipping process has finished?}
- \c{How can this new result be expressed as a triangle strip? (Try to be as
efficient as possible)}
- \c{How many triangles will be encoded in the clipped triangle strip?}
## Ray Tracing vs Scan Conversion
11. \c{(8 points) List the essential steps in the scan-conversion (raster
graphics) rendering pipeline, starting with vertex processing and ending
with the assignment of a color to a pixel in a displayed image. For each
step briefly describe, in your own words, what is accomplished and how. You
do not need to include steps that we did not discuss in class, such as
tessellation (subdividing an input triangle into multiple subtriangles),
instancing (creating new geometric primitives from existing input vertices),
but you should not omit any steps that are essential to the process of
generating an image of a provided list of triangles.}
12. \c{(6 points) Compare and contrast the process of generating an image of a
scene using ray tracing versus scan conversion. Include a discussion of
outcomes that can be achieved using a ray tracing approach but not using a
scan-conversion approach, or vice versa, and explain the reasons why and why
not.}
With ray tracing, the process of generating pixels is very hierarchical.
The basic ray tracer was very simple, but the moment we even added shadows,
there were recursive rays that needed to be cast, not to mention the
jittering. None of those could be parallelized with the main one, because in
order to even figure out where to start, you need to have already performed
a lot of the calculations. (For my ray tracer implementation, I already
parallelized as much as I could using the work-stealing library `rayon`)
But with scan conversion, the majority of the transformations are just done
with matrix transformations over the geometries, which can be performed
completely in parallel with minimal branching (only depth testing is not
exactly) The rasterization process is also massively parallelizable. This
makes it faster to do on GPUs which are able to do a lot of independent
operations.

50
exam-2/exam2.py Normal file
View file

@ -0,0 +1,50 @@
import numpy as np
unit = lambda v: v/np.linalg.norm(v)
def problem_1():
p = np.array([1, 4, 8])
e = np.array([0, 0, 0])
s = np.array([2, 2, 10])
i = p - e
print("incoming", i)
print("|I| =", np.linalg.norm(i))
n = s - p
print("normal", n)
n_norm = unit(n)
print("normal_norm", n_norm)
cos_theta_i = np.dot(-i, n) / (np.linalg.norm(i) * np.linalg.norm(n))
print("part a = cos^{-1} of ", cos_theta_i)
print(np.arccos(cos_theta_i))
proj = n_norm * np.linalg.norm(i) * cos_theta_i
print("proj", proj)
p_ = p + proj
print("proj point", p_)
v2 = p_ - e
print("v2", v2)
sin_theta_i = np.sin(np.arccos(cos_theta_i))
print("sin theta_i =", sin_theta_i)
print("approx answer for part d", np.arcsin(1.0 / 1.5 * sin_theta_i))
def problem_8():
def P(left, right, bottom, top, near, far):
return np.array([
[2.0 * near / (right - left), 0, (right + left) / (right - left), 0],
[0, 2.0 * near / (top - bottom), (top + bottom) / (top - bottom), 0],
[0, 0, -(far + near) / (far - near), -(2.0 * far * near) / (far - near)],
[0, 0, -1, 0],
])
near, far = left, right = bottom, top = -1, 1
print("part 8a", P(left, right, bottom, top, near, far))
print()
problem_8()
problem_1()