{"id":2231,"date":"2024-04-13T18:21:39","date_gmt":"2024-04-13T17:21:39","guid":{"rendered":"https:\/\/www.katsbits.com\/site\/?p=2231"},"modified":"2024-04-13T18:21:59","modified_gmt":"2024-04-13T17:21:59","slug":"make-models-from-bsp-maps-or-brushes-advanced","status":"publish","type":"post","link":"https:\/\/www.katsbits.com\/site\/make-models-from-bsp-maps-or-brushes-advanced\/","title":{"rendered":"Make Models From BSP Brushes Or Maps #2 &#8211; Advanced Options"},"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\/make-models-from-bsp-maps-or-brushes-advanced\/#Brushwork_Position\" >Brushwork Position<\/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\/make-models-from-bsp-maps-or-brushes-advanced\/#Structural_Brushwork_Breaking_Models\" >Structural Brushwork &amp; Breaking Models<\/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\/make-models-from-bsp-maps-or-brushes-advanced\/#Object_Centre_Bounding_Box_Rendering\" >Object Centre &amp; Bounding Box Rendering<\/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\/site\/make-models-from-bsp-maps-or-brushes-advanced\/#VISibility_Brushwork_Models\" >VIS(ibility), Brushwork &amp; Models<\/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\/site\/make-models-from-bsp-maps-or-brushes-advanced\/#Sectioned_Meshes_Grid_Position\" >Sectioned Meshes &amp; Grid Position<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.katsbits.com\/site\/make-models-from-bsp-maps-or-brushes-advanced\/#Origin_Point_Object_Rotation\" >Origin Point &amp; Object Rotation<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.katsbits.com\/site\/make-models-from-bsp-maps-or-brushes-advanced\/#Optimising_Prepping_Brush_Work\" >Optimising &amp; Prepping Brush Work<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.katsbits.com\/site\/make-models-from-bsp-maps-or-brushes-advanced\/#Exporting_Brushes_From_Doom3Edit_Quake4Edit_Et-Al\" >Exporting Brushes From Doom3Edit, Quake4Edit Et-Al<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.katsbits.com\/site\/make-models-from-bsp-maps-or-brushes-advanced\/#Exporting_Brushes_From_GTK_Radiant_15\" >Exporting Brushes From GTK Radiant 1.5<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.katsbits.com\/site\/make-models-from-bsp-maps-or-brushes-advanced\/#Conclusion\" >Conclusion<\/a><\/li><\/ul><\/nav><\/div>\n<p>BSP brush volumes and patch mesh objects were never really intended for making complex or small fiddly shapes, they tend to work best as larger blocks, volumes and shapes. This leaves the level designer with a bit of a problem; just how can that fiddly detail or &#8216;re-usable&#8217; object be make with brushes? The straightforward answer to that is to simply convert the object into a model which can then be used &#8216;as is&#8217; or further refined in a 3D application like Max, Maya or Blender. <\/p>\n<p>The use of models in levels helps optimise the compiled map in a number of ways, mentioning a few they;<\/p>\n<ul>\n<li>Often have better &#8216;smoothing&#8217; than can be had using a &#8216;phong&#8217; shader, by default brushwork doesn&#8217;t have smoothing (mesh smoothing) or smooth groups, that has to be added using special shader surface parameters that add a uniform value to all objects.<\/li>\n<li>If replacing patch mesh objects, models are often have a significantly reduced poly count. Again by default patch meshes have a fixed row\/column relationship which means the more complex the curve the more polygons are needed to describe that curve (idtech4 engine allows changing this).<\/li>\n<li>&#8216;Optimises&#8217; the compiled BSP due to the presence of less BSP data.<\/li>\n<\/ul>\n<blockquote style=\"background-color: #ddecf3; color: #000;\"><p><b>Download<\/b>: useful tools for converting brushes into models;.<br \/>\n  &#8211; <a href=\"https:\/\/www.katsbits.com\/files\/q3map2\/q3map_2.5.16_win32_x86.zip\" title=\"Download Q3Map2 v2.5.16\">Q3Map2 &#8211; 2.5.16<\/a> (local)<br \/>\n  &#8211; <a href=\"https:\/\/www.katsbits.com\/files\/q3map2\/q3map2toolz_setup.exe\" title=\"Download Q3Map2toolz (local hosted)\">Q3map2Toolz<\/a> (local)<\/p><\/blockquote>\n<h3><span class=\"ez-toc-section\" id=\"Brushwork_Position\"><\/span>Brushwork Position<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>There are a couple of important key principles involved in this process of converting brushwork, one of which is &#8216;<span><b>position<\/b><\/span>&#8216;. The physical position of any brushwork relative to Radiant&#8217;s 0,0,0, grid centre is important because that point, grid centre, acts, and will be interpreted as, the eventual point of origin of the model; this is the point around which a model is usually rotated and manipulated (re-sized etc.). For more information on this point see &quot;<a href=\"https:\/\/www.katsbits.com\/site\/make-models-from\u2026brushes-advanced\/#Object_Centre_Bounding_Box_Rendering\" title=\"Learn more about object centre\" target=\"_self\" rel=\"noopener\">object centre and bounding box rendering<\/a>&quot; below. <\/p>\n<div class=\"content_images\"><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/brushwork-at-grid-centre.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/brushwork-at-grid-centre_sml.jpg\" alt=\"Brushwork placed at grid centre to ensure it doesn't break when buried in a map\" width=\"428\" height=\"428\" border=\"0\" title=\"Brushwork placed at grid centre to ensure it doesn't break when buried in a map\" \/><\/a><\/p>\n<p>Brushwork placed at grid centre relative to how it&#8217;s going to be used in a map. Make sure to compensate for uneven surfaces so allow a large &#8216;waste&#8217; area on the model<\/p>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"Structural_Brushwork_Breaking_Models\"><\/span>Structural Brushwork &amp; Breaking Models<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Models and entities &#8216;<b>break<\/b>&#8216; if their origin point is <b>buried or occluded<\/b> in <b>structural brushwork<\/b> often returning a &#8216;leaked&#8217; map during the compile process &#8211; structural brush volumes are treated as being &#8216;solid&#8217; because they seal the internals of a level away from the &#8216;void&#8217;. This means that when prepping brushwork it&#8217;s best to &#8216;over-compensate relative to the eventual use of the model in the level.<\/p>\n<p>For example, the brushwork platform shown in the image above has been <b>aligned to GTK Radiant&#8217;s 0,0,0 grid<\/b> centre to allow plenty of room for the support struts to be buried deep into the uneven surfaces of a brushwork rock face without blocking or otherwise interfering with the models point of origin. From a practical point of view this means making the support beams longer, or, shifting the brushwork before conversion so the origin point is on the &#8216;outside&#8217; of the object.<\/p>\n<div class=\"content_images\"><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/model-in-use-buried-in-brushwork.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/model-in-use-buried-in-brushwork_sml.jpg\" alt=\"Eventual converted brushwork being used buried in a map\" width=\"428\" height=\"321\" border=\"0\" title=\"Eventual converted brushwork being used buried in a map\" \/><\/a><\/p>\n<p>Eventual converted brushwork being used buried in a map, the origin point being correctly positioned before conversion means being able to place the resultant model in many situations and on uneven surfaces such as a rock face<\/p>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"Object_Centre_Bounding_Box_Rendering\"><\/span>Object Centre &amp; Bounding Box Rendering<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Game engines tend to process and render models on a &#8216;<b>per object<\/b>&#8216; basis, not a &#8216;<b>per polygon<\/b>&#8216; (there&#8217;s a difference between how assets are <i>loaded in for use<\/i> and how that <i>data is rendered to screen<\/i> &#8211; be mindful not to confuse the two). What this means is that a model will be processed in it&#8217;s entirety if any part of it is visible, even a single small polygon being seen will result in the whole model it happens to be part of being pulled into the game and processed, this is because the model, the &#8216;area&#8217; or &#8216;volume&#8217; the mesh occupies, is contained within something referred to as a &#8216;<b>bounding box<\/b>&#8216;; in effect it&#8217;s not the model that causes the entire mesh to be drawn if seen but the bounding box, the volume occupied by the mesh as a primitive shape (the red outline shown below).<\/p>\n<div class=\"content_images\"><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/brushwork-model-bounding-box-limits.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/brushwork-model-bounding-box-limits_sml.jpg\" alt=\"Model rendered and processed based on it's bounding box, the red outline shown\" width=\"428\" height=\"323\" border=\"0\" title=\"Model rendered and processed based on it's bounding box, the red outline shown\" \/><\/a><\/p>\n<p>The converted brushwork shown as a model in the camera view of Radiant. Shown is the red outline of the &#8216;<span><b>bounding box<\/b><\/span>&#8216;, the limits by which the model is processed by the game<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/model-bounding-box-in-radiant.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/model-bounding-box-in-radiant_sml.jpg\" alt=\"Model bounding box in Radiant\" width=\"428\" height=\"400\" border=\"0\" title=\"Model bounding box in Radiant\" \/><\/a><\/p>\n<p>Red outline showing model bounding box in Radiant<\/p>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"VISibility_Brushwork_Models\"><\/span>VIS(ibility), Brushwork &amp; Models<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>It&#8217;s important to understand visibility here because it relates to how brushwork is set up for conversion. As mentioned in the <a href=\"https:\/\/www.katsbits.com\/site\/make-models-from\u2026brushes-advanced\/#Object_Centre_Bounding_Box_Rendering\" title=\"Bounding boxes\" target=\"_self\" rel=\"noopener\">previous section<\/a>, models are processed and rendered relative to their bounding boxes and not the models structure. As such this mean that large models will need to be broken up into sections (and put back together in the tools) so that only parts of it are rendered at any given time; leave a model too big and it&#8217;ll be rendered from the other side of a level if only a tiny portion of it can be seen, and by &quot;seen&quot; that&#8217;s meant in relation to what the engine reads as being &quot;visible&quot; at any given time. Or more correctly, what &quot;VIS&quot; calculations tell the engine is visible.<\/p>\n<p>A simple way to illustrate this would be to place the tutorial model behind a wall as shown below. As this is a &#8216;structural&#8217; volume it blocks visibility, meaning  VIS calculations have determined that the platform isn&#8217;t visible from the cameras current point of view (player)  so it hasn&#8217;t been loaded in for use.<\/p>\n<div class=\"content_images\"><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/object-occlusion.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/object-occlusion_sml.jpg\" alt=\"Structural wall blocks object visibility as a result of VIA calculations\" width=\"428\" height=\"322\" border=\"0\" \/><\/a><\/p>\n<p>The structural wall blocks the model, the game has (more accurately, the VIS part of the map compilation process has) calculated that it can&#8217;t be seen by the player standing where they are so it won&#8217;t be pulled in for use<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/object-visibility.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/object-visibility_sml.jpg\" alt=\"The object where it actually is in relation to the wall\" width=\"428\" height=\"322\" border=\"0\" \/><\/a><\/p>\n<p>Model selected to show where it actually is in relation to the wall<\/p>\n<\/div>\n<p>On the other hand, if the player is in a position to see even the tiniest part of the models bounding box (the red outline visible in the image directly below) the engine will pull the entire model in for use regardless as to whether the player can actually see the structure of the object itself or not (also as shown below). What this means for converting brushes into models is that you have to be mindful of the size of the object relative to it&#8217;s intended use and position, compensating or adjusting the collection of brushes to allow for &#8216;abstract&#8217; use (unplanned). In other words, it&#8217;s usually best to keep model sizes down.<\/p>\n<div class=\"content_images\"><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/object-visible.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/object-visible_sml.jpg\" width=\"428\" height=\"323\" border=\"0\" \/><\/a><\/p>\n<p>The models bounding box is visible so the engine loads the entire object in for use<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/object-visible-all.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/object-visible-all_sml.jpg\" width=\"428\" height=\"322\" border=\"0\" \/><\/a><\/p>\n<p>Selecting the object shows that it&#8217;s not actually visible to the player and yet, due to the bounding box being visible the entire item has to be loaded in<\/p>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"Sectioned_Meshes_Grid_Position\"><\/span>Sectioned Meshes &amp; Grid Position<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The downside to splitting large objects up to accommodate better VIS&#8217;ing is that brushwork then has to be re-organised in such a way that each part re-align itself to its neighbour correctly in the editor, game or 3D application, often whole sections of brushwork will need to be moved and re-centring at 0,0,0.<\/p>\n<p>To minimize problems whilst doing this  make sure <b>snap to grid<\/b> is &#8216;on&#8217; in Radiant and the 3D application being used to do any further editing &#8211; break brushwork into sections, re-centring to the editors centre point and then exporting each unit out for further work, the advantage being that each exported section is &#8216;grid locked&#8217;. Alternatively the entire map can be exported and then sectioned it in your 3D application, the advantage here means any further editing done to the mesh will perfectly match it&#8217;s neighbouring section when time comes to break the model down into smaller sections prior to final export.<\/p>\n<div class=\"content_images\"><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/object-sections.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/object-sections_sml.jpg\" alt=\"Section large objects to make them more efficient\" width=\"428\" height=\"284\" border=\"0\" \/><\/a><\/p>\n<p>Section large objects to make them more efficient, instead of forcing the engine to load one large object, it&#8217;s better to facilitate incremental loading by breaking the big models in to several smaller ones<\/p>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"Origin_Point_Object_Rotation\"><\/span> Origin Point &amp; Object Rotation<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>An object <b>rotates around the point of origin<\/b> so having that placed in an odd position as a result of where the brushwork was placed relative to 0,0,0, grid centre may adversely effect how models are manipulated, tiled and connected to other models. Where ever possible try and centre the point of origin at the objects centre of mass &#8211; if it&#8217;s an individual object, or relative to the other sections or models it may need to be (re)connected to.<\/p>\n<div class=\"content_images\"><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/origin-point-as-rotation-axis-radiant.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/origin-point-as-rotation-axis-radiant_sml.jpg\" alt=\"Origin point acts as rotational axis in Radiant\" width=\"428\" height=\"281\" border=\"0\" \/><\/a><\/p>\n<p>Origin point acts as the axis in Radiant around which the model is rotated<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/origin-point-as-rotation-axis.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/origin-point-as-rotation-axis_sml.jpg\" alt=\"Brushworks 0,0,0, position translates to axis of rotation\" width=\"428\" height=\"263\" border=\"0\" \/><\/a><\/p>\n<p>The same origin point in a 3D modeling application around which the mesh rotates<\/p>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"Optimising_Prepping_Brush_Work\"><\/span>Optimising &amp; Prepping Brush Work<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The basic principle of getting a model from a map is to compile it in the same way as is done with any other type of BSP or Q3Map2 compiled &#8216;map&#8217;, the resulting *.bsp then only needing a further &#8216;format&#8217; conversion to *.ase or other supported 3D format.<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/site\/make-models-from-bsp-maps-or-brushes\/\" title=\"Converting a map or bsp brushwork into a 3D model\" target=\"_self\" rel=\"noopener\">As mentioned on the previous page<\/a>, the brushwork to be converted needs to be encased in a caulk box, a &#8216;hull&#8217;, into which is placed an info_player_start. From this point it&#8217;s best to <b>optimise brushwork<\/b> by stripping out any game related entities (with the exception of the info_player_start), as well as removing any excess or unnecessary brushwork. It&#8217;s also good practice to caulk all hidden or unused faces so they don&#8217;t get exported.<\/p>\n<p>The key here is optimisation, ideally the model needs to have as few faces as possible else it&#8217;ll cause the engine to render &#8216;waste&#8217; &#8211; faces that don&#8217;t actually serve any purpose, i.e. they don&#8217;t add to the structure or appearance of the object in any way, nor do they help in any &#8216;technical&#8217; sense.<\/p>\n<div class=\"content_images\"><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/caulk-hidden-faces.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/caulk-hidden-faces_sml.jpg\" alt=\"Caulking hidden and unseen faces of brushwork before being converted into a model\" width=\"428\" height=\"284\" border=\"0\" \/><\/a><\/p>\n<p>Caulking hidden and unseen faces of brushwork before being converted into a model<\/p>\n<\/div>\n<p>There is a caveat here however. Models tend to need to be what are referred to as &#8216;<span><b>closed meshes<\/b><\/span>&#8216;, that is, it&#8217;s important that they ordinarily <i>don&#8217;t have any <b>gaps<\/b> or <b>holes<\/b> in them<\/i>. So whilst converting brushwork in this way to produce models may work within idtech powered games (because it can generally handle &#8216;open&#8217; meshes), the same may not be true of other technology. As a result, if a models has the potential for being used elsewhere it&#8217;s always best to cover what were to be hidden faces with a &#8216;miscellaneous&#8217; texture of some description so they get exported correctly. This then facilitates those face being easily managed as a group &#8211; applying a shader to them in another engine, or selecting the group based on material assignment and so on.<\/p>\n<div class=\"content_images\"><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/caulk-faces-to-appear.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/caulk-faces-to-appear_sml.jpg\" alt=\"Texturing hidden faces so they *are* exported\" width=\"428\" height=\"284\" border=\"0\" \/><\/a><\/p>\n<p>Using a different texture on hidden faces so they export and make a valid &#8216;closed&#8217; mesh for use in a different context\/engine other than idtech<\/p>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"Exporting_Brushes_From_Doom3Edit_Quake4Edit_Et-Al\"><\/span>Exporting Brushes From Doom3Edit, Quake4Edit Et-Al<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>If you have access to Doom 3, Quake 4, Prey, Quake Wars, or any game running on idtech4, the editor available for those games, <span><b>QuakeEdit<\/b><\/span>, can export brushwork directly out as *.obj formatted models. The downside is the action will export <b><i>everything<\/i><\/b> selected including entities and hidden\/caulked faces. Using this process will mean paying more attention to &#8216;cleaning&#8217; the brushwork before export. Bear in mind also that brushwork saved from QuakeEdit only exports face data &#8211; UVW maps, material and texture information may be lost as a result of the process.<\/p>\n<p>To export models from QuakeEdit select the brushwork and click &quot;<b>Selection &gt;&gt; Export &gt;&gt; To OBJ<\/b>&quot;. In the dialogue window that opens, type a file name and click &quot;<b>Save<\/b>&quot;. If the brushwork belongs to a *.map created in or for Quake 2, Quake 3 or some other idtech based technology, then it may be possible to &#8216;import&#8217; those types of maps directly into QuakeEdit using &quot;<b>File &gt;&gt; Load<\/b>&quot;, the map will be processed and converted into the correct brush format as it loads (&quot;Brush Primitives&quot;). Export as described above.<\/p>\n<div class=\"content_images\"><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/quake-edit-brush-export.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/quake-edit-brush-export_sml.jpg\" alt=\"Exporting brushes from Quake Edit\" width=\"428\" height=\"334\" border=\"0\" \/><\/a><\/p>\n<p>Exporting brushwork from QuakeEdit using the inbuilt option<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/quake-edit-brush-export-obj.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/quake-edit-brush-export-obj_sml.jpg\" alt=\"Exporting brushes from uakeEdit to OBJ\" width=\"428\" height=\"334\" border=\"0\" \/><\/a><\/p>\n<p>Saving a selection of brushes from QuakeEdit as an OBJ formatted model<\/p>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"Exporting_Brushes_From_GTK_Radiant_15\"><\/span>Exporting Brushes From GTK Radiant 1.5<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Alternatively, it&#8217;s also possible to export brushwork from <b>GTK Radiant 1.5<\/b> via the OBJ export plug-in &#8211; select the necessary brushwork and then click &quot;<b>Plugins &gt;&gt; brushexport2 &gt;&gt; Export selected as Wavefront Object<\/b>&quot;, click &quot;<b>Save<\/b>&quot; in the box that appears. As with exporting of any kind of brushwork, make sure to clean the file properly of any &#8216;entities&#8217; and elements. The ability to export from GTK Radiant may not be available in other earlier versions of the editor.<\/p>\n<div class=\"content_images\"><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/gtk15-brush-export.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/gtk15-brush-export_sml.jpg\" alt=\"Exporting brushes from GTK Radiant 1.5\" width=\"428\" height=\"343\" border=\"0\" \/><\/a><\/p>\n<p>Using GTK Radiant 1.5&#8217;s brush export plug-in<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/gtk-15-brush-export-save-obj.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/converting_map_model\/gtk-15-brush-export-save-obj_sml.jpg\" alt=\"Saving brushwork to OBJ from GTK Radiant 1.5\" width=\"428\" height=\"343\" border=\"0\" \/><\/a><\/p>\n<p>BrushExport plug-in which will save selected brushwork to and OBJ format model<\/p>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>There are always caveats to converting brushes in to models so the level designer needs to be aware of those as discussed in this tutorial. To summarise;<\/p>\n<ul>\n<li>Models may &#8216;break&#8217; if the Point Of Origin is buried within (structural) brushwork (the model may &#8216;break&#8217; irrespective as to whether the origin point is submerged in &#8216;solid&#8217; structural brushwork or not).<\/li>\n<li>Incorrectly positioned models may exhibit lighting artifacts due to occluded faces.<\/li>\n<li>Models are rendered based on their Point Of Origin position (the &#8216;<span><b>origin point<\/b><\/span>&#8216; is not to be confused with a models &#8216;<span><b>centre of mass<\/b><\/span>&#8216;) in direct relation where that is within the objects overall bounding box limits.<\/li>\n<li>Models are <i>usually<\/i> rotated, moved and position based on the Point Of Origin.<\/li>\n<li>Be sure to strip out all game specific entities, caulk hidden faces (unless the model is destined for use elsewhere), and un-group brush based entities back into raw volumes.<\/li>\n<li>Be aware that breaking large models in to sections may inadvertently create smoothgroup issues when put back together due to the way lighting is then calculated for the individual sections rather than on the whole collection as a larger unit.<\/li>\n<li>Detail flagged brushwork can be left &#8216;as-is&#8217; because it&#8217;s ignored by the process.<\/li>\n<\/ul>\n<div class=\"subNav\">\n<p>[1: <a href=\"https:\/\/www.katsbits.com\/site\/make-models-from-bsp-maps-or-brushes\/\" title=\"Converting brushwork to ASE models\" target=\"_self\" rel=\"noopener\">Converting Brushwork<\/a> | 2: <a href=\"https:\/\/www.katsbits.com\/site\/make-models-from-bsp-maps-or-brushes-advanced\/\" title=\"Additional advanced information on converting brushes into models\" target=\"_self\" rel=\"noopener\">Additional Options<\/a>]<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":2233,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14],"tags":[197,230,488,271,106,17,109,108,548,31,269,461],"class_list":["post-2231","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-ase","tag-blender-2-4x","tag-brush-volumes","tag-export","tag-gtkradiant","tag-idtech","tag-level-design","tag-level-editing","tag-lwo","tag-models","tag-obj","tag-origin"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/posts\/2231","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=2231"}],"version-history":[{"count":3,"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/posts\/2231\/revisions"}],"predecessor-version":[{"id":2235,"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/posts\/2231\/revisions\/2235"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/media\/2233"}],"wp:attachment":[{"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/media?parent=2231"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/categories?post=2231"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/tags?post=2231"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}