{"id":8691,"date":"2024-04-01T17:18:23","date_gmt":"2024-04-01T16:18:23","guid":{"rendered":"https:\/\/www.katsbits.com\/codex\/?p=8691"},"modified":"2024-04-01T17:18:23","modified_gmt":"2024-04-01T16:18:23","slug":"map-entities-blender","status":"publish","type":"post","link":"https:\/\/www.katsbits.com\/codex\/map-entities-blender\/","title":{"rendered":"MAP Entities in Blender (Radiant Proxy Objects)"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_83 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-6a161bcc720d6\" 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-6a161bcc720d6\"  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\/map-entities-blender\/#description\" >Description<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.katsbits.com\/codex\/map-entities-blender\/#entity-object\" >Entity Object<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.katsbits.com\/codex\/map-entities-blender\/#entity-scale\" >Entity Scale<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.katsbits.com\/codex\/map-entities-blender\/#entity-duplication\" >Entity Duplication<\/a><\/li><\/ul><\/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\/map-entities-blender\/#timestamps\" >Timestamps<\/a><\/li><\/ul><\/nav><\/div>\n<div style=\"background-color: black; position: relative; padding-bottom: 56.25%; padding-top: 25px; height: 0; overflow: hidden; max-width: 100%;\"><center><iframe style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\" src=\"https:\/\/rumble.com\/embed\/v4k892u\/?pub=d3lcu\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/center><\/div>\n<h3><span class=\"ez-toc-section\" id=\"description\"><\/span>Description<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>In this exercise we take a look at making game entities in Blender for export using the Blender MAP Export script. When designing a game level in Blender, the simplest solution for game entity placement is to use appropriately shaped meshes. These are however, exported as brush volumes like other mesh objects. Instead <strong>Empty<\/strong> objects can be used, which can be resized to act as visual proxies for game specific entities they will be replaced by in Radiant.<\/p>\n<p><b>Duration<\/b>: total c. 15 mins (00:15:00).<br \/>\n<b>Info<\/b>: 1080p.<br \/>\n<b>Suitability<\/b>: Beginner+.<br \/>\n<b>Source<\/b>: <a href=\"https:\/\/www.katsbits.com\/files\/blender\/katsbits - example map entity test.zip\">KatsBits \u2013 MAP Entity Test<\/a> (c. 200 KB | *.blend, *.map).<br \/>\n<b>Product ID<\/b>: n\/a.<\/p>\n<blockquote><p><strong>Design note<\/strong>: additional considerations to keep in mind when using Blender to make game levels for export to Radiant;<\/p>\n<h4><span class=\"ez-toc-section\" id=\"entity-object\"><\/span>Entity Object<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Entity objects do not have dimensions like mesh objects because they are basically little more than a positional marker, a visual aid that indicates a set of XYZ coordinates in space. While there are different designs available [1], for level editing in Blender the Cube is optimal because its shape can be changed to reflect Radiants linear, blocky, editing environment.<\/p>\n<div style=\"background-color: #fc0; color: #000; width:98.5%; padding: 1.0em;\"><strong>Important<\/strong>: be sure to set up <a href=\"https:\/\/www.katsbits.com\/codex\/export-map-blender\/\">Blenders Units to match Radiant<\/a>.<\/div>\n<p><a href=\"\/\/www.katsbits.com\/images\/tutorials\/map-editing\/empty-display-as.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/map-editing\/empty-display-as.jpg\" alt=\"Empty object types\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Accessed from <strong>Object Data Properties<\/strong>, Empty&#8217;s can be shown as different types of marker selecting an option from the <strong>Display As<\/strong> [1] list. For brush-based content creation Cube is preferred as it matches Radiants environment.<\/i><\/p>\n<h4><span class=\"ez-toc-section\" id=\"entity-scale\"><\/span>Entity Scale<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>When initially dropped into the scene, Empty objects are the same size as the default Cube mesh, that is 2 x 2 x 2 Units (or Meters). As they do not have <strong>Dimensions<\/strong> but do have <strong>Scale<\/strong> their size can be adjusting using a simple calculation; as their default size is known &#8211; <em>2 x 2 x 2 units<\/em>, and the size of the game-entity the Empty is a proxy for is known, i.e. <em>16 x 16 x 16 units<\/em> for an <strong>info_null<\/strong>, this means the Empty&#8217;s scaling just needs to be multiplied by <strong>8<\/strong>; <strong>2 x 8 = 16<\/strong>. <\/p>\n<div style=\"background-color: #E7FAEA; color: #000; width:98.5%; padding: 1.0em;\">Radiant Entity \/ 2 = <em>[n]<\/em><br \/>\nBlender Empty x <em>[n]<\/em> = <em>[y]<\/em><\/div>\n<p>For example;<\/p>\n<div style=\"background-color: #E7FAEA; color: #000; width:98.5%; padding: 1.0em;\"><strong>weapon_shotgun<\/strong> is 32 x 32 x 32 \/ 2 = <strong>16<\/strong><br \/>\nBlender Empty is <strong>2 x 16<\/strong> = 32<\/div>\n<p>To do this, in either the <strong>Sidebar<\/strong> (<span class=\"shortcutkey\">N<\/span>) or <strong>Object Properties<\/strong>, click the <strong>Scale<\/strong> inputs for <strong>X<\/strong>, <strong>Y<\/strong>, and <strong>Z<\/strong>, changing them to <strong>8<\/strong> &#8211; <strong>X: 8.000<\/strong>, <strong>Y: 8.000<\/strong>, <strong>Z: 8.000<\/strong>. This updates the object to 16 x 16 x 16 overall, the same size as the entity in Radiant. For a classic <strong>info_player_start<\/strong> entity, scaling would be X: 16.000, Y: 16.000 Z: 32.000.<\/p>\n<div style=\"background-color: #fc0; color: #000; width:98.5%; padding: 1.0em;\"><strong>Important<\/strong>: there is no need to use Apply Transforms on Empty objects as the MAP export script recognises the object type and will automatically convert what it finds into the corresponding game entity counterpart.<\/div>\n<p><a href=\"\/\/www.katsbits.com\/images\/tutorials\/map-editing\/entity-size-blender.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/map-editing\/entity-size-blender.jpg\" alt=\"Changing Empty scaling\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>As Empty objects have fixed Dimensions &#8211; 2 x 2 x 2 units, to change their size <strong>Scale<\/strong> [2] has to be used.<\/i><\/p>\n<h4><span class=\"ez-toc-section\" id=\"entity-duplication\"><\/span>Entity Duplication<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>So long as Empty objects are correctly labelled in Blender to reflect their Radiant counterparts, i.e. <em>info_notnull<\/em>, <em>func_static<\/em>, <em>target_relay<\/em>, <em>trigger_kill<\/em> etc., the MAP export script will instance them correctly relative to the exported *.map file. In other words, Blenders propensity to numerically append duplications, i.e. info_notnull.<em>001<\/em>, info_notnull.<em>010<\/em>, info_notnull.<em>100<\/em> etc., makes no difference to the script or the resulting *.map. To manually rename an Empty, either select the object in the 3D Viewport and then rename in the <strong>Name<\/strong> input field at the top of <strong>Object Properties<\/strong> [3], or double-click the appropriate entry in the <strong>Outliner<\/strong> [4] and rename. <\/p>\n<p><a href=\"\/\/www.katsbits.com\/images\/tutorials\/map-editing\/empty-name.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/map-editing\/empty-name.jpg\" alt=\"Naming an Empty\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>To rename an Empty, in <strong>Object Properties<\/strong> [3] click-type a new label in the <strong>Name<\/strong> input field, or double-click and type an entry in the <strong>Outliner<\/strong> [4].<\/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&#8211; 00:00 : Overview &#038; Empty<br \/>\n&#8211; 02:00 : Scaling &#038; Label<br \/>\n&#8211; 06:30 : Lights<br \/>\n&#8211; 08:00 : MAP Export<br \/>\n&#8211; 10:00 : Radiant Import<\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":8709,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[34,237,230],"tags":[1084,1078,609,1020,72,1079,1081,1083,1080,208,286,393],"class_list":["post-8691","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blender","category-misc3d","category-tutorials","tag-bsp","tag-map","tag-empty","tag-entities","tag-export","tag-level-design","tag-level-editor","tag-python","tag-radiant","tag-scale","tag-units","tag-units-of-measurement"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/posts\/8691","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=8691"}],"version-history":[{"count":18,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/posts\/8691\/revisions"}],"predecessor-version":[{"id":8837,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/posts\/8691\/revisions\/8837"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/media\/8709"}],"wp:attachment":[{"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/media?parent=8691"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/categories?post=8691"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/tags?post=8691"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}