intersecting_objects.html 18.6 KB
Newer Older
allai5's avatar
allai5 committed
1
<!DOCTYPE html> <html lang="en-US"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=Edge"> <title>(Task 2) Intersections - </title> <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"> <link rel="stylesheet" href="/assets/css/just-the-docs-default.css"> <script type="text/javascript" src="/assets/js/vendor/lunr.min.js"></script> <script type="text/javascript" src="/assets/js/just-the-docs.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- Begin Jekyll SEO tag v2.7.1 --> <title>(Task 2) Intersections</title> <meta name="generator" content="Jekyll v4.2.0" /> <meta property="og:title" content="(Task 2) Intersections" /> <meta property="og:locale" content="en_US" /> <meta name="twitter:card" content="summary" /> <meta property="twitter:title" content="(Task 2) Intersections" /> <script type="application/ld+json"> {"headline":"(Task 2) Intersections","@type":"WebPage","url":"/pathtracer/intersecting_objects","@context":"https://schema.org"}</script> <!-- End Jekyll SEO tag --> </head> <body> <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <symbol id="svg-link" viewBox="0 0 24 24"> <title>Link</title> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"> <path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path> </svg> </symbol> <symbol id="svg-search" viewBox="0 0 24 24"> <title>Search</title> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-search"> <circle cx="11" cy="11" r="8"></circle><line x1="21" y1="21" x2="16.65" y2="16.65"></line> </svg> </symbol> <symbol id="svg-menu" viewBox="0 0 24 24"> <title>Menu</title> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-menu"> <line x1="3" y1="12" x2="21" y2="12"></line><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="18" x2="21" y2="18"></line> </svg> </symbol> <symbol id="svg-arrow-right" viewBox="0 0 24 24"> <title>Expand</title> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-chevron-right"> <polyline points="9 18 15 12 9 6"></polyline> </svg> </symbol> <symbol id="svg-doc" viewBox="0 0 24 24"> <title>Document</title> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-file"> <path d="M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z"></path><polyline points="13 2 13 9 20 9"></polyline> </svg> </symbol> </svg> <div class="side-bar"> <div class="site-header"> <a href="/" class="site-title lh-tight"> </a> <a href="#" id="menu-button" class="site-button"> <svg viewBox="0 0 24 24" class="icon"><use xlink:href="#svg-menu"></use></svg> </a> </div> <nav role="navigation" aria-label="Main" id="site-nav" class="site-nav"> <ul class="nav-list"><li class="nav-list-item"><a href="/" class="nav-list-link">Home</a></li><li class="nav-list-item"><a href="/git/" class="nav-list-link">GitHub Setup</a></li><li class="nav-list-item"><a href="/build/" class="nav-list-link">Building Scotty3D</a></li><li class="nav-list-item"><a href="#" class="nav-list-expander"><svg viewBox="0 0 24 24"><use xlink:href="#svg-arrow-right"></use></svg></a><a href="/guide/" class="nav-list-link">User Guide</a><ul class="nav-list "><li class="nav-list-item "><a href="/guide/animate_mode/" class="nav-list-link">Animate</a></li><li class="nav-list-item "><a href="/guide/layout_mode/" class="nav-list-link">Layout</a></li><li class="nav-list-item "><a href="/guide/model_mode/" class="nav-list-link">Model</a></li><li class="nav-list-item "><a href="/guide/render_mode/" class="nav-list-link">Render</a></li><li class="nav-list-item "><a href="/guide/rigging_mode/" class="nav-list-link">Rig</a></li><li class="nav-list-item "><a href="/guide/simulate_mode/" class="nav-list-link">Simulate</a></li></ul></li><li class="nav-list-item"><a href="#" class="nav-list-expander"><svg viewBox="0 0 24 24"><use xlink:href="#svg-arrow-right"></use></svg></a><a href="/meshedit/" class="nav-list-link">A2: MeshEdit</a><ul class="nav-list "><li class="nav-list-item "><a href="/meshedit/halfedge" class="nav-list-link">Halfedge Mesh</a></li><li class="nav-list-item "><a href="#" class="nav-list-expander"><svg viewBox="0 0 24 24"><use xlink:href="#svg-arrow-right"></use></svg></a><a href="/meshedit/local/" class="nav-list-link">Local Operations</a><ul class="nav-list"><li class="nav-list-item "> <a href="/meshedit/local/edge_flip" class="nav-list-link">Edge Flip Tutorial</a> </li><li class="nav-list-item "> <a href="/meshedit/local/bevel/" class="nav-list-link">Bevelling</a> </li></ul></li><li class="nav-list-item "><a href="#" class="nav-list-expander"><svg viewBox="0 0 24 24"><use xlink:href="#svg-arrow-right"></use></svg></a><a href="/meshedit/global/" class="nav-list-link">Global Operations</a><ul class="nav-list"><li class="nav-list-item "> <a href="/meshedit/global/catmull/" class="nav-list-link">Catmull-Clark Subdivision</a> </li><li class="nav-list-item "> <a href="/meshedit/global/remesh/" class="nav-list-link">Isotropic Remeshing</a> </li><li class="nav-list-item "> <a href="/meshedit/global/linear/" class="nav-list-link">Linear Subdivision</a> </li><li class="nav-list-item "> <a href="/meshedit/global/loop/" class="nav-list-link">Loop Subdivision</a> </li><li class="nav-list-item "> <a href="/meshedit/global/simplify/" class="nav-list-link">Simplification</a> </li><li class="nav-list-item "> <a href="/meshedit/global/triangulate/" class="nav-list-link">Triangulation</a> </li></ul></li></ul></li><li class="nav-list-item active"><a href="#" class="nav-list-expander"><svg viewBox="0 0 24 24"><use xlink:href="#svg-arrow-right"></use></svg></a><a href="/pathtracer/" class="nav-list-link">A3: Pathtracer</a><ul class="nav-list "><li class="nav-list-item "><a href="/pathtracer/camera_rays" class="nav-list-link">(Task 1) Camera Rays</a></li><li class="nav-list-item active"><a href="#" class="nav-list-expander"><svg viewBox="0 0 24 24"><use xlink:href="#svg-arrow-right"></use></svg></a><a href="/pathtracer/intersecting_objects" class="nav-list-link active">(Task 2) Intersections</a><ul class="nav-list"><li class="nav-list-item "> <a href="/pathtracer/ray_triangle_intersection" class="nav-list-link">Ray Triangle Intersection</a> </li><li class="nav-list-item "> <a href="/pathtracer/ray_sphere_intersection" class="nav-list-link">Ray Sphere Intersection</a> </li></ul></li><li class="nav-list-item "><a href="/pathtracer/bounding_volume_hierarchy" class="nav-list-link">(Task 3) BVH</a></li><li class="nav-list-item "><a href="/pathtracer/shadow_rays" class="nav-list-link">(Task 4) Shadow Rays</a></li><li class="nav-list-item "><a href="/pathtracer/path_tracing" class="nav-list-link">(Task 5) Path Tracing</a></li><li class="nav-list-item "><a href="#" class="nav-list-expander"><svg viewBox="0 0 24 24"><use xlink:href="#svg-arrow-right"></use></svg></a><a href="/pathtracer/materials" class="nav-list-link">(Task 6) Materials</a><ul class="nav-list"><li class="nav-list-item "> <a href="/pathtracer/dielectrics_and_transmission" class="nav-list-link">Dielectrics and Transmission</a> </li></ul></li><li class="nav-list-item "><a href="#" class="nav-list-expander"><svg viewBox="0 0 24 24"><use xlink:href="#svg-arrow-right"></use></svg></a><a href="/pathtracer/environment_lighting" class="nav-list-link">(Task 7) Environment Lighting</a><ul class="nav-list"><li class="nav-list-item "> <a href="/pathtracer/importance_sampling" class="nav-list-link">Environment Light Importance Sampling</a> </li></ul></li><li class="nav-list-item "><a href="/pathtracer/visualization_of_normals" class="nav-list-link">Visualization of normals</a></li></ul></li><li class="nav-list-item"><a href="#" class="nav-list-expander"><svg viewBox="0 0 24 24"><use xlink:href="#svg-arrow-right"></use></svg></a><a href="/animation/" class="nav-list-link">A4: Animation</a><ul class="nav-list "><li class="nav-list-item "><a href="/animation/splines" class="nav-list-link">Splines</a></li><li class="nav-list-item "><a href="/animation/skeleton_kinematics" class="nav-list-link">Skeleton Kinematics</a></li><li class="nav-list-item "><a href="/animation/skinning" class="nav-list-link">Skinning</a></li><li class="nav-list-item "><a href="/animation/particles" class="nav-list-link">Particles</a></li></ul></li></ul> </nav> <footer class="site-footer"> This site uses <a href="https://github.com/pmarsceill/just-the-docs">Just the Docs</a>, a documentation theme for Jekyll. </footer> </div> <div class="main" id="top"> <div id="main-header" class="main-header"> <div class="search"> <div class="search-input-wrap"> <input type="text" id="search-input" class="search-input" tabindex="0" placeholder="Search " aria-label="Search " autocomplete="off"> <label for="search-input" class="search-label"><svg viewBox="0 0 24 24" class="search-icon"><use xlink:href="#svg-search"></use></svg></label> </div> <div id="search-results" class="search-results"></div> </div> </div> <div id="main-content-wrap" class="main-content-wrap"> <nav aria-label="Breadcrumb" class="breadcrumb-nav"> <ol class="breadcrumb-nav-list"> <li class="breadcrumb-nav-list-item"><a href="/pathtracer/">A3: Pathtracer</a></li> <li class="breadcrumb-nav-list-item"><span>(Task 2) Intersections</span></li> </ol> </nav> <div id="main-content" class="main-content" role="main"> <h1 id="task-2-intersecting-objects"> <a href="#task-2-intersecting-objects" class="anchor-heading" aria-labelledby="task-2-intersecting-objects"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> (Task 2) Intersecting Objects </h1> <p>Now that your ray tracer generates camera rays, we need to be able to answer the core query in ray tracing: “does this ray hit this object?” Here, you will start by implementing ray-object intersection routines against the two types of objects in the starter code: triangles and spheres. Later, we will use a BVH to accelerate these queries, but for now we consider an intersection test against a single object.</p> <p>First, take a look at the <code class="language-plaintext highlighter-rouge">rays/object.h</code> for the interface of <code class="language-plaintext highlighter-rouge">Object</code> class. An <code class="language-plaintext highlighter-rouge">Object</code> can be <strong>either</strong> a <code class="language-plaintext highlighter-rouge">Tri_Mesh</code>, a <code class="language-plaintext highlighter-rouge">Shape</code>, a BVH(which you will implement in Task 3), or a list of <code class="language-plaintext highlighter-rouge">Objects</code>. Right now, we are only dealing with <code class="language-plaintext highlighter-rouge">Tri_Mesh</code>’s case and <code class="language-plaintext highlighter-rouge">Shape</code>’s case, and their interfaces are in <code class="language-plaintext highlighter-rouge">rays/tri_mesh.h</code> and <code class="language-plaintext highlighter-rouge">rays/shapes.h</code>, respectively. <code class="language-plaintext highlighter-rouge">Tri_Mesh</code> contains a BVH of <code class="language-plaintext highlighter-rouge">Triangle</code>, and in this task you will be working with the <code class="language-plaintext highlighter-rouge">Triangle</code> class. For <code class="language-plaintext highlighter-rouge">Shape</code>, you are going to work with <code class="language-plaintext highlighter-rouge">Sphere</code>s, which is the major type of <code class="language-plaintext highlighter-rouge">Shape</code> in Scotty 3D.</p> <p>Now, you need to implement the <code class="language-plaintext highlighter-rouge">hit</code> routine for both <code class="language-plaintext highlighter-rouge">Triangle</code> and <code class="language-plaintext highlighter-rouge">Sphere</code>. <code class="language-plaintext highlighter-rouge">hit</code> takes in a ray, and returns a <code class="language-plaintext highlighter-rouge">Trace</code> structure, which contains information on whether the ray hits the object and if hits, the information describing the surface at the point of the hit. See <code class="language-plaintext highlighter-rouge">rays/trace.h</code> for the definition of <code class="language-plaintext highlighter-rouge">Trace</code>.</p> <p>In order to correctly implement <code class="language-plaintext highlighter-rouge">hit</code> you need to understand some of the fields in the Ray structure defined in <code class="language-plaintext highlighter-rouge">lib/ray.h</code>.</p> <ul> <li><code class="language-plaintext highlighter-rouge">point</code>: represents the 3D point of origin of the ray</li> <li><code class="language-plaintext highlighter-rouge">dir</code>: represents the 3D direction of the ray (this direction will be normalized)</li> <li><code class="language-plaintext highlighter-rouge">time_bounds</code>: correspond to the minimum and maximum points on the ray with its x-component as the lower bound and y-component as the upper bound. That is, intersections that lie outside the [<code class="language-plaintext highlighter-rouge">ray.time_bounds.x</code>, <code class="language-plaintext highlighter-rouge">ray.time_bounds.y</code>] range should not be considered valid intersections with the primitive.</li> </ul> <p>One important detail of the Ray structure is that <code class="language-plaintext highlighter-rouge">time_bounds</code> is a mutable field of the Ray. This means that this fields can be modified by constant member functions such as <code class="language-plaintext highlighter-rouge">Triangle::hit</code>. When finding the first intersection of a ray and the scene, you almost certainly want to update the ray’s <code class="language-plaintext highlighter-rouge">time_bounds</code> value after finding each hit with scene geometry. By bounding the ray as tightly as possible, your ray tracer will be able to avoid unnecessary tests with scene geometry that is known to not be able to result in a closest hit, resulting in higher performance.</p><hr /> <h3 id="step-1-intersecting-triangles"> <a href="#step-1-intersecting-triangles" class="anchor-heading" aria-labelledby="step-1-intersecting-triangles"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> <strong>Step 1: Intersecting Triangles</strong> </h3> <p>The first intersect routine that the <code class="language-plaintext highlighter-rouge">hit</code> routines for the triangle mesh in <code class="language-plaintext highlighter-rouge">student/tri_mesh.cpp</code>.</p> <p>While faster implementations are possible, we recommend you implement ray-triangle intersection using the method described in the <a href="http://15462.courses.cs.cmu.edu/fall2017/lecture/acceleratingqueries">lecture slides</a>. Further details of implementing this method efficiently are given in <a href="ray_triangle_intersection.md">these notes</a>.</p> <p>There are two important details you should be aware of about intersection:</p> <ul> <li> <p>When finding the first-hit intersection with a triangle, you need to fill in the <code class="language-plaintext highlighter-rouge">Trace</code> structure with details of the hit. The structure should be initialized with:</p> <ul> <li><code class="language-plaintext highlighter-rouge">hit</code>: a boolean representing if there is a hit or not</li> <li><code class="language-plaintext highlighter-rouge">time</code>: the ray’s <em>t</em>-value of the hit point</li> <li><code class="language-plaintext highlighter-rouge">position</code>: the exact position of the hit point. This can be easily computed by the <code class="language-plaintext highlighter-rouge">time</code> above as with the ray’s <code class="language-plaintext highlighter-rouge">point</code> and <code class="language-plaintext highlighter-rouge">dir</code>.</li> <li><code class="language-plaintext highlighter-rouge">normal</code>: the normal of the surface at the hit point. This normal should be the interpolated normal (obtained via interpolation of the per-vertex normals according to the barycentric coordinates of the hit point)</li> </ul> </li> </ul> <!-- * When intersection occurs with the back-face of a triangle (the side of the triangle opposite the direction of the normal) you should flip the returned normal to point in that direction. That is, always return a normal pointing in the direction the ray came from! --> <p>Once you’ve successfully implemented triangle intersection, you will be able to render many of the scenes in the media directory. However, your ray tracer will be very slow!</p> <p>While you are working with <code class="language-plaintext highlighter-rouge">student/tri_mesh.cpp</code>, you should implement <code class="language-plaintext highlighter-rouge">Triangle::bbox</code> as well, which are important for task 3.</p> <h3 id="step-2-intersecting-spheres"> <a href="#step-2-intersecting-spheres" class="anchor-heading" aria-labelledby="step-2-intersecting-spheres"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> <strong>Step 2: Intersecting Spheres</strong> </h3> <p>You also need to implement the <code class="language-plaintext highlighter-rouge">hit</code> routines for the <code class="language-plaintext highlighter-rouge">Sphere</code> class in <code class="language-plaintext highlighter-rouge">student/sphapes.cpp</code>. Remember that your intersection tests should respect the ray’s <code class="language-plaintext highlighter-rouge">time_bound</code>. Because spheres always represent closed surfaces, you should not flip back-facing normals you did with triangles.</p> <p>Note: take care <strong>not</strong> to use the <code class="language-plaintext highlighter-rouge">Vec3::normalize()</code> method when computing your normal vector. You should instead use <code class="language-plaintext highlighter-rouge">Vec3::unit()</code>, since <code class="language-plaintext highlighter-rouge">Vec3::normalize()</code> will actually change the <code class="language-plaintext highlighter-rouge">Vec3</code> object passed in rather than returning a normalized version.</p><hr /> <p><a href="visualization_of_normals.md">Visualization of normals</a> might be very helpful with debugging.</p> </div> </div> <div class="search-overlay"></div> </div> </body> </html>