{"id":4500,"date":"2022-03-12T00:00:27","date_gmt":"2022-03-12T00:00:27","guid":{"rendered":"https:\/\/www.katsbits.com\/codex\/?p=4500"},"modified":"2023-09-07T15:50:20","modified_gmt":"2023-09-07T14:50:20","slug":"lettered-tiles","status":"publish","type":"post","link":"https:\/\/www.katsbits.com\/codex\/lettered-tiles\/","title":{"rendered":"Learn Blender &#8211; Lettered Game Tiles"},"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-69f1b70241920\" 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-69f1b70241920\"  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\/lettered-tiles\/#description\" >Description<\/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\/lettered-tiles\/#timestamps\" >Timestamps<\/a><\/li><\/ul><\/nav><\/div>\n<p><video poster=\"https:\/\/katsbits.com\/images\/tutorials\/lettered-tiles\/lettered-tiles_poster.jpg\" controls=\"controls\" width=\"100%\" height=\"auto\"><source src=\"https:\/\/www.katsbits.com\/media\/lettered-tiles.mp4\" type=\"video\/mp4\" \/><!--<source src=\"https:\/\/www.katsbits.com\/images\/tutorials\/collections\/collection-shortcut.ogg\" type=\"video\/ogg\" \/>\n<source src=\"https:\/\/www.katsbits.com\/images\/tutorials\/collections\/collection-shortcut.webm\" type=\"video\/webm\" \/>--><\/video><br \/>\n<video poster=\"https:\/\/katsbits.com\/images\/tutorials\/lettered-tiles\/lettered-tiles-bake_poster.jpg\" controls=\"controls\" width=\"100%\" height=\"auto\"><source src=\"https:\/\/www.katsbits.com\/media\/lettered-tiles-bake.mp4\" type=\"video\/mp4\" \/><!--<source src=\"https:\/\/www.katsbits.com\/images\/tutorials\/collections\/collection-shortcut.ogg\" type=\"video\/ogg\" \/>\n<source src=\"https:\/\/www.katsbits.com\/images\/tutorials\/collections\/collection-shortcut.webm\" type=\"video\/webm\" \/>--><\/video><\/p>\n<h3><span class=\"ez-toc-section\" id=\"description\"><\/span>Description<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>In this simple exercise to learn Blender (compatible with any version) we make a lettered &#8216;Scrabble&#8217; style tile that can be duplicated to make a set. As with other projects of this type, although seemingly straightforward, the object has to be laid out with a mind for duplication, especially if a full set of letters or game tiles are needed. To this end <b>loop cut<\/b> is used to control the tiles shape once a <b>Subdivision Surface<\/b> modifier is assigned, letters and numerical values then being decals that sit above the surface, textured using a <b>sheet<\/b>.<\/p>\n<p>In part two we look at using the high resolution tile mesh to <b>Bake<\/b> a normal map that better facilitates the creations of a game-ready version of the tile (and subsequent set). A low resolution version that matches the general structure of the high resolution needs to be made first, which is then assigned a material and <a href=\"https:\/\/www.katsbits.com\/codex\/uv-editing\/\">UV Unwrapped and UV Mapped<\/a> before <a href=\"https:\/\/www.katsbits.com\/codex\/bake-normal-maps\/\">Texture Baking<\/a>. As normal maps are being used, the letter stencil can also be converted to add a little depth or height to the tile as required.<\/p>\n<p><b>Suitability<\/b>: beginners or anyone wanting a simple exercise to get more familiar with Blender (Blender 3.x shown but any version from Blender 2.8x onwards can be used).<\/p>\n<p><b>Duration<\/b>: c. 1 hr 30 mins (01:30:00) total.<br \/>\n<b>Info<\/b>: 1080p | c. 600 MB.<br \/>\n<b>Source<\/b>: <a href=\"https:\/\/www.katsbits.com\/files\/tutorials\/katsbits - lettered tiles.zip\">KatsBits \u2013 Lettered Tiles<\/a> (zip c. 3 MB \u2013 *.blend, *.psd, *.tga).<\/p>\n<blockquote><p><b>Design note<\/b>: once a <b>Subdivision Surface<\/b> modifier is assigned, the shape of the tile is largely defined by the distribution of edges and distances between them, in other words, corner curvature or squareness is regulated by altering the distance between the leading edge of a corner [1] and neighbouring edges [2]. In this way different edge and corner styles can be created whilst maintaining the same fundamental shape.<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/corner-shapes.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/corner-shapes.jpg\" alt=\"Mesh structure defines subdivisions\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/corner-shape-subd.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/corner-shape-subd.jpg\" alt=\"Subdivided edges and corner shapes\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Although Subdivision defines the quality of an object appearance, how that manifests is defined by the underlying structure of the mesh and edge\/loop distribution. In this way different styles of corner can be created from different edge [1] and loop [2] layouts.<\/i><\/p>\n<p>Edge and corner curvature can also be defined using <b>Bevel<\/b>, either as the <b>Bevel tool<\/b> [3] or the <b>Bevel modifier<\/b> [4]. In either case however, they are not as immediately controllable, the Bevel tool for example is selectively assigned and can cause edge collapse, overlap and bad geometry generally, whereas the Bevel modifier typically applies the effect uniformly unless otherwise controlled by the modifier.<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/bevel-tool.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/bevel-tool.jpg\" alt=\"Bevel Tool\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/bevel-modifier.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/bevel-modifier.jpg\" alt=\"Bevel Modifier\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Edges and corners can be shaped using the Bevel tool [3] or Bevel modifier [4] but are not as flexible as loop cuts in terms of making adjustments after the fact.<\/i><\/p>\n<p>Using decals in this context is an effective way to add text to an object non-destructively, i.e. meshes don&#8217;t need to fixed, limiting later adjustment or modification, as might be the case using <a href=\"https:\/\/www.katsbits.com\/codex\/boolean\/\">Boolean<\/a> [5]; text is Line Art and must be converted to mesh data before use, the cut-out effect then being reliant on both text mesh and tile mesh resolution for clean intersection [6], which itself cannot be edited, e.g. material assigned, until the operation is made real (Apply).<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/letters-boolean.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/letters-boolean.jpg\" alt=\"Boolean text in Blender\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Text can be Boolean [5] added or subtracted but this tends to be unpredictable and inconstant based on the shape being used (font design), &#8216;A&#8217;, &#8216;H&#8217;, &#8216;W&#8217; for example, may create relative clean cut-outs, whereas &#8216;G&#8217;, &#8216;C&#8217;, &#8216;S&#8217; might not.<\/i><\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/letters-modifier-stack-order.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/letters-modifier-stack-order.jpg\" alt=\"Modifier stack order\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>The effects attributed to modifiers depends where they appear in the stack panel [6], a Boolean text operation above Subdivision for example tends to result in the operation being affected by whatever sits below in the stack, which can cause issues if meshes need to remain editable.<\/i><\/p>\n<p>Depending on what the tiles are for they can be grouped using <b>Parent<\/b>, either to themselves or to a controlling object like an <b>Empty<\/b>. Simply select each tiles components; tile, letter and number plain &#8211; tile can be selected last to make it the &#8216;parent&#8217; object. Then from the <b>Object<\/b> menu select <b>Parent<\/b>, <b>Object<\/b> &#8211; <b><i>Object \u00bb Parent \u00bb Object<\/i><\/b> &#8211; then in the <b>Make Parent<\/b> overlay that appears (typically bottom-left), set <b>Object<\/b> and check <b>Keep Transform<\/b>. Selecting and moving the tile (or parent object) then moves the group as a whole &#8211; this approach to organisation keeps projects manageable because modifiers aren&#8217;t applied and meshes are not then displayed in the resource intensive, raw and high resolution form.<\/p>\n<p><video poster=\"https:\/\/katsbits.com\/images\/tutorials\/lettered-tiles\/lettered-tiles-parent_poster.jpg\" controls=\"controls\" width=\"98.5%\" height=\"auto\"><source src=\"https:\/\/www.katsbits.com\/media\/lettered-tiles-parent.mp4\" type=\"video\/mp4\" \/><!--<source src=\"https:\/\/www.katsbits.com\/images\/tutorials\/collections\/collection-shortcut.ogg\" type=\"video\/ogg\" \/>\n<source src=\"https:\/\/www.katsbits.com\/images\/tutorials\/collections\/collection-shortcut.webm\" type=\"video\/webm\" \/>--><\/video><br \/>\n<i>Grouping objects informally using Parent rather than fixing object and joining them together using <a href=\"https:\/\/www.katsbits.com\/codex\/join-meshes\/\">Join<\/a> means they can be edited later if needed without breaking anything to do so.<\/i><\/p>\n<p>If the material assigned to the tile is simple, i.e. just a <b>Base Color<\/b> assignment, the mesh won&#8217;t need to be <a href=\"https:\/\/www.katsbits.com\/codex\/uv-editing\/\">UV Unwrapped<\/a> or <a href=\"https:\/\/www.katsbits.com\/codex\/uv-maps\/\">UV Mapped<\/a> [7] because the property (Base Color) is uniformly applied to the object. Similarly for any of the procedural textures patterns that can be used [8] that rely on the objects physical characteristics, height, width, depth or more broadly volume, rather than the presence of any image mapping.<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/no-uvmap-procedural.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/no-uvmap-procedural.jpg\" alt=\"No UV Map required\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Without a UV Map [7], two procedural textures, a base color (<i>Add \u00bb Texture \u00bb Image Texture<\/i>) and pattern  (<i>Add \u00bb Texture \u00bb Wave Texture<\/i>) [8], are passed through an <a href=\"https:\/\/www.katsbits.com\/codex\/texture-blending\/\">RGB Mix<\/a> shader (<i>Add \u00bb Color \u00bb Mix RGB<\/i>) to create a basic textured pattern that&#8217;s mapped to the object based on its dimensions or greater volume rather than it having a UVs.<\/i><\/p>\n<p>For the <b>Bake<\/b> process to work properly both high and low resolution tile need to be positioned coincidentally, that is, in the same place. This can be checked by selecting each object in turn and looking at their <b>Location<\/b> coordinates in the <b>Sidebar<\/b> under <b>View<\/b> (<span class=\"shortcutkey\">N<\/span>) [9], or in <b>Object Properties<\/b> under <b>Transform<\/b> [10]. Each needs to use the same <b>X<\/b>, <b>Y<\/b> and <b>Z<\/b> values (location is relative to the <a href=\"https:\/\/www.katsbits.com\/codex\/origin\/\">Origin<\/a> of an object, if this differs between the two tiles the coordinates may differ even though the tiles might sit in the same place).<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/tile-location.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/tile-location.jpg\" alt=\"Tile location before Bake\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Both versions of the tile need to be in the same location for <b>Bake<\/b> to work properly. Use <b>Transform<\/b> data in <b>Sidebar<\/b> [9] or <b>Object Properties<\/b> [10] to adjust their position relative to each other.<\/i><\/p>\n<p>Because <b>Bake<\/b> utilises the low resolution objects UV layout it&#8217;s best to unwrap the the mesh so the overall map uses as much space as possible relative to the image mapped to the object itself. Here <b>UV Seams<\/b> can be marked across the mesh to selectively split UVs so the map lays out flat with minimal distortion or warping, which will similarly distort or warp the mapped image. In Edge selection mode then, select the edges to be marked and  from the <b>Edge<\/b> menu click <b>Mark Seam<\/b> &#8211; <i><b>Edge \u00bb Mark Seam<\/b><\/i> &#8211; to tag the selection which will immediately highlight orange.<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/uv-map-waste.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/uv-map-waste.jpg\" alt=\"UV map that wastes space\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/uv-map-optimised.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/uv-map-optimised.jpg\" alt=\"Optimised UV Map\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Bake relies on texture usage so UVs should be mapped to utilise as much texture space as possible, image-top would result in a baked normal map of lower detailing than image-bottom.<\/i><\/p>\n<p>Normal maps generated using 2D software, converters and filters often appear inverted because the R, G, and B colour channels are not orientated relative to the 3D application rendering the effect. The fix for this is to &#8216;<i>swizzle<\/i>&#8216; a channel, typically green (G), to realign the image. How this is done exactly differs per application but typically requires a colour channel selection then it being &#8216;flipped&#8217; or &#8216;inverted&#8217;, in <b>Affinity Photo<\/b> for example this is done selecting the channel [11] then in the <b>Adjustment<\/b> panel selecting and applying the <b>Invert<\/b> filter [12]; in <b>GIMP<\/b> in the <b>Channels<\/b> panel [13] select the respective channel [14] then in the <b>Color<\/b> menu select <b>Invert<\/b> [15].<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/swizzle-affinity.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/swizzle-affinity.jpg\" alt=\"Swizzling a Normal Map\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/swizzle-gimp.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/swizzle-gimp.jpg\" alt=\"Swizzled Normal Map\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Normal maps generated using 2D applications or image converters tend to produce images that require either the green or red channel to be &#8216;swizzled&#8217; or inverted to correct the orientation of the effect so it renders correctly. In Affinity (image-top) this is done using an <b>Adjustment<\/b> filter [12], in GIMP (image-bottom) a <b>Color<\/b> [15] operation.<\/i><\/p>\n<p>When working with transparency, images that are masked in some way typically exhibit an edge &#8216;halo&#8217;, an artefact of aliasing efforts to smooth text, as in the case, that inadvertently include background colours [16]. Although the type of mask used to render transparency can alleviate the issue to a degree, it has to be dealt with at source, on the image itself. In practice this generally means the diffuse (Base Color) image being a single uniform colour, or the areas immediately surrounding each element has to be expanded to compensate for any bleed [17].<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/texture-halo.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/texture-halo.jpg\" alt=\"Halo around letters\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/texture-no-halo.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/lettered-tiles\/texture-no-halo.jpg\" alt=\"No image halo\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Masked images tend to display a &#8216;halo&#8217; around masked elements due to aliasing and pixel bleed [16]. To avoid this the diffuse (Base Color) image assigned to the material should consist of a single colour or sufficient colouration to compensate for any leaching [17].<\/i><\/p><\/blockquote>\n<h3><span class=\"ez-toc-section\" id=\"timestamps\"><\/span>Timestamps<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Times are approximate;<br \/>\n<b>Video 1<\/b> \u2013 High-resolution Tile.<br \/>\n\u2013 00:00 : Overview.<br \/>\n&#8211; 00:30 : Tile Meshing.<br \/>\n\u2013 13:00 : Tile Material.<br \/>\n\u2013 18:00 : Image Editing Letters &#038; Numbers.<br \/>\n\u2013 25:00 : Tile Letter.<br \/>\n\u2013 31:00 : Tile Number.<\/p>\n<p><b>Video II<\/b> \u2013 Normal Maps<br \/>\n\u2013 00:00 : Overview.<br \/>\n\u2013 02:30 : Tile Meshing &#038; Material.<br \/>\n\u2013 09:00 : UV Unwrapping.<br \/>\n&#8211; 16:30 : Bake (Rendered) Normal Map (tile).<br \/>\n\u2013 25:00 : Material + Normal Map.<br \/>\n&#8211; 31:00 : 2D Converted Normal Map (letters).<\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":5686,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[782,34,810,230],"tags":[265,853,852,809,172,834,851,700,758,696,855,854,734,635],"class_list":["post-4500","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-beginner","category-blender","category-learn-blender-2","category-tutorials","tag-beginner","tag-decals","tag-game-assets","tag-learn-blender","tag-normal-map","tag-opacity-mask","tag-scrabble","tag-swizzle","tag-text","tag-texture-bake","tag-texture-halo","tag-texture-sheet","tag-uv-mapping","tag-uv-unwrapping"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/posts\/4500","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=4500"}],"version-history":[{"count":34,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/posts\/4500\/revisions"}],"predecessor-version":[{"id":5725,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/posts\/4500\/revisions\/5725"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/media\/5686"}],"wp:attachment":[{"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/media?parent=4500"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/categories?post=4500"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/tags?post=4500"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}