index.html 23.5 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>Model - </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>Model</title> <meta name="generator" content="Jekyll v4.2.0" /> <meta property="og:title" content="Model" /> <meta property="og:locale" content="en_US" /> <meta name="twitter:card" content="summary" /> <meta property="twitter:title" content="Model" /> <script type="application/ld+json"> {"headline":"Model","@type":"WebPage","url":"/guide/model_mode/","@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 active"><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 active"><a href="/guide/model_mode/" class="nav-list-link active">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"><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 "><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">(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="/guide/">User Guide</a></li> <li class="breadcrumb-nav-list-item"><span>Model</span></li> </ol> </nav> <div id="main-content" class="main-content" role="main"> <h1 id="model"> <a href="#model" class="anchor-heading" aria-labelledby="model"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Model </h1> <p>When in <code class="language-plaintext highlighter-rouge">Model</code> mode, Scotty3D provides a polygon-based 3D modeler with basic subdivision capabilities. The central modeling paradigm is “box modeling”, i.e., starting with a simple cube, you can add progressively more detail to produce interesting 3D shapes. You can also use <em>subdivision</em> to get smooth approximations of these shapes.</p> <p>MeshEdit supports four basic actions on mesh elements (move, rotate, scale, and bevel), plus a collection of local and global mesh editing commands.</p> <p>Note that MeshEdit (and more broadly, Scotty3D) will only operate on meshes that are <em>manifold</em> (i.e., the union of faces containing any given vertex <em>v</em> is a topological disk). Likewise, all mesh operations in Scotty3D will preserve the manifold property, i.e., manifold input will always get mapped to manifold output. This property is key for ensuring that many algorithms in Scotty3D are “well-behaved”, and that it always produces nice output for other programs to use. If you load a mesh that is non-manifold, you can still use it in your scene and render with it, but editing will not be supported.</p> <h3 id="editing-mesh-elements"> <a href="#editing-mesh-elements" class="anchor-heading" aria-labelledby="editing-mesh-elements"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Editing Mesh Elements </h3> <p>In <code class="language-plaintext highlighter-rouge">Model</code> mode you can inspect mesh elements by left-clicking on vertices, edges, faces, and halfedges. Information about these elements will be shown in the left sidebar.</p> <p>In this mode you can change the geometry (i.e., the shape) of the mesh by transforming mesh elements in the same way you can transform scene objects. Note that the transformation widget again has three modes of operation, which you can toggle through by pressing the <code class="language-plaintext highlighter-rouge">r</code> key.</p> <ul> <li><code class="language-plaintext highlighter-rouge">Move</code>: click and drag on the red (X), green (Y), or blue (Z) arrow to move the object along the X/Y/Z axis. Click and drag on the red (YZ), green (XZ), or blue (XY) squares to move the object in the YZ/XZ/XY plane.</li> <li><code class="language-plaintext highlighter-rouge">Rotate</code>: click and drag on the red (X), green (Y), or blue (Z) loop to rotate the object about the X/Y/Z axis. Note that these rotations are applied relative to the current pose, so they do not necessarily correspond to smooth transformations of the X/Y/Z Euler angles.</li> <li><code class="language-plaintext highlighter-rouge">Scale</code>: click and drag on the red (X), green (Y), or blue(Z) block to scale the object about the X/Y/Z axis. Again note that this scale is applied relative to the current pose.</li> </ul> <p><img src="model_select.png" alt="selecting an edge" /></p> <h3 id="beveling"> <a href="#beveling" class="anchor-heading" aria-labelledby="beveling"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Beveling </h3> <p>The bevel action creates a new copy of the selected element that is inset and offset from the original element. Clicking and dragging on an element will perform a bevel; the horizontal motion of the cursor controls the amount by which the new element shrinks or expands relative to the original element, and the vertical motion of the cursor controls the amount by which the new element is offset (in the normal direction) from the original element. It is important to note that a new element will be created upon click <em>even if no inset or offset is applied</em>. Therefore, if you’re not careful you may end up with duplicate elements that are not immediately visible. (To check, you can drag one of the vertices mode.)</p> <p>There are three possible types of bevels:</p> <ul> <li>Vertex Bevel: The selected vertex <em>v</em> is replaced by a face <em>f</em> whose vertices are connected to the edges originally incident on <em>v</em>. The new face is inset (i.e., shunken or expanded) by a user-controllable amount.</li> </ul> <video src="/guide/model_mode/vertex_bevel.mp4" controls="" preload="" muted="" loop="" style="max-width: 100%; margin: 0 auto;"></video> <ul> <li>Edge Bevel: The selected edge <em>e</em> is replaced by a face <em>f</em> whose vertices are connected to the edges originally incident on the endpoints of <em>e</em>. The new face is inset and offset by some user-controllable amount, as with the vertex bevel.</li> </ul> <video src="/guide/model_mode/edge_bevel.mp4" controls="" preload="" muted="" loop="" style="max-width: 100%; margin: 0 auto;"></video> <ul> <li>Face Bevel: The selected face <em>f</em> is replaced by a new face <em>g</em>, as well as a ring of faces around <em>g</em>, such that the vertices of <em>g</em> connect to the original vertices of <em>f</em>. The new face is inset and offset by some user-controllable amount.</li> </ul> <video src="/guide/model_mode/face_bevel.mp4" controls="" preload="" muted="" loop="" style="max-width: 100%; margin: 0 auto;"></video> <h3 id="local-connectivity-editing"> <a href="#local-connectivity-editing" class="anchor-heading" aria-labelledby="local-connectivity-editing"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Local Connectivity Editing </h3> <p>In addition to beveling, a variety of commands can be used to alter the connectivity of the mesh (for instance, splitting or collapsing edges). These commands are applied by selecting a mesh element (in any mode) and pressing the appropriate key, as listed below. Local mesh editing operations include:</p> <ul> <li>Erase Vertex: The selected vertex <em>v</em> together with all incident edges and faces will be replaced with a single face <em>f</em>, that is the union of all faces originally incident on <em>v</em>.</li> </ul> <video src="/guide/model_mode/erase_vertex.mp4" controls="" preload="" muted="" loop="" style="max-width: 100%; margin: 0 auto;"></video> <ul> <li>Erase Edge: The selected edge <em>e</em> will be replaced with the union of the faces containing it, producing a new face <em>e</em> (if <em>e</em> is a boundary edge, nothing happens).</li> </ul> <video src="/guide/model_mode/erase_edge.mp4" controls="" preload="" muted="" loop="" style="max-width: 100%; margin: 0 auto;"></video> <ul> <li>Edge Collapse: The selected edge <em>e</em> is replaced by a single vertex <em>v</em>. This vertex is connected by edges to all vertices previously connected to either endpoint of <em>e</em>. Moreover, if either of the polygons containing <em>e</em> was a triangle, it will be replaced by an edge (rather than a degenerate polygon with only two edges).</li> </ul> <video src="/guide/model_mode/collapse_edge.mp4" controls="" preload="" muted="" loop="" style="max-width: 100%; margin: 0 auto;"></video> <ul> <li>Face Collapse: The selected face <em>f</em> is replaced by a single vertex <em>v</em>. All edges previously connected to vertices of <em>f</em> are now connected directly to <em>v</em>.</li> </ul> <video src="/guide/model_mode/collapse_face.mp4" controls="" preload="" muted="" loop="" style="max-width: 100%; margin: 0 auto;"></video> <ul> <li>Edge Flip: The selected edge <em>e</em> is “rotated” around the face, in the sense that each endpoint moves to the next vertex (in counter-clockwise order) along the boundary of the two polygons containing <em>e</em>.</li> </ul> <video src="/guide/model_mode/edge_flip.mp4" controls="" preload="" muted="" loop="" style="max-width: 100%; margin: 0 auto;"></video> <ul> <li>Edge Split: [Note: this method is for triangle meshes only!] The selected edge <em>e</em> is split at its midpoint, and the new vertex <em>v</em> is connected to the two opposite vertices (or one in the case of a surface with boundary).</li> </ul> <video src="/guide/model_mode/edge_split.mp4" controls="" preload="" muted="" loop="" style="max-width: 100%; margin: 0 auto;"></video> <h3 id="global-mesh-processing"> <a href="#global-mesh-processing" class="anchor-heading" aria-labelledby="global-mesh-processing"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Global Mesh Processing </h3> <p>A number of commands can be used to create a more global change in the mesh (e.g., subdivision or simplification). These commands can be applied by pressing the appropriate sidebar button with a mesh selected. Note that in scenes with multiple meshes (e.g., those used by the path tracer), this command will be applied only to the selected mesh.</p> <ul> <li>Triangulate: Each polygon is split into triangles.</li> </ul> <video src="/guide/model_mode/triangulate.mp4" controls="" preload="" muted="" loop="" style="max-width: 100%; margin: 0 auto;"></video> <ul> <li>Linear Subdivision: Each polygon in the selected mesh is split into quadrilaterals by inserting a vertex at the midpoint and connecting it to the midpoint of all edges. New vertices are placed at the average of old vertices so that, e.g., flat faces stay flat, and old vertices remain where they were.</li> </ul> <video src="/guide/model_mode/linear_subd.mp4" controls="" preload="" muted="" loop="" style="max-width: 100%; margin: 0 auto;"></video> <ul> <li>Catmull-Clark Subdivision: <em>[Note: this method is for meshes without boundary only!]</em> Just as with linear subdivision, each polygon is split into quadrilaterals, but this time the vertex positions are updated according to the <a href="https://en.wikipedia.org/wiki/Catmull_Clark_subdivision_surface">Catmull-Clark subdivision rules</a>, ultimately generating a nice rounded surface.</li> </ul> <video src="/guide/model_mode/catmull_subd.mp4" controls="" preload="" muted="" loop="" style="max-width: 100%; margin: 0 auto;"></video> <ul> <li>Loop Subdivision: <em>[Note: this method is for triangle meshes without boundary only!]</em> Each triangle is split into four by connecting the edge midpoints. Vertex positions are updated according to the <a href="https://en.wikipedia.org/wiki/Loop_subdivision_surface">Loop subdivision rules</a>.</li> </ul> <video src="/guide/model_mode/loop_subd.mp4" controls="" preload="" muted="" loop="" style="max-width: 100%; margin: 0 auto;"></video> <ul> <li>Isotropic Remeshing: <em>[Note: this method is for triangle meshes only!]</em> The mesh is resampled so that triangles all have roughly the same size and shape, and vertex valence is close to regular (i.e., about six edges incident on every vertex).</li> </ul> <video src="/guide/model_mode/remesh.mp4" controls="" preload="" muted="" loop="" style="max-width: 100%; margin: 0 auto;"></video> <ul> <li>Simplification <em>[Note: this method is for triangle meshes only!]</em> The number of triangles in the mesh is reduced by a factor of about four, aiming to preserve the appearance of the original mesh as closely as possible.</li> </ul> <video src="/guide/model_mode/simplify.mp4" controls="" preload="" muted="" loop="" style="max-width: 100%; margin: 0 auto;"></video> <h3 id="key-bindings"> <a href="#key-bindings" class="anchor-heading" aria-labelledby="key-bindings"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Key Bindings </h3> <div class="table-wrapper"><table> <thead> <tr> <th style="text-align: center">Key</th> <th style="text-align: center">Command</th> </tr> </thead> <tbody> <tr> <td style="text-align: center"><code class="language-plaintext highlighter-rouge">c</code></td> <td style="text-align: center">Center the camera on the current element.</td> </tr> <tr> <td style="text-align: center"><code class="language-plaintext highlighter-rouge">m</code></td> <td style="text-align: center">Use the <code class="language-plaintext highlighter-rouge">Move</code> tool.</td> </tr> <tr> <td style="text-align: center"><code class="language-plaintext highlighter-rouge">r</code></td> <td style="text-align: center">Use the <code class="language-plaintext highlighter-rouge">Rotate</code> tool.</td> </tr> <tr> <td style="text-align: center"><code class="language-plaintext highlighter-rouge">s</code></td> <td style="text-align: center">Use the <code class="language-plaintext highlighter-rouge">Scale</code> tool.</td> </tr> <tr> <td style="text-align: center"><code class="language-plaintext highlighter-rouge">b</code></td> <td style="text-align: center">Use the <code class="language-plaintext highlighter-rouge">Bevel</code> tool.</td> </tr> <tr> <td style="text-align: center"><code class="language-plaintext highlighter-rouge">v</code></td> <td style="text-align: center">Select the current halfedge’s vertex</td> </tr> <tr> <td style="text-align: center"><code class="language-plaintext highlighter-rouge">e</code></td> <td style="text-align: center">Select the current halfedge’s edge</td> </tr> <tr> <td style="text-align: center"><code class="language-plaintext highlighter-rouge">f</code></td> <td style="text-align: center">Select the current halfedge’s face</td> </tr> <tr> <td style="text-align: center"><code class="language-plaintext highlighter-rouge">t</code></td> <td style="text-align: center">Select the current halfedge’s twin</td> </tr> <tr> <td style="text-align: center"><code class="language-plaintext highlighter-rouge">n</code></td> <td style="text-align: center">Select the current halfedge’s next</td> </tr> <tr> <td style="text-align: center"><code class="language-plaintext highlighter-rouge">h</code></td> <td style="text-align: center">Select the current element’s halfedge</td> </tr> <tr> <td style="text-align: center"><code class="language-plaintext highlighter-rouge">delete</code></td> <td style="text-align: center">Erase the currently selected vertex or edge.</td> </tr> </tbody> </table></div> </div> </div> <div class="search-overlay"></div> </div> </body> </html>