{"id":6602,"date":"2022-11-18T15:50:44","date_gmt":"2022-11-18T15:50:44","guid":{"rendered":"https:\/\/www.katsbits.com\/codex\/?p=6602"},"modified":"2023-09-07T15:49:43","modified_gmt":"2023-09-07T14:49:43","slug":"rope-normal-map","status":"publish","type":"post","link":"https:\/\/www.katsbits.com\/codex\/rope-normal-map\/","title":{"rendered":"Rope &#038; Normal Map Bake"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-light-blue ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-69f203efefe44\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-69f203efefe44\"  aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.katsbits.com\/codex\/rope-normal-map\/#rope-basics\" >Rope Basics<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.katsbits.com\/codex\/rope-normal-map\/#inverted-faces\" >Inverted Faces<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.katsbits.com\/codex\/rope-normal-map\/#inverted-normals\" >Inverted Normals<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.katsbits.com\/codex\/rope-normal-map\/#rope-for-baking\" >Rope for Baking<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.katsbits.com\/codex\/rope-normal-map\/#bake-rope-normal-maps\" >Bake Rope Normal Maps<\/a><\/li><\/ul><\/nav><\/div>\n<p>Making rope in Blender is relative simple when the resulting objects are to be used <i>as is<\/i>. For normal map baking however, this approach tends to cause problems during render that cannot be resolved due to the way the effect generates the geometry necessary to create the spiral. Instead, a different approach has to be brought to bear that replies on a different type of <i>seed<\/i> object.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"rope-basics\"><\/span>Rope Basics<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Ordinarily making a &#8216;rope&#8217; in Blender is relatively straightforward; 1) add a basic &#8216;seed&#8217; shape to the Scene in the form of a <b>Mesh Circle<\/b> [1] &#8211; <i>Add \u00bb Mesh \u00bb Circle<\/i>, or a <b>Curve Circle<\/b> [2] &#8211; <i>Add \u00bb Curve \u00bb Circle<\/i>; 2) assign a <b>Screw<\/b> modifier [3] &#8211; <b><i>Modifier Properties \u00bb Add Modifier \u00bb Screw<\/i><\/b>; and 3) change the modifiers <b>Screw<\/b> [4] property to adjust the wrap or screw behaviour (and <b>Iterations<\/b> to increase\/decrease length); and\/or\/then optionally 4) adjust the objects rotation in Edit Mode to change the effects orientation relative to the Axis set in the Screw modifier.<\/p>\n<blockquote style=\"background-color: #ddecf3; color: #000;\"><p><b>Download<\/b>: Rope texture baking example file;<br \/>\n &#8211; <a href=\"https:\/\/www.katsbits.com\/files\/tutorials\/katsbits - rope normals.zip\">KatsBits Rope Normals<\/a> | c. 1.5 MB (*.blend, *.tga).\n<\/p><\/blockquote>\n<blockquote><p><b>Design note<\/b>: for basic rope making in Blender there isn&#8217;t an inherent advantage to using a Mesh over a Curve, or vice versa, as both shapes will generate &#8216;a (functional) rope&#8217;. Choice is then down to what and how the resulting rope is to be used; to bake normal maps for example, either\/or is valid.<\/p><\/blockquote>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-mesh-curve.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 100%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-mesh-curve.jpg\" alt=\"Basic 'seed' shapes for rope\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>The two most basic &#8216;seed&#8217; shapes to make rope, a <b>Mesh Circle<\/b> [1] and a <b>Curve Circle<\/b> [2].<\/i><\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-screw-modifier.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 100%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-screw-modifier.jpg\" alt=\"Assigning a Screw modifier\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Add a <b>Screw<\/b> [3] modifier from Modifier Properties to the (selected) object.<\/i><\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-screw-property.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 100%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-screw-property.jpg\" alt=\"Screw property\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Adjusting the <b>Screw<\/b> [4] property to change the shape of the resulting effect (and <b>Iterations<\/b> to change the length).<\/i><\/p>\n<h3><span class=\"ez-toc-section\" id=\"inverted-faces\"><\/span>Inverted Faces<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>However, while this approach does create &#8216;a rope&#8217;, when used to <a href=\"https:\/\/www.katsbits.com\/codex\/bake-normal-maps\/\">bake normal maps<\/a>, high-resolution to low-resolution, the maps themselves capture the normalised colours [5] incorrectly, which in-turn result in the appearance of artefacts [6] when included in a material, inaccuracies that are due entirely to the way the twist is generated; being extruded along both <i>positive<\/i> and <i>negative<\/i> axes of the seed.<\/p>\n<blockquote><p><b>Design note<\/b>: ordinarily it might be possible to compensate for the problem by duplicating the seed object and &#8216;inverting&#8217; its elements. While this cannot normally be done to mesh based seed objects (vertices cannot normally be &#8216;inverted&#8217;), it can for curves, which duplicates the effect but introduces issues with <a href=\"https:\/\/www.katsbits.com\/codex\/boolean-text\/\">z-fighting<\/a> (co-planar surfaces fighting for precedence), which in-turn requires a relatively complex material that forces <a href=\"https:\/\/www.katsbits.com\/codex\/backface-culling\/#rendered-cycles\">backface culling in Cycles<\/a> so only the correct faces are visible. However, doing this does not necessarily exclude backfaces from inclusion when texture baking because hidden faces haven&#8217;t been physically removed, they&#8217;re not not visible.<\/p><\/blockquote>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-incorrect-normalisation.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 100%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-incorrect-normalisation.jpg\" alt=\"Poorly normalised colours\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Normals baked from a standard modified mesh render incorrectly [5] both to the map capturing the normalised colours, and how that map is then exhibits render artefacts [6] when included in a material.<\/i><\/p>\n<h3><span class=\"ez-toc-section\" id=\"inverted-normals\"><\/span>Inverted Normals<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>To see this, in <b>Viewport Overlays<\/b> enable <a href=\"https:\/\/www.katsbits.com\/codex\/flip-normals\/\">Face Orientation<\/a>. Here the mesh will be tinted <b>blue<\/b> or <b>red<\/b> depending on the orientation of a given surface &#8211; <b>BLUE<\/b> [7] represents <b>OUTSIDE<\/b>, <i>positive<\/i> or <i>outward<\/i> facing surfaces; <b>RED<\/b> [8],<b>INSIDE<\/b>, <i>negative<\/i> or <i>inward<\/i> facing surfaces. In other words, looking at the twist it&#8217;s clear how the shape is being created; both sides of the seed object are extruded and twisted around the same axis, one side effectively inverted and inside-out. For normal map baking this inverts the normals, which in-turn inverts the effect and causes artefacts when rendered. To correct for this the seed object used to generate the rope has to be made a different way.<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-face-orientation.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 100%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-face-orientation.jpg\" alt=\"Inverted faces\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>The twist generated by the Screw modifier extrude along the positive [7] and negative axes of the seed object which essentially inverts one set of faces so they&#8217;re inside-out [8], which in-turn inverts the normals captured during Bake.<\/i><\/p>\n<h3><span class=\"ez-toc-section\" id=\"rope-for-baking\"><\/span>Rope for Baking<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>With the above in mind then, the solution to the problem is to change the way the seed object is constructed, it still makes use of a <b>Curve Circle<\/b> [9] or <b>Mesh Circle<\/b> [10] as the basis of the rope, but the shape differs; instead of a plain circle the shape is altered to form the basic profile of rope &#8216;strands&#8217; that can then be extruded using the same <b>Screw<\/b> modifier [11], this time however, all faces point outwards.<\/p>\n<blockquote><p><b>Design note<\/b>: although faces will now point in the same uniform direction they may still be inverted (the mesh inside-out entirely). To fix this; 1) set a negative <b>Screw<\/b> value [i] in the modifier, e.g. &#8220;<b>-4 m<\/b>&#8221; (negative 4) instead of just &#8220;<b>4 m<\/b>&#8221; (positive 4); or 2) physically invert the seed object; for a <b>Curve Circle<\/b> select the all node segments in <b>Edit Mode<\/b> and from the <b>Segments<\/b> [ii] menu click <b>Switch Direction<\/b> [iii] &#8211; <i>Segments \u00bb Switch Direction<\/i>; for a <b>Mesh Circle<\/b>, in <b>Edit Mode<\/b> select all vertices then using the <b>Rotate<\/b> tool [iv] flip the selection 180 degrees around the appropriate, single, axis, e.g. rotate 180\u00b0 around the X axis &#8211; <span class=\"shortcutkey\">R<\/span> \u00bb <span class=\"shortcutkey\">X<\/span> \u00bb <span class=\"shortcutkey\">1<\/span>, <span class=\"shortcutkey\">8<\/span>, <span class=\"shortcutkey\">0<\/span>. In both instances this (re)inverts the extruded surfaces, which then point outwards.<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-invert-negative.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-invert-negative.jpg\" alt=\"Negative Screw value\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Setting a negative <b>Screw<\/b> value [i] &#8216;inverts&#8217; the resulting mesh &#8211; faces there were pointing inwards are flipped to face outwards.<\/i><\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-invert-vertices.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-invert-vertices.jpg\" alt=\"Inverting a Screw\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Alternatively the seed object can be edited directly &#8211; for <b>Curve Circles<\/b> objects [ii] use <b>Switch Direction<\/b> [iii] in Edit Mode to invert segment nodes, which in-turn inverts faces&#8230;<\/i><\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-invert-edit-mode.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-invert-edit-mode.jpg\" alt=\"Rotate vertices\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>&#8230; for <b>Mesh Circles<\/b>, in Edit Mode use the <b>Rotate<\/b> tool [iv] to &#8216;invert&#8217; the object along a single axis by 180 degrees.<\/i>\n<\/p><\/blockquote>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-bake-compatible.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 100%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-bake-compatible.jpg\" alt=\"Bake compatible rope\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>In <b>Edit Mode<\/b> for both Curve Circle [9] and Mesh Circle [10] objects, edit the vertices (mesh) or control points (curve) appropriately to change the profile of the seed&#8230;<\/i><\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-edited-seed.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 100%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-edited-seed.jpg\" alt=\"Correct Face Orientation\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>&#8230; then assign the <b>Screw<\/b> modifier [11] and change the <b>Screw<\/b> value to shape the rope.<\/i><\/p>\n<h3><span class=\"ez-toc-section\" id=\"bake-rope-normal-maps\"><\/span>Bake Rope Normal Maps<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Once the rope section has been generated it can be <a href=\"https:\/\/www.katsbits.com\/codex\/bake-normal-maps\/\">baked as normal<\/a>; a low resolution mesh must be appropriately UV unwrapped and mapped with material set up to utilise normal maps. Both ensure the correct transfer of high-resolution mesh data. Switch to <b>Cycles<\/b> to access <b>Bake<\/b> properties and set <b>Normal<\/b> as the <b>Bake Type<\/b>. Select the high, then low resolution versions of the object and click the Bake button. Using the altered seed object the rope will then bake correctly without artefacts.<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-corrected-bake.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 100%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/normal-maps\/rope-corrected-bake.jpg\" alt=\"Correct normal map bake\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>After altering the seed object normal maps can be baked without artefacts or incorrect colour inclusion.<\/i><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":6630,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[34,32,230],"tags":[792,922,889,720,172,921,923,924,696,482],"class_list":["post-6602","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blender","category-texturing","category-tutorials","tag-bezier-curves","tag-control-points","tag-curve","tag-face-orientation","tag-normal-map","tag-screw","tag-segments","tag-switch-direction","tag-texture-bake","tag-viewport-overlays"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/posts\/6602","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/comments?post=6602"}],"version-history":[{"count":25,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/posts\/6602\/revisions"}],"predecessor-version":[{"id":6632,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/posts\/6602\/revisions\/6632"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/media\/6630"}],"wp:attachment":[{"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/media?parent=6602"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/categories?post=6602"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/tags?post=6602"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}