From fd36b2aec29eb502e34f725e0253342a32d7e01c Mon Sep 17 00:00:00 2001 From: Michael Zhang Date: Mon, 1 May 2023 01:05:04 -0500 Subject: [PATCH] progress --- exam-2/exam2.md | 163 ++++++++++++++++++++++++++++++++++++++++++++++-- exam-2/exam2.py | 12 +++- 2 files changed, 170 insertions(+), 5 deletions(-) diff --git a/exam-2/exam2.md b/exam-2/exam2.md index 933dbc1..08acec7 100644 --- a/exam-2/exam2.md +++ b/exam-2/exam2.md @@ -14,6 +14,8 @@ author: | \newcommand{\now}[1]{\textcolor{blue}{#1}} \newcommand{\todo}[0]{\textcolor{red}{\textbf{TODO}}} +[ 1 2 3 4 6 7 8 9 10 ] + ## Reflection and Refraction 1. \c{Consider a sphere $S$ made of solid glass ($\eta$ = 1.5) that has radius $r = @@ -33,7 +35,7 @@ author: | b. \c{(1 points) What is the angle of reflection $\theta_r$?} The angle of reflection always equals the angle of incidence, $\theta_r = - \theta_i = \boxed{cos^{-1}(-\frac{1}{3})}$. + \theta_i = \boxed{\cos^{-1}(-\frac{1}{3})}$. c. \c{(3 points) What is the direction of the reflected ray?} @@ -62,6 +64,27 @@ author: | e. \c{(4 points) What is the direction of the transmitted ray?} + We can just add the angle obtained above to the inverse of the normal $n' = + (-1, 2, -2)$ (since that will be transmitted through the material). For the + tangent direction, we can use the vector from the ray's origin to the + incident ray projected onto the normal, which we'll call $v = (0, 6, 6)$. + + Now we know that the relationship between the coefficients of $n'$ and $v$ is + $\tan(\theta_t)$. We can add these to obtain a point along the transmitted + ray (it doesn't actually matter where this occurs since we're going to + normalize this anyway, the proportion stays consistent regardless). So using + the unit length for the inverse normal which is $\frac{n'}{||n'||} = + (\frac{1}{3}, -\frac{2}{3}, \frac{2}{3})$ we know that the perpendicular + vector will be $\tan(\theta_t) \times (0, \frac{1}{\sqrt{2}}, + \frac{1}{\sqrt{2}})$. + + The final step is then adding these vectors together and subtracting the + interersection point: $(\frac{1}{3}, -\frac{2}{3}, \frac{2}{3}) + + \tan(\theta_t) \times (0, \frac{1}{\sqrt{2}}, \frac{1}{\sqrt{2}}) - (1, 4, + 8)$. + + \todo all the numbers are wrong + ## Geometric Transformations 2. \c{(8 points) Consider the airplane model below, defined in object @@ -72,7 +95,26 @@ author: | at the location $p = (4, 4, 7)$, with a direction of flight $w = (2, 1, -2)$ and the wings aligned with the direction $d = (-2, 2, -1)$.} - The translation matrix is + The order we want is (1) do all the rotations, and then (2) translate to the + spot we want. The rotation is done in multiple steps: + + - First we want to make sure the nose of the plane points in the correct + direction in the $xz$ plane (rotating around the $y$ axis). The desired + resulting direction is $(2, y, -2)$, so that means for a nose currently facing + the $+z$ direction which is $(0, y, 1)$, we want to rotate around by around + $-\frac{3}{4}\pi$. The transformation matrix is: + + $$ + M_1 = \begin{bmatrix} + 1 & 0 & 0 & 0 \\ + 0 & 1 & 0 & 0 \\ + 0 & 0 & 1 & 0 \\ + 0 & 0 & 0 & 1 \\ + \end{bmatrix} + $$ + + - Then we want to rotate the plane vertically, so it's pointing in the right + direction. $$ \begin{bmatrix} @@ -93,7 +135,56 @@ author: | Since the direction of flight was originally $(0, 0, 1)$, we have to transform it to $(2, 1, -2)$. -3. +3. \c{Consider the earth model shown below, which is defined in object + coordinates with its center at $(0, 0, 0)$, the vertical axis through the + north pole aligned with the direction $(0, 1, 0)$, and a horizontal plane + through the equator that is spanned by the axes $(1, 0, 0)$ and $(0, 0, 1)$.} + + a. \c{(3 points) What model transformation matrix could you use to tilt the + vertical axis of the globe by $23.5^\circ$ away from $(0, 1, 0)$, to achieve + the pose shown in the image on the right?} + + You could use a 3D rotation matrix. Since the axis of rotation is the + $z$-axis, the rotation matrix would look like: + + $$ + M = + \begin{bmatrix} + \cos(23.5^\circ) & \sin(23.5^\circ) & 0 & 0 \\ + -\sin(23.5^\circ) & \cos(23.5^\circ) & 0 & 0 \\ + 0 & 0 & 1 & 0 \\ + 0 & 0 & 0 & 1 \\ + \end{bmatrix} + $$ + + b. \c{(5 points) What series of rotation matrices could you apply to the + globe model to make it spin about its tilted axis of rotation, as suggested + in the image on the right?} + + One way would be to rotate it back to its normal orientation, apply the spin + by whatever angle $\theta(t)$ it was spinning at at time $t$, and then put it + back into its $23.5^\circ$ orientation. This rotation is done around the + $y$-axis, so the matrix looks like: + + $$ + M' = + M^{-1} + \begin{bmatrix} + \cos(\theta(t)) & 0 & \sin(\theta(t)) & 0 \\ + 0 & 1 & 0 & 0 \\ + -\sin(\theta(t)) & 0 & \cos(\theta(t)) & 0 \\ + 0 & 0 & 0 & 1 \\ + \end{bmatrix} + M + $$ + + c. \c{[5 points extra credit] What series of rotation matrices could you use + to send the tilted, spinning globe model on a circular orbit of radius $r$ + around the point $(0, 0, 0)$ within the $xz$ plane, as illustrated below?} + + In the image, the globe itself does not rotate, but I'm going to assume it + revolves around the sun at a different angle $\phi(t)$. The solution here + would be to ## The Camera/Viewing Transformation @@ -253,7 +344,39 @@ author: | ## The Projection Transformation -6. +6. \c{Consider a cube of width $2\sqrt{3}$ centered at the point $(0, 0, + -3\sqrt{3})$, whose faces are colored light grey on the top and bottom $(y = + \pm\sqrt{3})$, dark grey on the front and back $(z = -2\sqrt{3} \textrm{and} + z = -4\sqrt{3})$, red on the right $(x = \sqrt{3})$, and green on the left $(x + = -\sqrt{3})$.} + + a. \c{Show how you could project the vertices of this cube to the plane $z = + 0$ using an orthographic parallel projection:} + + i) \c{(2 points) Where will the six vertex locations be after such a + projection, omitting the normalization step?} + + ii) \c{(1 points) Sketch the result, being as accurate as possible and + labeling the colors of each of the visible faces.} + + iii) \c{(2 points) Show how you could achieve this transformation using one or + more matrix multiplication operations. Specify the matrix entries you would + use, and, if using multiple matrices, the order in which they would be + multiplied.} + + b. Show how you could project the vertices of this cube to the plane $z = 0$ + using an oblique parallel projection in the direction $d = (1, 0, \sqrt{3})$: + + i) (3 points) Where will the six vertex locations be after such a projection, + omitting the normalization step? + + ii) (2 points) Sketch the result, being as accurate as possible and labeling + the colors of each of the visible faces. + + iii) (4 points) Show how you could achieve this transformation using one or + more matrix multiplication operations. Specify the matrix entries you would + use, and, if using multiple matrices, the order in which they would be + multiplied. 7. @@ -300,6 +423,8 @@ author: | \end{bmatrix}} $$ + \todo the numbers are wrong lmao + b. \c{(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?} @@ -369,6 +494,36 @@ author: | but you should not omit any steps that are essential to the process of generating an image of a provided list of triangles.} + The most essential steps in the scan-conversion process are: + + - First, the input is given as a bunch of geometries. This includes + triangles and quads. Spheres aren't really part of the primitives, not + sure why historically but I can imagine it makes operations like + clipping monstrously more complex. + + - Then, vertices of the geometries are passed to vertex shaders, which are + custom user-defined scripts that are run in parallel on graphics hardware + that are applied to each individual vertex. This includes things like + transforming it through coordinate systems (world coordinates vs. camera + coordinates vs. normalized coordinates) in order for the rasterizer + to be able to go through and process all of the geometries quickly. + + - Clipping is done as an optimization to reduce the amount of things outside + the viewport that needs to be rendered. There are different clipping + algorithms available, but they all typically break down triangles into + smaller pieces that are all contained within the viewport. Culling is also + done to remove faces that aren't visible and thus don't need to be + rendered. + + - The rasterizer then goes through and gives pixels colors based on which + geometries contain them. This includes determining which geometries are in + front of others, usually done using a z-buffer. When a z-buffer is used, + the color of the closest object is stored and picked. During this process, + fragment shaders also influence the output. Fragment shaders are also + custom user-defined programs running on graphics hardware, and can modify + things like what color is getting output or the order of the depth buffer + based on various input factors. + 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 diff --git a/exam-2/exam2.py b/exam-2/exam2.py index ef695fd..ffacc45 100644 --- a/exam-2/exam2.py +++ b/exam-2/exam2.py @@ -33,7 +33,17 @@ def problem_1(): 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)) + theta_t = np.arcsin(1.0 / 1.5 * sin_theta_i) + print("approx answer for part d", theta_t) + + uin = unit(n_norm) + print("unit inv normal", uin) + + uperp = unit(v2) + print("uperp", uperp) + + answer_1e = uin + math.tan(theta_t) * uperp - p + print("1e answer", unit(answer_1e)) def problem_4(): print("part 4a.")