{"id":1606,"date":"2024-01-20T17:39:00","date_gmt":"2024-01-20T17:39:00","guid":{"rendered":"https:\/\/www.katsbits.com\/site\/?p=1606"},"modified":"2024-01-20T17:39:00","modified_gmt":"2024-01-20T17:39:00","slug":"map","status":"publish","type":"post","link":"https:\/\/www.katsbits.com\/site\/map\/","title":{"rendered":"Make a *.map Based Game Level in Blender (#1)"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_80 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><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><\/span><\/a><\/span><\/div>\n<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\/site\/map\/#Three_ways_to_make_a_map\" >Three ways to make a map<\/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\/site\/map\/#Setting_up_Blenders_grid_for_map_editing\" >Setting up Blenders grid for map editing<\/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\/site\/map\/#Basic_block_sizes\" >Basic block sizes<\/a><\/li><\/ul><\/nav><\/div>\n<p>Generally speaking when we want to make a <b>.map based game level<\/b> we&#8217;d traditionally use a level editor like GtkRadiant, QuArK or other tool to make the content we need. Doing this with even the most relative degree of ease often relies on learning to use what are widely regarded as being complex and unintuitive applications, even for the simplest of projects or designs.<\/p>\n<blockquote style=\"background-color: #ddecf3; color: #000;\"><p><strong>Download<\/strong>: <a title=\"Tutorial source files (ZIP)\" href=\"https:\/\/www.katsbits.com\/files\/tutorials\/katsbits_map-blender-source.zip\">KatsBits &#8211; Map Source<\/a> (c. 10 MB | *.blend, *.map, *.obj, *.mtl, *.jpg,).<\/p><\/blockquote>\n<blockquote class=\"menu_resources\"><p><strong>Resources<\/strong><br \/>\n&#8211; <a title=\"Download the Blender .map Entity Helper Kit\" href=\"https:\/\/www.katsbits.com\/site\/radiant-entity-blender\/\">Blender Entity Helper Kit<\/a><br \/>\n&#8211; <a title=\"Making .maps with Blender 2.49\" href=\"https:\/\/www.katsbits.com\/site\/exporting-models-as-bsp-maps\/\" target=\"_self\" rel=\"noopener\">Blender 2.49 .map making<\/a><br \/>\n&#8211; <a title=\"Quake III editing manual\" href=\"http:\/\/robotrenegade.com\/radiant\/manual\/index.htm\" target=\"_blank\" rel=\"noopener\">Quake III Manual<\/a><br \/>\n&#8211; <a title=\"Download GTK Radiant\" href=\"http:\/\/radiant.robotrenegade.com\/\" target=\"_self\" rel=\"noopener\">GtkRadiant download<\/a><\/p><\/blockquote>\n<p>However, this need not be the case because, with the availability of the &#8220;<b>Quake MAP (.map)<\/b>&#8221; exporter for Blender 3D, we can now use meshes and other objects to construct levels and export scenes to the text-based &#8220;<b>*.map<\/b>&#8221; format. The resulting files can then be opened or loaded directly into the aforementioned Radiant, QuArK et-al for the placement of game specific entities and finishing off (some level editors may require the .map file to be converted before use).<\/p>\n<p>In the following tutorial we&#8217;ll learn how to make a simple &#8216;indoor&#8217; type game level as well as discuss some of the basic principles behind the process along the way. A <a title=\"Learn Blender\" href=\"https:\/\/www.katsbits.com\/site\/chair\/\" target=\"_self\" rel=\"noopener\">basic knowledge of Blender 3D<\/a> and one of the variously available level editors, Radiant, <a title=\"Download Radiant\" href=\"http:\/\/radiant.robotrenegade.com\/\" target=\"_blank\" rel=\"noopener\">GtkRadiant<\/a> or QuArK, is assumed. This tutorial <b><i>requires<\/i><\/b> a version of Blender which includes the &#8220;<b>Quake MAP export<\/b>&#8221; script.<\/p>\n<p><a id=\"threeways\" name=\"threeways\"><\/a><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Three_ways_to_make_a_map\"><\/span>Three ways to make a map<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>There are essentially three construction techniques we can use to make maps in Blender. They are &#8216;<b>blocks<\/b>&#8216;, &#8216;<b>planes<\/b>&#8216; and &#8216;<b>faces<\/b>&#8216; (and\/or any combination therein). Because we&#8217;re making a specific type of &#8216;level&#8217; and not simply making a &#8216;model&#8217; that will be used <i>as<\/i> a level (the difference isn&#8217;t a semantic play on words or definition), we need to do so using tools, objects and techniques that are <b>directly analogous to the way a level editor works<\/b>, in this instance using &#8220;<b>blocks<\/b>&#8221; and &#8220;<b>volumes<\/b>&#8220;.<\/p>\n<p>For the sake of understanding what we&#8217;re doing, but without getting overly technical, blocks and volumes are used because the underlying technology behind the .map format defines areas and objects though an &#8220;<b>additive process<\/b>&#8221; which creates substance by <b>placing<\/b> material in the World Space as opposed to a &#8220;<b>subtractive process<\/b>&#8221; which <b>removes<\/b> it. It&#8217;s important to understand the distinction between the two approaches to level design and that of standard asset modelling as there are fundamental differences in both technique, and the concerns we need to be mindful of, when making a model versus making a map.<\/p>\n<div class=\"content_images\">\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-basic-shape-type.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"Basic types of object maps can be made from in Blender\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-basic-shape-type_sml.jpg\" alt=\"Basic types of object maps can be made from in Blender\" width=\"640\" height=\"240\" border=\"0\" \/><\/a><\/p>\n<p>The three basic types of structures that can be used to make maps in Blender; solid &#8220;<b>block primitives<\/b>&#8220;, individual &#8220;<b>planes<\/b>&#8221; and &#8220;<b>joined<\/b>&#8221; surfaces. Each produces a particular type of brush volume when exported<\/p>\n<\/div>\n<p>To emphasise this core point we can see in the image below the same room built using the three differing construction techniques and what this would likely mean in practice; a collection of blocks (left), a series of separate planes or panels (top-right), and a single sided joined mesh (bottom-right). Each has it&#8217;s &#8216;Pros and Cons&#8217; but as discussed above only &#8216;blocks&#8217; are directly analogous to the brush volumes used by level editors. So from here-on-in that&#8217;s what we&#8217;ll be using.<\/p>\n<blockquote><p><b>Design note<\/b>: ideally <b>planes<\/b> and <b>faces<\/b> are best avoided because they produce levels made from a &#8220;<b>thin skin<\/b>&#8221; &#8211; thin-panel brush volumes that collectively have a disproportionately high volume (number) of unique surfaces that have to be &#8216;culled&#8217; (removed) during compile. This can be extremely problematic on large or complex projects so should be avoided.<\/p><\/blockquote>\n<div class=\"content_images\">\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-three-ways-to-make_sml.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"Three ways to make a .map in Blender\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-three-ways-to-make_sml.jpg\" alt=\"Three ways to make a .map in Blender\" width=\"640\" height=\"400\" border=\"0\" \/><\/a><\/p>\n<p>Showing how each of the three main techniques to make a map relate to an actual (albeit simple) room &#8211; blocks (can be used as either a joined or multiple object mesh), planes (multiple meshes) and joined surfaces (single mesh), the preference is to use &#8216;blocks&#8217;<\/p>\n<\/div>\n<p><a id=\"mapgrid\" name=\"mapgrid\"><\/a><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Setting_up_Blenders_grid_for_map_editing\"><\/span>Setting up Blenders grid for map editing<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Before we begin we need to make sure Blenders grid matches the level editors, this ensures that whatever we make in Blender exactly matches the same type of object or construction were it to be made in the level editor (GtkRadiant in this instance), critical when making content in an &#8216;outside&#8217; application like Blender. In addition, setting the grid correctly also means objects and items can be properly &#8220;<b>snapped to the grid<\/b>&#8221; &#8211; the .map format doesn&#8217;t handle off-grid or irregular (&#8220;<b>non-axial<\/b>&#8220;) brushwork alignments too well, especially if there is a lot of it, so objects are automatically grid snapped when drawn out in the editor.<\/p>\n<p>We need to make sure then, the grid is set so <b><i>one Blender unit<\/i> is exactly equal to <i>one level editor unit<\/i><\/b>, i.e. we need to be working at actual size, a ratio of &#8220;<b>1:1<\/b>&#8220;. To set the grid in Blender press &#8220;<b>N<\/b>&#8221; to open the &#8220;<b>View Properties<\/b>&#8221; toolshelf panel. Scroll down to the &#8220;<b>Display<\/b>&#8221; subsection (click the arrow to the left of the subsection heading to expand the options if necessary) then change &#8220;<b>Scale:<\/b>&#8221; and &#8220;<b>Subdivisions:<\/b>&#8221; to &#8220;<b>8.000<\/b>&#8221; and &#8220;<b>8<\/b>&#8221; respectively. These are the two main settings we need to changed. We can also optionally change &#8220;<b>Lines:<\/b>&#8221; to &#8220;<b>100<\/b>&#8221; (or more if required for larger levels), expanding the grid so it&#8217;s visible when editing at this scale in perspective mode.<\/p>\n<blockquote><p><b>Design note<\/b>: the grid appears slightly &#8216;off&#8217; when viewed in &#8220;Perspective&#8221; mode due to an issue with Blender. This does not effect grid snapping, object sizing or any other &#8216;measurement&#8217; related functions in general or in any of the &#8220;Orthogonal&#8221; views. <b>This is a display issue only<\/b>.<\/p><\/blockquote>\n<p>With the above settings in place Blender is now replicating Radiants default grid size of &#8220;<b>Grid8<\/b>&#8221; (shortcut in Radiant is &#8220;<b>4<\/b>&#8220;) where each &#8216;minor&#8217; sub-division is an <b>8 unit cube<\/b> (grid &#8216;major&#8217; is 64 units).<\/p>\n<div class=\"content_images\">\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/default-grid-settings.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"Default grid settings in Blender\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/default-grid-settings_sml.jpg\" alt=\"Default grid settings in Blender\" width=\"640\" height=\"400\" border=\"0\" \/><\/a><\/p>\n<p>Blenders default grid is 1&#215;1 unit. This is too small a scale value when wanting to use the application to make maps that are to be used in a .map based level editor\/game<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-grid-spacing.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"Change the grid settings in Blender to &quot;8&quot; for proper map making\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-grid-spacing_sml.jpg\" alt=\"Change the grid settings in Blender to &quot;8&quot; for proper map making\" width=\"640\" height=\"400\" border=\"0\" \/><\/a><\/p>\n<p>Changing grid settings in Blender to better match the editing environment typical of most .map level editors like Radiant, QuArK, et-al <b class=\"blenderFileRef\">[see *.blend &#8220;0&#8221;]<\/b><\/p>\n<\/div>\n<p><a id=\"buildingblocks\" name=\"buildingblocks\"><\/a><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Basic_block_sizes\"><\/span>Basic block sizes<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>With the grid set in Blender we can now turn to the building material we&#8217;ll actually be using, blocks. As established previously the engine technology behind .map based design doesn&#8217;t handle arbitrary, irregular or &#8220;<b>non-axial<\/b>&#8221; brushwork too well. In order to avoid or at least limit the problems this causes the blocks we use need to be of a relatively &#8216;regular&#8217; shape and\/or size that follow, <i>in approximate fashion<\/i>, the &#8220;<a title=\"Make better textures - understanding the &quot;power-of-two&quot; rule\" href=\"https:\/\/www.katsbits.com\/site\/make-better-textures-correct-size-and-power-of-two\/\" target=\"_self\" rel=\"noopener\">power of two<\/a>&#8221; rule. The reason for this is to ensure good texture density on surfaces that also match across the different types of asset games typically use; in principle we should be able to match two similarly sized objects together, one model and one brush volume, without there necessarily being any difference between them texturally.<\/p>\n<p>There are some general guidelines to help with object sizing; for architectural surfaces, walls, floors, etc., meshes should not be too thin, anything under &#8220;<b>16 units<\/b>&#8221; is getting into the realms of being potentially problematic so it&#8217;s best to stay on, around or above that as a minimum &#8211; steps and stairs are the only general feature that can be made from smaller volumes, the standard being &#8220;<b>8&#215;8 units<\/b>&#8220;, height x depth. Anything smaller should be modeled as a static mesh because brush accuracy decreases with size. With these simple requirements established, what we actual do when making a .map based level is &#8216;block out&#8217; the design through the juxtaposition of solid shapes rather than manipulating a single mesh.<\/p>\n<div class=\"content_images\">\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-basic-block-sizes.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"Basic minimal building block sizes in Blender\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-basic-block-sizes_sml.jpg\" alt=\"Basic minimal building block sizes in Blender\" width=\"640\" height=\"400\" border=\"0\" \/><\/a><\/p>\n<p>The basic block sizes that are typically used when making meshes in Blender that are to be exported out to the .map format; the smallest for general construction shouldn&#8217;t be thinner than 16 units. The only exception are steps and stairs which are generally 8 units high (standard being 8 high, 8 deep) <b class=\"blenderFileRef\">[see *.blend &#8220;00&#8221;]<\/b><\/p>\n<\/div>\n<p>What we&#8217;ve done so far is establish that in Blender we need to make levels from regular primitive shapes which can be easily converted into brush volumes on export. The grid and it&#8217;s settings are important to make sure we&#8217;re making the map at scale and from shapes that are not irregular in character. Next, we&#8217;ll move on to <a title=\"Make a simple .map based level in Blender\" href=\"https:\/\/www.katsbits.com\/site\/map-meshes\/\" target=\"_self\" rel=\"noopener\">making a simple level using Blender<\/a>.<br \/>\n<\/p>\n<div class=\"subNav\">[<a title=\"The basics of making maps in Blender\" href=\"https:\/\/www.katsbits.com\/site\/map\/\" target=\"_self\" rel=\"noopener\">1: basics<\/a> | <a title=\"Making a .map based level\" href=\"https:\/\/www.katsbits.com\/site\/map-meshes\/\" target=\"_self\" rel=\"noopener\">2: making<\/a> | <a title=\"Adding curves to a .map based level\" href=\"https:\/\/www.katsbits.com\/site\/map-curves\/\" target=\"_self\" rel=\"noopener\">3: curves<\/a> | <a title=\"Materials, Textures and images\" href=\"https:\/\/www.katsbits.com\/site\/map-materials\/\" target=\"_self\" rel=\"noopener\">4: textures<\/a> | <a title=\"Entities, prepping and export\" href=\"https:\/\/www.katsbits.com\/site\/map-entities\/\" target=\"_self\" rel=\"noopener\">5: entities<\/a> | <a title=\"Opening the map in a level editor\" href=\"https:\/\/www.katsbits.com\/site\/map-level-editor\/\" target=\"_self\" rel=\"noopener\">6: level editor<\/a> | <a title=\".map based level design extras\" href=\"https:\/\/www.katsbits.com\/site\/map-extras\/\" target=\"_self\" rel=\"noopener\">7: extras<\/a>]<\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":1609,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14],"tags":[327,226,276,277,278,331,32,106,109,108,421,107,29],"class_list":["post-1606","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-map","tag-beginner","tag-blender-2-5x","tag-blender-2-6x","tag-blender-2-7x","tag-bsp","tag-assets","tag-gtkradiant","tag-level-design","tag-level-editing","tag-map-basics","tag-radiant","tag-tutorials"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/posts\/1606","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/comments?post=1606"}],"version-history":[{"count":3,"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/posts\/1606\/revisions"}],"predecessor-version":[{"id":1666,"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/posts\/1606\/revisions\/1666"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/media\/1609"}],"wp:attachment":[{"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/media?parent=1606"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/categories?post=1606"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/tags?post=1606"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}