iddevnet/quake4/ArtReference_CreatingModels.html
2021-04-10 19:28:06 +02:00

423 lines
83 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<meta name="robots" content="index,nofollow">
<title>ArtReference CreatingModels - Quake 4 SDK Documentation</title>
<script type="text/javascript" src="wiki/common/js/common.js"></script>
<script type="text/javascript">
<!--// common functions
// We keep here the state of the search box
searchIsDisabled = false;
function searchChange(e) {
// Update search buttons status according to search box content.
// Ignore empty or whitespace search term.
var value = e.value.replace(/\s+/, '');
if (value == '' || searchIsDisabled) {
searchSetDisabled(true);
} else {
searchSetDisabled(false);
}
}
function searchSetDisabled(flag) {
// Enable or disable search
document.getElementById('fullsearch').disabled = flag;
document.getElementById('titlesearch').disabled = flag;
}
function searchFocus(e) {
// Update search input content on focus
if (e.value == 'Search') {
e.value = '';
e.className = '';
searchIsDisabled = false;
}
}
function searchBlur(e) {
// Update search input content on blur
if (e.value == '') {
e.value = 'Search';
e.className = 'disabled';
searchIsDisabled = true;
}
}
function actionsMenuInit(title) {
// Initialize action menu
for (i = 0; i < document.forms.length; i++) {
var form = document.forms[i];
if (form.className == 'actionsmenu') {
// Check if this form needs update
var div = form.getElementsByTagName('div')[0];
var label = div.getElementsByTagName('label')[0];
if (label) {
// This is the first time: remove label and do buton.
div.removeChild(label);
var dobutton = div.getElementsByTagName('input')[0];
div.removeChild(dobutton);
// and add menu title
var select = div.getElementsByTagName('select')[0];
var item = document.createElement('option');
item.appendChild(document.createTextNode(title));
item.value = 'show';
select.insertBefore(item, select.options[0]);
select.selectedIndex = 0;
}
}
}
}
//-->
</script>
<link rel="stylesheet" type="text/css" charset="utf-8" media="all" href="wiki/modern/css/common.css">
<link rel="stylesheet" type="text/css" charset="utf-8" media="screen" href="wiki/modern/css/screen.css">
<link rel="stylesheet" type="text/css" charset="utf-8" media="print" href="wiki/modern/css/print.css">
<link rel="stylesheet" type="text/css" charset="utf-8" media="projection" href="wiki/modern/css/projection.css">
<!-- css only for MSIE browsers -->
<!--[if IE]>
<link rel="stylesheet" type="text/css" charset="utf-8" media="all" href="wiki/modern/css/msie.css">
<![endif]-->
<link rel="Start" href="./Quake4SDK.html">
<link rel="Alternate" title="Wiki Markup" href="./ArtReference_CreatingModels?action=raw">
<link rel="Alternate" media="print" title="Print View" href="./ArtReference_CreatingModels?action=print">
<link rel="Search" href="./FindPage.html">
<link rel="Index" href="./TitleIndex.html">
<link rel="Glossary" href="./WordIndex.html">
<link rel="Help" href="./HelpOnFormatting.html">
</head>
<body lang="en" dir="ltr">
<div id="header">
<div id="logo"><a href="./Quake4SDK.html"><img src="wiki/common/moinmoin.png" alt="MoinMoin Logo"></a></div>
<form id="searchform" method="get" action="">
<div>
<input type="hidden" name="action" value="fullsearch">
<input type="hidden" name="context" value="180">
<label for="searchinput">Search:</label>
<input id="searchinput" type="text" name="value" value="" size="20"
onfocus="searchFocus(this)" onblur="searchBlur(this)"
onkeyup="searchChange(this)" onchange="searchChange(this)" alt="Search">
<input id="titlesearch" name="titlesearch" type="submit"
value="Titles" alt="Search Titles">
<input id="fullsearch" name="fullsearch" type="submit"
value="Text" alt="Search Full Text">
</div>
</form>
<script type="text/javascript">
<!--// Initialize search form
var f = document.getElementById('searchform');
f.getElementsByTagName('label')[0].style.display = 'none';
var e = document.getElementById('searchinput');
searchChange(e);
searchBlur(e);
//-->
</script>
<ul id="username"><li><a href="./ArtReference_CreatingModels?action=login" id="login">Login</a></li></ul>
<div id="locationline">
<ul id="pagelocation">
<li><a class="backlink" title="Click to do a full-text search for this title" href="./ArtReference_CreatingModels?action=fullsearch&amp;value=linkto%3A%22ArtReference+CreatingModels%22&amp;context=180">ArtReference CreatingModels</a></li>
</ul>
</div>
<ul id="navibar">
<li class="wikilink"><a href="./GettingStarted.html">GettingStarted</a></li><li class="wikilink"><a href="./ScriptFile.html">ScriptFile</a></li><li class="wikilink"><a href="./MakeAMod.html">MakeAMod</a></li><li class="wikilink"><a href="./LevelEditor.html">LevelEditor</a></li><li class="wikilink"><a href="./FXEditor.html">FXEditor</a></li><li class="wikilink"><a href="./GUIEditor.html">GUIEditor</a></li><li class="wikilink"><a href="./Sounds.html">Sounds</a></li><li class="wikilink"><a href="./Animations.html">Animations</a></li><li class="wikilink"><a href="./ArtReference.html">ArtReference</a></li><li class="wikilink"><a href="./DownloadableContent.html">DownloadableContent</a></li><li class="wikilink"><a href="./RecentChanges.html">RecentChanges</a></li><li class="wikilink"><a href="./FindPage.html">FindPage</a></li><li class="wikilink"><a href="./HelpContents.html">HelpContents</a></li><li class="current"><a href="./ArtReference_CreatingModels.html">ArtReferenc...atingModels</a></li>
</ul>
<div id="pageline"><hr style="display:none;"></div>
<ul class="editbar"><li><span class="disabled">Immutable Page</span></li><li><a href="./ArtReference_CreatingModels?action=info">Info</a></li><li><a href="./ArtReference_CreatingModels?action=AttachFile">Attachments</a></li><li>
<form class="actionsmenu" method="get" action="">
<div>
<label>More Actions:</label>
<select name="action"
onchange="if ((this.selectedIndex != 0) &&
(this.options[this.selectedIndex].disabled == false)) {
this.form.submit();
}
this.selectedIndex = 0;">
<option value="raw">Raw Text</option>
<option value="print">Print View</option>
<option value="RenderAsDocbook">Render as Docbook</option>
<option value="refresh">Delete Cache</option>
<option value="show" disabled class="disabled">------------</option>
<option value="SpellCheck">Check Spelling</option>
<option value="LikePages">Like Pages</option>
<option value="LocalSiteMap">Local Site Map</option>
<option value="show" disabled class="disabled">------------</option>
<option value="RenamePage" disabled class="disabled">Rename Page</option>
<option value="DeletePage" disabled class="disabled">Delete Page</option>
<option value="show" disabled class="disabled">------------</option>
<option value="MyPages">My Pages</option>
<option value="SubscribeUser">Subscribe User</option>
<option value="show" disabled class="disabled">------------</option>
<option value="Despam">Remove Spam</option>
<option value="PackagePages">Package Pages</option>
</select>
<input type="submit" value="Do">
</div>
<script type="text/javascript">
<!--// Init menu
actionsMenuInit('More Actions:');
//-->
</script>
</form>
</li></ul>
</div>
<div id="page" lang="en" dir="ltr">
<div dir="ltr" id="content" lang="en"><span class="anchor" id="top"></span>
<span class="anchor" id="line-1"></span><p class="line867">
<h1 id="head-6b7985be15db91e329f04011ed66c696e0f3020c">Creating Models in Quake 4</h1>
<span class="anchor" id="line-2"></span><span class="anchor" id="line-3"></span><p class="line874">This document will attempt to explain the process that the artists and modelers of Raven Software used to create their world models, creatures and characters for Quake4. It begins at the concept stage, on through to creating the high and low poly models, creating the UVs, setting up the shaders, rendering out the normal, and then painting the diffuse, specular, and height maps to create a finished skin. While this document is focused on creating a creature, the model you make could be anything in your imagination. We have tried to simplify some of the directions and descriptions for those inspired individuals that dont have a lot of experience creating assets for a game. <span class="anchor" id="line-4"></span><span class="anchor" id="line-5"></span><p class="line867">
<h2 id="head-7d989213bf5a9262b2c421f81feee0b54dd0aed6">Concept Drawing:</h2>
<span class="anchor" id="line-6"></span><p class="line874">Try to think ahead when creating your concept drawing of your character for Quake4. There are some technical limits to the Doom3 engine and you need to take those limits into account when modeling and painting your character. At the concept stage, it is smart to try and incorporate fixes to those limits into your design. Tubes and hoses that hang off or stick out from the character may look great, but they not only cause occasional modeling headaches, but might also increase your poly count on your lo-poly model unnecessarily. Those hanging or jutting tubes may also throw too many shadow volumes in the engine which could drop the frame-rate of the game dramatically. They will also require the rigger/animator to create a skeleton for them that he or she will then need to animate to add realism. When drawing up your ultimate character design try to take into account poly limits or lighting issues that your creation may unwittingly create. <span class="anchor" id="line-7"></span><span class="anchor" id="line-8"></span><p class="line874">With the Strogg Grunt we created for Quake4, the concept artist originally created a creature with four arms, two smaller ones along with the two large ones, and had drawn pipes and hoses jutting out from its forearms and going into its back. To lessen the possible issues the original design would have created, the artist removed the jutting hoses on a revised concept drawing that the modeler used to create his model of the Grunt. The two smaller arms were eventually removed from the design at a later date. See examples below… <span class="anchor" id="line-9"></span><span class="anchor" id="line-10"></span><p class="line867">
<img class="attachment" src="ArtReference_CreatingModels_01.jpg" title="attachment:image_01.jpg" />
<span class="anchor" id="line-11"></span><span class="anchor" id="line-12"></span><p class="line874">The concept artist also created a Front, Back, Side-View drawing to help the modeler visualize what the creature looked like from all angles and to simplify the modelers job. See the Strogg Grunts Front/Back/Side-View drawing below… <span class="anchor" id="line-13"></span><span class="anchor" id="line-14"></span><p class="line867"><img class="attachment" src="ArtReference_CreatingModels_02.jpg" title="attachment:image_02.jpg" /> <span class="anchor" id="line-15"></span><span class="anchor" id="line-16"></span><p class="line867">
<h2 id="head-3400c230e92ff7d57424b2a68f6e0ea75dee4afa">Modeling Your Character:</h2>
<span class="anchor" id="line-17"></span><p class="line874">After coming up with a viable concept design for your character, youll want to model it using one of the many 3D modeling packages out there. Our hi-poly modelers used Maya and Lightwave to do all of their high poly modeling for Quake4. You can use most any modeling software, but in the end, we used Maya and Lightwave because we wanted to follow the same tool path that our friends down at Id Software used for Doom3. We chose to go with that tool set because we were using their revolutionary new engine and if we had any problems or questions concerning the process it would be easier for them to help us. <span class="anchor" id="line-18"></span><span class="anchor" id="line-19"></span><p class="line862">You are going to need to model your character in both high poly and in low poly. For the low poly, our creatures ranged from 500 polys on some of the lower range creatures on up to 5000 to 6000 polys for some of the bosses. The high poly models ranged anywhere from a few thousand polys on up to millions of polys. The high poly model <strong>does not</strong> go into the final game. It is used to render out a <strong>normal map</strong> that makes the low poly model that does go into the game look like a higher poly model. The reason the high poly model does not go into the game is because there are far too many polys in the model for the engine to run smoothly without chugging, etc. The low poly with its normal map is much cheaper memory-wise and makes the low poly look like its much higher in poly count when its not. Going with this process allows the game to run at a much higher frame-rate. <span class="anchor" id="line-20"></span><span class="anchor" id="line-21"></span><p class="line874">Some tips to take into consideration when modeling your high and low poly models: <span class="anchor" id="line-22"></span><span class="anchor" id="line-23"></span><ul><li><p class="line891"><em>High and low poly model positioning</em>: Try to have the high poly and low poly models conform as closely as possible to each other to obtain the best possible render. Both the high and low poly models must occupy the same space and be lined up with each other in order to get a precise render. <span class="anchor" id="line-24"></span></li><li><p class="line891"><em>“T” pose your creature or character model</em>: When modeling your creature or character, place them into the classic T pose configuration, not in a cool looking action pose, etc. The T pose will allow you to copy and paste similar parts (arms, legs, equipment) from one side to the other, help out when ripping your UVs, and also help the animator when he is rigging and point-weighting your model. Pose the wrists and hands palm forward to help with awkward poses in-game like holding weapons, using GUIs, etc. <span class="anchor" id="line-25"></span></li><li><p class="line891"><em>Add enough polys to joint areas to help in animating your model</em>: Make sure you add enough polys to wrists, elbows, shoulders, knee, and ankle joints to allow your creature or character to move properly and look realistic when animated. <span class="anchor" id="line-26"></span></li><li><p class="line891"><em>Tripling your model before rendering</em>: Make sure both your high poly and low poly models are tripled and that there are no 1, 2, or 4 poly or non-planer polys on your model. If you do not triple and remove the offending 1, 2, or 4 poly or non-planer polys, your model will not load when you try to render it out. <span class="anchor" id="line-27"></span></li><li><p class="line891"><em>Closing off the mesh</em>: Close off open areas on the high poly that open to the inside of the model to prevent the renderer from trying to go inside while rendering out your normal map. <span class="anchor" id="line-28"></span></li><li><p class="line891"><em>Trying to prevent overdraw during rendering</em>: While modeling your high poly model, try to prevent creating areas where the render trace will create overdraw while rendering out your normal map. These would be areas where the renderer will inadvertently trace into or over another section of the model where it doesnt belong because the area the render is trying to access is too close to another or there is an opening that goes into and behind another. You can try alleviating your problem by adjusting the trace height in the shader and rerendering or you might need to turn off the path (see the Shader and Path section below) on one part of the model and rerender the other separately from the rest of the model. You can also tear apart your high poly model into separate pieces and render out those sections separately. There is also a set-up in the shaders that allows you to number sections of your model and have the renderer render out the model piece by piece in numerical order (see the Shader and Path section below). <span class="anchor" id="line-29"></span></li><li><p class="line891"><em>Conform the low poly model to the high poly model</em>: Try to keep equipment and parts that stick out from the main mesh at a minimum. Preventing difficult rendering problems on your model will cut down on the amount of adjustment youll need to do in your renders, on the normal map, etc. If something is built out on the high poly, like a knob or a controller, its probably a good idea to also build it out on the low poly model since it may look odd and warped if viewed from the side. Poly count may not always permit you to do this, though. Extra polys can cause unwanted frame-rate issues, etc. It may not look as nice with less polys, but sometimes you have to sacrifice an awesome looking model with everything noodled out for the sake of game-play. <span class="anchor" id="line-30"></span></li><li><p class="line891"><em>Right angles on corners</em>: If the high poly model is using right angles then use them on the low poly. If the high poly isnt using right angles on the corner, dont use them on the low poly. Either way causes some warping. Sometimes this cant be avoided because of poly counts. <span class="anchor" id="line-31"></span></li><li><p class="line891"><em>Varying heights on a flat plane on the high poly</em>: Try to avoid building various surfaces on a high poly using right angles. It will look like a flat plane when it is rendered by itself. This is especially true when creating level textures, but also wise to take into account when creating creatures and characters. There are a couple things you can do to avoid this: <span class="anchor" id="line-32"></span><span class="anchor" id="line-33"></span><ol type="1"><li>Build the differing heights using angles or curved corners instead of 90 degree angles. <span class="anchor" id="line-34"></span></li><li>Build the lo-poly to compensate for or closely match the high poly. <span class="anchor" id="line-35"></span></li></ol></li><li><p class="line891"><em>The problem with cylinders</em>: There will always be warping in cylindrical shapes between the low and high poly models. You really cant spend the additional polys on the low poly model to make the rendering perfect since it would be a huge hit on the game, but you can minimize the warping by following the guidelines below. <span class="anchor" id="line-36"></span><ol type="1"><li>To lessen the warping (there will inevitably be some no matter what) you will need to spend extra polys on cylindrical-shaped models for rendering purposes. Otherwise theres going to be noticeably warped when rendered out. <span class="anchor" id="line-37"></span></li><li>The amount of polys that need to be added can be determined by how close the model is going to be viewed by the player. The further away the model is viewed, the less warping that will be noticeable to the player. So…if the model is going to be viewed from across the room its less important to spend the polys on the curve. If the model is going to be in the players face it may be a good idea to up the poly count on the model to lessen the warping. <span class="anchor" id="line-38"></span><span class="anchor" id="line-39"></span></li></ol></li></ul><p class="line874">Examples: <span class="anchor" id="line-40"></span><span class="anchor" id="line-41"></span><p class="line867"><img class="attachment" src="ArtReference_CreatingModels_03.jpg" title="attachment:image_03.jpg" /> <span class="anchor" id="line-42"></span><span class="anchor" id="line-43"></span><p class="line867"><strong>Bad!</strong> The white represents the low poly model and the black is the high. The number of sides (6) on the low poly model is too low compared to the very nicely rounded high poly model to get a nice render without lots of warping at the edges of the cylinder. From a distance it will look fine, but up close there will be very noticeable warping. <span class="anchor" id="line-44"></span><span class="anchor" id="line-45"></span><p class="line867"><img class="attachment" src="ArtReference_CreatingModels_04.jpg" title="attachment:image_04.jpg" /> <span class="anchor" id="line-46"></span><span class="anchor" id="line-47"></span><p class="line867"><strong>OK!</strong> The low is white the high is black. This version would yield much better rendering results with much less warping. Why? The number of sides (12) on the low poly model more closely matches the roundness of the high poly model and will yield a much cleaner render with less warping. The model will look better up close or at a distance. <span class="anchor" id="line-48"></span><span class="anchor" id="line-49"></span><p class="line874">The hard part is determining the number of polys you want to spend on the cylinder. Putting more into the low poly cylinder means you may have to put less into other areas of your model to still have the game run smoothly. Throwing unlimited amounts of polys into your model is not the answer. <span class="anchor" id="line-50"></span><span class="anchor" id="line-51"></span><ul><li><p class="line891"><em>Copy and paste parts from other models</em>: Steal and copy parts from other models to lessen your modeling time. Taking bolts, screws, pipes, hoses, lights, small housings, etc from another model, copying them, and using them on your model will make the job that much easier. We created model parts directories of reusable pieces and parts that we could copy and place onto our models. We have included some of those model part directories for you to access. <em>INCLUDE LINK HERE</em> <span class="anchor" id="line-52"></span></li><li><p class="line891"><em>Floating parts and pieces</em>: Due to the rendering process of Doom3, the modeler can “float” pieces above one another by a couple of microns instead having them pushed into or integrated into the mesh. Also, since the hi-poly model is only used as a base to create the normal map from, pieces and parts can just be pushed into themselves instead of having them cleanly melded. See below: <span class="anchor" id="line-53"></span><span class="anchor" id="line-54"></span></li></ul><p class="line874">This is a screenshot of the knee and thigh section of the Strogg Grunt high poly model used to render out the normal map. The triangular indent above his knee looks like its integrated right into the thigh mesh, but its not. Its floating above the thigh mesh. <span class="anchor" id="line-55"></span><span class="anchor" id="line-56"></span><p class="line867"><img class="attachment" src="ArtReference_CreatingModels_05.jpg" title="attachment:image_05.jpg" /> <span class="anchor" id="line-57"></span><span class="anchor" id="line-58"></span><p class="line874">The second screenshot below shows a wireframe shot of the same triangular indent as the above screenshot, but from the side. Notice that the triangular indent is actually floating above the main thigh mesh. Its not indented into the thigh and it doesnt need to be for the renderer to think it is. This makes modeling your high poly so much easier and also lessens the number of polys needed for the high poly. <span class="anchor" id="line-59"></span><span class="anchor" id="line-60"></span><p class="line867"><img class="attachment" src="ArtReference_CreatingModels_06.jpg" title="attachment:image_06.jpg" /> <span class="anchor" id="line-61"></span><span class="anchor" id="line-62"></span><p class="line867">
<h2 id="head-eca996ffd3893c33bba1c4089048b4e051110ada">Ripping, Shaders and Paths, and Rendering Out Your Model</h2>
<span class="anchor" id="line-63"></span><p class="line874">After you have finished modeling your creature, youll need to rip your lo-poly model to create your UV coordinates for your models skin. Youll need to use some kind of UV creation software, like U-View, to create your models UVs. Most modeling packages come with the tools necessary to create UVs. Some are pretty basic, others are pretty good. Some come with only the ability to create quick atlas UVs, where the software lays out the UVs in a haphazard conglomeration with no thought to seams, ease of painting, etc. Mayas UV tools are really quite nice and allow manipulation by the artist in creating their UVs. Lightwaves built-in UV creation tools arent the best, but as far as rendering goes, Lightwave is great. There are also sites online that provide user-created plug-ins for several different software packages that will allow you to manipulate your UVs even more. At Raven, one of our tool guys created a really great proprietary UV tool for us artists to use in Lightwave. <span class="anchor" id="line-64"></span><span class="anchor" id="line-65"></span><p class="line867"><strong>Things to check for before beginning your UV coordinates:</strong> <span class="anchor" id="line-66"></span><ol type="1"><li><p class="line862">Make sure both the high and low poly models are <strong>tripled</strong>. <span class="anchor" id="line-67"></span></li><li>Make sure both the lo-poly and hi-poly models share the same origin space since the texture coordinates on the lo-poly will use the hi-poly as a glorified bump-map. If they dont line them up the normal map could be distorted or misaligned when rendered. <span class="anchor" id="line-68"></span><span class="anchor" id="line-69"></span></li></ol><p class="line867"><strong>Cutting your model into sections for ripping &amp; rendering</strong>: The high poly model may require you to break it up into smaller groupings or sections to overcome possible distortion or over-draw problems during the rendering process. This can be very time-consuming, but is worth it when you get a nice, clean render. You may need to do this on both the hi-poly and lo-poly models. <span class="anchor" id="line-70"></span><span class="anchor" id="line-71"></span><p class="line867"><strong>How to rip a model</strong>: Although every UV coordinate creator is different, here are several basic tips that will help you to create the best UVs possible. <span class="anchor" id="line-72"></span><ol type="1"><li>Try to place seams in inconspicuous places that arent easily seen. Place then on the inside of the arms and legs, down the sides of the torso, etc. This way theyll not be as noticeable to the player and will make your models skin look even better. <span class="anchor" id="line-73"></span></li><li><p class="line862">When ripping difficult parts, like arms, hands, and legs, take them apart in strips, like peeling a banana, and then knit them back together when they are flattened and weld them back together. <strong>IMPORTANT!</strong> Make sure you weld the correct points to their corresponding sister point. Otherwise, youll end up with screwy looking UVs. <span class="anchor" id="line-74"></span></li><li>For symmetrical parts like the arms, legs, the head, and the torso, you can delete one side of the model and just rip and flatten out one half. After ripping those pieces, you can copy and mirror them onto the other side of your model. Youll then need to reweld the points along the central seam. Make sure the model is actually symmetrical, though. <span class="anchor" id="line-75"></span></li><li>If you have an asymmetrical item, like a head with a piece of machinery on one side only or a face that has a scar over only one eye, you can do more of a global rip and flatten out the entire head. Have the seam run up the middle of the back of the neck and up into the top of the head. The painted hair on your skin will help cover the seam. <span class="anchor" id="line-76"></span></li><li><p class="line862">Make sure to set a path on your low poly model in the ripping or modeling program. This path allows the engine to be able find and access your model for the rendering process. In Lightwave, hitting “Q” will bring up the Change Surface window. In the “Name” section, type in your path. The model will be placed into the q4base directory, so the engine will look there for your low poly model. But, it is not necessary to put q4base at the beginning of the path. The engine already knows that that is where the model will be, but youd have to include the rest of the path in order for the engine to find your model. The Strogg Grunts body low poly models path is like this: <strong>model/monsters/grunt/grunt_body2</strong>. It is not necessary to add the file extension designation (.lwo, .ma, .mb, etc) after the name of the low poly model in your path. The engine will find it without it. Every modeling and UV creation program is different and setting up the path is done differently in each. Check your softwares manual for the correct process in creating paths for your UVs. <span class="anchor" id="line-77"></span><span class="anchor" id="line-78"></span><span class="anchor" id="line-79"></span></li></ol><p class="line867">
<h2 id="head-53be7a14438e698838dfff7348c40030a3e035e9">Paths and Material Shaders:</h2>
<span class="anchor" id="line-80"></span><p class="line862">For a full understanding of paths and shaders and how to set them up please read the <a href="./ArtReference_Q4Shaders.html">Quake 4 Shaders</a> document. <span class="anchor" id="line-81"></span><span class="anchor" id="line-82"></span><span class="anchor" id="line-83"></span><p class="line867">
<h2 id="head-991d9121a26145513834c89d7a0e11e244f494d5">Rendering Out Your Normal Map:</h2>
<span class="anchor" id="line-84"></span><p class="line874">Below is a step-by-step guide to rendering out your normal map. Included are how to prep your model for rendering, how to set up your shaders, and some tips and troubleshooting. This how-to occasionally refers to Lightwave, which we used as our UV creation software. <span class="anchor" id="line-85"></span><span class="anchor" id="line-86"></span><span class="anchor" id="line-87"></span><p class="line867"><strong>Step 1: Preliminary set up</strong> <span class="anchor" id="line-88"></span>The first steps are always essential; the basics are always the first thing we overlook. <span class="anchor" id="line-89"></span><span class="anchor" id="line-90"></span><ul><li style="list-style-type:none"><p class="line891"><strong>1.a Make sure your high and low poly model occupy the same space in separate files:</strong> <span class="anchor" id="line-91"></span><ol type="i"><li>Open both files into Lightwave and make sure the low and high poly meshes are occupying the same space by activating both files in the Layers window in Lightwave. <span class="anchor" id="line-92"></span><span class="anchor" id="line-93"></span></li></ol><p class="line891"><strong>1.b Make sure your high and low poly models are tripled.</strong> <span class="anchor" id="line-94"></span><ol type="i"><li>In Lightwave, hold down (shift T) to triple your models <span class="anchor" id="line-95"></span><span class="anchor" id="line-96"></span></li><li class="gap"> While in Polygon mode, look in the polygon statistic window and make sure there are no 1, 2, or 4 poly or non-planar polys in the model. If there are, select them in this window and delete them. If you dont delete them, your models wont load when you try to render them out. <span class="anchor" id="line-97"></span><span class="anchor" id="line-98"></span></li></ol></li></ul><p class="line867"><strong>Step 2: Prepping UVs</strong> <span class="anchor" id="line-99"></span><em>UV definition</em>: UVs are sectors or coordinates that projects the shader. This is not a direct part of the mesh; it serves as a way to read the .tga files. Sometimes the UVs may become unwelded in transfers from .obj files or Maya files. <span class="anchor" id="line-100"></span><span class="anchor" id="line-101"></span><ul><li style="list-style-type:none"><p class="line891"><strong>2.a Merge your points</strong>: After you have set up your UV map, make sure the model points are merged and weld any strange points that havent been merged. If you dont know how to weld points see Welding Commands pp. 26.5 or Merge and Weld Commands pp. 28.36 in the Lightwave manual (seven) <span class="anchor" id="line-102"></span><span class="anchor" id="line-103"></span><p class="line891"><strong>2.b Check to make sure merged points are supposed to be joined</strong>: Some of our mechanical models are pressed in and packed pretty close. Sometimes points get merged that shouldnt be. Its rare that this happens, but on models with moving mechanics, it might be good to check. <span class="anchor" id="line-104"></span><span class="anchor" id="line-105"></span><p class="line891"><strong>2.c How big is my base page</strong>: You should, at this time, determine how big of a base page .tga you need to render. <span class="anchor" id="line-106"></span><span class="anchor" id="line-107"></span></li></ul><p class="line874">By merging points you assure a smoother normal map. If you didnt merge your points the models would have strange seams all over it, and light wouldnt move over the surface correctly in game. <span class="anchor" id="line-108"></span><span class="anchor" id="line-109"></span><p class="line867"><strong>Step 3: Setting up material shaders</strong> <span class="anchor" id="line-110"></span>This is the clincher, and the thing that most people get wrong. Lets face facts; its easy to mess this up, so in this stage its essential to be patient and not to panic. <span class="anchor" id="line-111"></span><span class="anchor" id="line-112"></span><p class="line867"><strong>Some definitions</strong>: Materials: the actual file format. <span class="anchor" id="line-113"></span><ul><li style="list-style-type:none">Shaders: the individual entries in the material. <span class="anchor" id="line-114"></span><span class="anchor" id="line-115"></span></li></ul><p class="line874">Heres a typical shader for a model, and well be using it as an example: <span class="anchor" id="line-116"></span><span class="anchor" id="line-117"></span><pre>models/mapobjects/strogg/barrels_and_containers/barrels/medium1_low
<span class="anchor" id="line-118"></span>{
<span class="anchor" id="line-119"></span> noselfShadow
<span class="anchor" id="line-120"></span> unsmoothedtangents
<span class="anchor" id="line-121"></span>
<span class="anchor" id="line-122"></span>renderbump -size 256 256 -trace .05 -aa 2 -mergehigh models/mapobjects/strogg/barrels_and_containers/barrels/barrel1_low_local.tga work/models/mapobjects/strogg/barrels_and_containers/barrels/barrel1_high.lwo
<span class="anchor" id="line-123"></span>
<span class="anchor" id="line-124"></span>diffusemap models/mapobjects/strogg/barrels_and_containers/barrels/medium1_low_d.tga
<span class="anchor" id="line-125"></span>bumpmap addnormals ( models/mapobjects/strogg/barrels_and_containers/barrels/medium1_low_local.tga, heightmap ( models/mapobjects/strogg/barrels_and_containers/barrels/medium1_low_h.tga, 1 ) )
<span class="anchor" id="line-126"></span>specularmap models/mapobjects/strogg/barrels_and_containers/barrels/medium1_low_s.tga
<span class="anchor" id="line-127"></span>}
<span class="anchor" id="line-128"></span></pre><span class="anchor" id="line-129"></span><span class="anchor" id="line-130"></span><span class="anchor" id="line-131"></span><ul><li style="list-style-type:none"><p class="line891"><strong>3.a Writing the shader for renderbump</strong>: This is the key to make your render work. So what do you do? Well the safest and easiest thing to do is to copy and paste a previous entry and change the path names. Heres the breakdown using the above example: <span class="anchor" id="line-132"></span></li></ul><p class="line867"><span class="anchor" id="line-133"></span><pre> The top line: models/mapobjects/strogg/barrels_and_containers/barrels/medium1_low is the Shader title: this is what the game looks for when you activate a render. Think of it as an alias or a chapter title.
<span class="anchor" id="line-134"></span>
<span class="anchor" id="line-135"></span> noselfShadow: This command tells the engine that the model is to generate no self shadows that might slow down the engine even more.
<span class="anchor" id="line-136"></span>
<span class="anchor" id="line-137"></span> unsmoothedtangents: Unsmoothed tangents are for animated models. If the model isnt animated DO NOT use unsmoothed tangents.
<span class="anchor" id="line-138"></span>
<span class="anchor" id="line-139"></span> renderbump: This is the command the game looks for when you ask for a renderbump. If the shader doesnt have this command in it, it wont render.
<span class="anchor" id="line-140"></span>
<span class="anchor" id="line-141"></span> -size 256 256: This is the size that the final rendered normal will render out at. You can alter the size of the rendered out normal by decreasing or increasing the two numbers. The numbers have to be at a power of two, such as 32 X 32, 64 X 64, 128 X 128, 256 X 256, 512 X 512, or 1024 X 1024, etc. You can also set it with one number larger than the other, such as 512 X 1024.
<span class="anchor" id="line-142"></span>
<span class="anchor" id="line-143"></span> -trace .05: Trace is the height in which the model renders. Think of the low poly model as the surface in which the high poly is being drawn onto. If the high poly has a lot of floating geometry, you may need to render the model multiple times at different trace heights.
<span class="anchor" id="line-144"></span>
<span class="anchor" id="line-145"></span> -aa 2: This is an anti-alias function. If this is set to 1 it renders your UV map 1 to 1 whereas if its set at 2 its 2 to 1. A setting of 2 renders faster.
<span class="anchor" id="line-146"></span>
<span class="anchor" id="line-147"></span> -mergehigh: You need this to merge the high poly model so it will render as one model. If you dont have this in, it will render a partial model.
<span class="anchor" id="line-148"></span>
<span class="anchor" id="line-149"></span> models/mapobjects/barrel/barrel1_low_local.tga: This is telling the game to write a targa named barrel1_low_local.tga to models/mapobjects/strogg/barrels_and_containers/barrels directory (remember these are path names, so each slash is a folder).
<span class="anchor" id="line-150"></span>
<span class="anchor" id="line-151"></span> work/models/mapobjects/strogg/barrels_and_containers/barrels/barrel1_high.lwo: This tells the game to use this high poly model to create the normal map. You can keep your high poly models in art/work. A high poly model should NEVER be on Q4base.
<span class="anchor" id="line-152"></span>
<span class="anchor" id="line-153"></span> Remember to open and close the shader using { and } so that the game recognizes it. See the Quake 4 Shaders document for a better explanation.
<span class="anchor" id="line-154"></span></pre><span class="anchor" id="line-155"></span><span class="anchor" id="line-156"></span><ul><li style="list-style-type:none"><p class="line891"><strong>3.b Double check your path</strong>: If the path is wrong to the high poly model it wont render. The game will not allow spaces in the path name, so use an underscore ( _ ) in place of a space. <span class="anchor" id="line-157"></span><span class="anchor" id="line-158"></span><p class="line891"><strong>3.c Spelling</strong>: Check your spelling and dont forget to save <span class="anchor" id="line-159"></span><span class="anchor" id="line-160"></span></li></ul><p class="line867"><strong>Creature, Characters, and Other Involved Model Shaders</strong>: Shaders for creatures, characters, and other involved models are much more complicated and confusing. Eventually, we built up a pretty big library of shaders and could just copy and paste ones and then change out the paths and model and skin map names as needed. We recommend doing the same…copy and paste. <span class="anchor" id="line-161"></span><span class="anchor" id="line-162"></span><p class="line874">Heres an example of a creatures shader set-up… the Makron. Creatures are much more involved than textures or simple, unanimated world models since you have to include shaders for the eyes, weapons, the clipping hull, the glow map, and the teleport fade-out. <span class="anchor" id="line-163"></span><span class="anchor" id="line-164"></span><p class="line867"><span class="anchor" id="line-165"></span><pre>//Makron--------------------------------------------------------------------------------
<span class="anchor" id="line-166"></span>
<span class="anchor" id="line-167"></span>models/monsters/makron/makron_lo
<span class="anchor" id="line-168"></span>{
<span class="anchor" id="line-169"></span> noselfshadow
<span class="anchor" id="line-170"></span> unsmoothedtangents
<span class="anchor" id="line-171"></span> renderbump -size 1024 1024 -trace 0.07 -aa 2 models/monsters/makron/makron_lo_local.tga work/models/monsters/makron/makrontorso_hi.lwo
<span class="anchor" id="line-172"></span>
<span class="anchor" id="line-173"></span> materialImage models/monsters/makron/makron_lo_hit.tga
<span class="anchor" id="line-174"></span>
<span class="anchor" id="line-175"></span> bumpMap addnormals ( models/monsters/makron/makron_lo_local.tga, heightmap ( models/monsters/makron/makron_lo_h.tga, 4 ))
<span class="anchor" id="line-176"></span> specularmap downsize( models/monsters/makron/makron_lo_s.tga, 1 )
<span class="anchor" id="line-177"></span>
<span class="anchor" id="line-178"></span> {
<span class="anchor" id="line-179"></span> blend diffusemap
<span class="anchor" id="line-180"></span> map downsize( models/monsters/makron/makron_lo_d.tga, 1 )
<span class="anchor" id="line-181"></span> alphatest .5
<span class="anchor" id="line-182"></span> }
<span class="anchor" id="line-183"></span> {
<span class="anchor" id="line-184"></span> blend add
<span class="anchor" id="line-185"></span> map downsize( models/monsters/makron/makron_lo_gl.tga, 1 )
<span class="anchor" id="line-186"></span> rgb grunttable [ time * 1.3 ]
<span class="anchor" id="line-187"></span> }
<span class="anchor" id="line-188"></span>
<span class="anchor" id="line-189"></span> inlineGuide corpseBurnEffect(models/monsters/makron/makron_tport.tga)
<span class="anchor" id="line-190"></span>}
<span class="anchor" id="line-191"></span>
<span class="anchor" id="line-192"></span>models/monsters/makron/makron_torso
<span class="anchor" id="line-193"></span>{
<span class="anchor" id="line-194"></span> noselfshadow
<span class="anchor" id="line-195"></span> unsmoothedtangents
<span class="anchor" id="line-196"></span> renderbump -size 1024 1024 -trace 0.07 -aa 2 models/monsters/makron/makron_lo_local.tga work/models/monsters/makron/makrontorso_hi.lwo
<span class="anchor" id="line-197"></span>
<span class="anchor" id="line-198"></span> materialImage models/monsters/makron/makron_lo_hit.tga
<span class="anchor" id="line-199"></span>
<span class="anchor" id="line-200"></span> bumpMap addnormals ( models/monsters/makron/makron_lo_local.tga, heightmap ( models/monsters/makron/makron_lo_h.tga, 4 ))
<span class="anchor" id="line-201"></span> specularmap downsize( models/monsters/makron/makron_lo_s.tga, 1 )
<span class="anchor" id="line-202"></span>
<span class="anchor" id="line-203"></span> {
<span class="anchor" id="line-204"></span> if Parm7 == 0
<span class="anchor" id="line-205"></span> blend diffusemap
<span class="anchor" id="line-206"></span> map downsize( models/monsters/makron/makron_lo_d.tga, 1 )
<span class="anchor" id="line-207"></span> alphatest .5
<span class="anchor" id="line-208"></span> }
<span class="anchor" id="line-209"></span> {
<span class="anchor" id="line-210"></span> blend add
<span class="anchor" id="line-211"></span> map downsize( models/monsters/makron/makron_lo_gl.tga, 1 )
<span class="anchor" id="line-212"></span> rgb grunttable [ time * 1.3 ]
<span class="anchor" id="line-213"></span> }
<span class="anchor" id="line-214"></span> inlineGuide corpseBurnEffect(models/monsters/makron/makron_tport.tga)
<span class="anchor" id="line-215"></span>
<span class="anchor" id="line-216"></span>
<span class="anchor" id="line-217"></span>}
<span class="anchor" id="line-218"></span>
<span class="anchor" id="line-219"></span>models/monsters/makron/makron_torso_collision
<span class="anchor" id="line-220"></span>{
<span class="anchor" id="line-221"></span> noShadows
<span class="anchor" id="line-222"></span> collision
<span class="anchor" id="line-223"></span> materialImage models/monsters/makron/makron_lo_hit.tga
<span class="anchor" id="line-224"></span>}
<span class="anchor" id="line-225"></span>
<span class="anchor" id="line-226"></span>
<span class="anchor" id="line-227"></span>models/monsters/makron/makron_legs
<span class="anchor" id="line-228"></span>{
<span class="anchor" id="line-229"></span> noselfshadow
<span class="anchor" id="line-230"></span> unsmoothedtangents
<span class="anchor" id="line-231"></span> renderbump -size 1024 1024 -trace 0.07 -aa 2 models/monsters/makron/makron_lo_local.tga work/models/monsters/makron/makrontorso_hi.lwo
<span class="anchor" id="line-232"></span>
<span class="anchor" id="line-233"></span> materialImage models/monsters/makron/makron_lo_hit.tga
<span class="anchor" id="line-234"></span>
<span class="anchor" id="line-235"></span> bumpMap addnormals ( models/monsters/makron/makron_lo_local.tga, heightmap ( models/monsters/makron/makron_lo_h.tga, 4 ))
<span class="anchor" id="line-236"></span> specularmap downsize( models/monsters/makron/makron_lo_s.tga, 1 )
<span class="anchor" id="line-237"></span>
<span class="anchor" id="line-238"></span> {
<span class="anchor" id="line-239"></span> blend diffusemap
<span class="anchor" id="line-240"></span> map downsize( models/monsters/makron/makron_lo_d.tga, 1 )
<span class="anchor" id="line-241"></span>// alphatest .5
<span class="anchor" id="line-242"></span> }
<span class="anchor" id="line-243"></span> {
<span class="anchor" id="line-244"></span> blend add
<span class="anchor" id="line-245"></span> map downsize( models/monsters/makron/makron_lo_gl.tga, 1 )
<span class="anchor" id="line-246"></span> rgb grunttable [ time * 1.3 ]
<span class="anchor" id="line-247"></span> }
<span class="anchor" id="line-248"></span> inlineGuide corpseBurnEffect(models/monsters/makron/makron_tport.tga)
<span class="anchor" id="line-249"></span>
<span class="anchor" id="line-250"></span>}
<span class="anchor" id="line-251"></span>
<span class="anchor" id="line-252"></span>models/monsters/makron/makron_legs_collision
<span class="anchor" id="line-253"></span>{
<span class="anchor" id="line-254"></span> noShadows
<span class="anchor" id="line-255"></span> collision
<span class="anchor" id="line-256"></span> materialImage models/monsters/makron/makron_lo_hit.tga
<span class="anchor" id="line-257"></span>}
<span class="anchor" id="line-258"></span>
<span class="anchor" id="line-259"></span>models/monsters/makron/makron_eye
<span class="anchor" id="line-260"></span>{
<span class="anchor" id="line-261"></span> noselfshadow
<span class="anchor" id="line-262"></span> unsmoothedtangents
<span class="anchor" id="line-263"></span> renderbump -size 128 128 -trace 0.05 -aa 2 models/monsters/failed_transfer/ft_eye_local.tga work/models/monsters/failed_transfer/ft_eye_hi.lwo
<span class="anchor" id="line-264"></span>
<span class="anchor" id="line-265"></span> materialType flesh
<span class="anchor" id="line-266"></span>
<span class="anchor" id="line-267"></span> diffusemap models/monsters/failed_transfer/ft_eye_d.tga
<span class="anchor" id="line-268"></span> bumpmap models/monsters/failed_transfer/ft_eye_local.tga
<span class="anchor" id="line-269"></span> specularmap models/monsters/failed_transfer/ft_eye_s.tga
<span class="anchor" id="line-270"></span>
<span class="anchor" id="line-271"></span> inlineGuide corpseBurnEffect(models/monsters/corpseBurnEffect_sm.tga)
<span class="anchor" id="line-272"></span>}
<span class="anchor" id="line-273"></span></pre><span class="anchor" id="line-274"></span><span class="anchor" id="line-275"></span><p class="line867"><strong>Step 4: Setting up shaders for your model</strong> <span class="anchor" id="line-276"></span>In this stage, youll go back into the low poly model and assign the shader you wrote to make your normal map. <span class="anchor" id="line-277"></span><span class="anchor" id="line-278"></span><ul><li style="list-style-type:none"><p class="line891"><strong>4.a Open your low poly model and assign your shader name to a surface on the model</strong>: This is another key to get things to work, if you dont have the right shader on the right model, you wont be getting the right results. In Lightwave hit Q and a dialogue will appear. Copy the shader name from the material file and paste it into the dialogue. So in the previous example youd open the medium.lwo barrel model and assign models/mapobjects/strogg/barrels_and_containers/barrels/medium1_low to the model. <span class="anchor" id="line-279"></span><span class="anchor" id="line-280"></span><p class="line891"><strong>4.b Assign attributes to the surface</strong>: <span class="anchor" id="line-281"></span><ol type="1"><li>In Lightwave open the Surface Editor. <span class="anchor" id="line-282"></span><span class="anchor" id="line-283"></span></li><li class="gap">Select the shader name in the left column (it will highlight) <span class="anchor" id="line-284"></span><span class="anchor" id="line-285"></span></li><li class="gap">Go to the basic tab <span class="anchor" id="line-286"></span><span class="anchor" id="line-287"></span></li><li class="gap">Go to the color line and hit the “T” button <span class="anchor" id="line-288"></span><span class="anchor" id="line-289"></span></li><li class="gap">The Texture editor dialog will appear <span class="anchor" id="line-290"></span><span class="anchor" id="line-291"></span></li><li class="gap">In the middle right column there will be a pop down menu for projection, select UV <span class="anchor" id="line-292"></span><span class="anchor" id="line-293"></span></li><li class="gap">A UVmap pop down menu will appear <span class="anchor" id="line-294"></span><span class="anchor" id="line-295"></span></li><li class="gap">Select the Texture UV map. (Generally this will apply) <span class="anchor" id="line-296"></span><span class="anchor" id="line-297"></span></li><li class="gap">Close the Texture editor <span class="anchor" id="line-298"></span><span class="anchor" id="line-299"></span></li><li class="gap">Select the gray box on the color line, a color window will appear. Select a different color than gray. (this is to assure your changes were made) to close the window click the OK button <span class="anchor" id="line-300"></span><span class="anchor" id="line-301"></span></li><li class="gap">Go to the bottom of the right column, and click the smoothing button on. For rendering put it at 180 <span class="anchor" id="line-302"></span><span class="anchor" id="line-303"></span></li></ol><p class="line891"><strong>4.c Save</strong> <span class="anchor" id="line-304"></span><span class="anchor" id="line-305"></span></li></ul><p class="line874">Youve now prepped the low poly model to be rendered. When you activate the low poly to be rendered, the game will load the model, and see that it has an active shader. It will then find the shader and use the renderbump line to write a targa based on the high poly model using the parameters youve set. <span class="anchor" id="line-306"></span><span class="anchor" id="line-307"></span><p class="line867"><strong>Step 5: Rendering</strong> <span class="anchor" id="line-308"></span><ul><li><p class="line862">With Quake4 installed on your computer, open the <strong>Command Prompt</strong> on your computer (Go to <strong>Start</strong>, then <strong>All Programs</strong>, <strong>Accessories</strong>, <strong>Command Prompt</strong>). <span class="anchor" id="line-309"></span><span class="anchor" id="line-310"></span></li><li class="gap"><p class="line862">Type in <strong>C:</strong> and hit <strong>Enter</strong>. <span class="anchor" id="line-311"></span><span class="anchor" id="line-312"></span></li><li class="gap"><p class="line862">Type in <strong>cd &lt;your installation directory&gt;</strong> to change directories. This should point to where you have Quake4 installed. <strong>(C:\Program Files\id Software\Quake 4)</strong> <span class="anchor" id="line-313"></span><span class="anchor" id="line-314"></span></li><li class="gap"><p class="line891"><strong>For Textures</strong>: Type in <strong>Quake4 +renderbumpflat [ -size &lt;x&gt; &lt;y&gt; ] &lt; path to model &gt;</strong> to allow the engine to find your texture model to render from. <span class="anchor" id="line-315"></span><span class="anchor" id="line-316"></span><ol type="1"><li><p class="line862">In the <strong>“-size”</strong> section, type in the size you want your textures normal to be rendered out at in a power of 8. It might be a 32 X 32, 64 X 64, 128 X 128, 512 X 512, or even a 1024 X 1024. To create a texture that has an odd aspect-ratio, such as 512 X 256, just type that into the size section. <span class="anchor" id="line-317"></span><span class="anchor" id="line-318"></span></li><li class="gap"><p class="line862">In the “<strong>path to model</strong>” section, type in the path where your texture can be found on your computer. <span class="anchor" id="line-319"></span><span class="anchor" id="line-320"></span></li></ol></li><li class="gap"><p class="line891"><strong>For Models</strong>: Type in <strong>Quake4 +renderbump [ size &lt;x&gt; &lt;y&gt; ] [ -trace &lt; distance &gt; ] [ -aa &lt; # times aa &gt; ] [ -unweld ] [ -overlap &lt; size &gt; ] [ -globalmap ] [ -colormap ] [ -outline &lt; size &gt; ] [ -mergehigh ] [ -outline &lt; size &gt; ] &lt; normal map image file &gt; &lt; path to model &gt;</strong> <span class="anchor" id="line-321"></span><span class="anchor" id="line-322"></span></li><li class="gap"><p class="line862">Hit <strong>Enter</strong> for the normal map to be run in the engine and be generated. The normal map will be rendered out to your <strong>C: Drive</strong>. Type in <strong>Quit</strong> in the console to quit out the game. <span class="anchor" id="line-323"></span><span class="anchor" id="line-324"></span></li></ul><p class="line867"><strong>Other Tips for Rendering:</strong> <span class="anchor" id="line-325"></span><ul><li style="list-style-type:none"><p class="line891"><strong>5.a Load the game and make sure you are in windows mode:</strong> If the game is full screen renderbump <strong>WILL NOT WORK.</strong> <span class="anchor" id="line-326"></span><span class="anchor" id="line-327"></span><p class="line891"><strong>5.b Let the renderbump render</strong>: At this point Quake 4 will start and a grey window will appear. The window will draw a normal map in the window. After it is finished rendering the normal map the window will change to an in game window and will seem to freeze. Do not interrupt the game at this time, its writing the targa down to your C drive and sometimes it takes time. <span class="anchor" id="line-328"></span><span class="anchor" id="line-329"></span><p class="line891"><strong>5.c Set up the shaders to see the model in game</strong>: At this point, youll need to take a look at your work. Set up temporary targas for the _d, _h, _s and put them on base with the _local in the correct directory. The renderline is not loaded into the game unless its called out, so leaving it there is ok. Load into <a href="./ModView.html">ModView</a> and see the magic. See below example: <span class="anchor" id="line-330"></span><span class="anchor" id="line-331"></span></li></ul><p class="line867"><span class="anchor" id="line-332"></span><pre>models/mapobjects/strogg/barrels_and_containers/barrels/medium1_low
<span class="anchor" id="line-333"></span>{
<span class="anchor" id="line-334"></span> noselfShadow
<span class="anchor" id="line-335"></span> unsmoothedtangents
<span class="anchor" id="line-336"></span>
<span class="anchor" id="line-337"></span>renderbump -size 256 256 -trace .05 -aa 2 -mergehigh models/mapobjects/strogg/barrels_and_containers/barrels/barrel1_low_local.tga work/models/mapobjects/strogg/barrels_and_containers/barrels/barrel1_high.lwo
<span class="anchor" id="line-338"></span>
<span class="anchor" id="line-339"></span>diffusemap models/mapobjects/strogg/barrels_and_containers/barrels/medium1_low_d.tga
<span class="anchor" id="line-340"></span>bumpmap addnormals ( models/mapobjects/strogg/barrels_and_containers/barrels/medium1_low_local.tga, heightmap ( models/mapobjects/strogg/barrels_and_containers/barrels/medium1_low_h.tga, 1 ) )
<span class="anchor" id="line-341"></span>specularmap models/mapobjects/strogg/barrels_and_containers/barrels/medium1_low_s.tga
<span class="anchor" id="line-342"></span>}
<span class="anchor" id="line-343"></span></pre><span class="anchor" id="line-344"></span><span class="anchor" id="line-345"></span><p class="line874">If all went well, you rendered out your normal map for your creature or character. In the next section, were going to look into tips, tricks and troubleshooting for potential problems that may occur. <span class="anchor" id="line-346"></span><span class="anchor" id="line-347"></span><p class="line867"><img class="attachment" src="ArtReference_CreatingModels_07.jpg" title="attachment:image_07.jpg" /> <span class="anchor" id="line-348"></span><span class="anchor" id="line-349"></span><p class="line867"><strong>Step 6: Tips and Tricks</strong> <span class="anchor" id="line-350"></span>In this section, well go over some tips and tools that have been added to the render code to make it easier to render complex geometry. <span class="anchor" id="line-351"></span><span class="anchor" id="line-352"></span><ul><li style="list-style-type:none"><p class="line891"><strong>6.a Avoid overdraw</strong>: Overdraw is our bane on animated pieces. The best thing to do is have the modeler build the model and separate it into sections. Then write some shaders that point to the different pieces and render it that way. Try to set up your low poly and highlight pieces that arent touching each other as a shader name and the rest as of the model with a default surface. Mirror the low poly selections in a high poly file and write a shader to the new high poly pieces. Assign the shader to the low and render the file. It will only render whats highlighted. Then render the others until youre done. Assemble the Local map using the channels and layers then you have your local. Save it down as a targa. Remember to change the name of the local map in the render line EVERY TIME you render different sections from the same model, otherwise youll copy over your work and be angry. <span class="anchor" id="line-353"></span><span class="anchor" id="line-354"></span><p class="line891"><strong>6.b Assembling the local map</strong>: When you have multiple local maps and you need to assemble them into one map use the channels in each file, invert the selection and give yourself a three pixel expand so you have some bleed on the local. Invert the selection and shift drag it into another file. It should snap to the edge. A different way of doing it is after you enlarge the selection and reinvert the file you can fill the negative selection with a sampled 50% gray. Deselect the file and drag the file over to a base file. Assign the layer with overlay and all of the gray will drop out. <span class="anchor" id="line-355"></span><span class="anchor" id="line-356"></span><p class="line891"><strong>6.c Rendering takes time and patience</strong>: For higher poly models, like creatures or characters that are in the millions of polys range, it may take several minutes to an hour or more to render out parts. Be patient… <span class="anchor" id="line-357"></span><span class="anchor" id="line-358"></span><p class="line891"><strong>6.d The .1, .2. .3 system</strong>: Early on in the project, one of our programmers added some nice functionality to the rendering system. If you want to render a section of the model because of weird lighting or you may want to render out a partial model, you can add a .1 after the surface name in Lightwave. (or whatever you want to name it: Example shadername.Forehead or shadername.300 or shadername.iamcool, whatever) <span class="anchor" id="line-359"></span><span class="anchor" id="line-360"></span></li></ul><p class="line867"><span class="anchor" id="line-361"></span><pre>Example:
<span class="anchor" id="line-362"></span>In Lightwave youd assign the following to a model in the surface parameters:
<span class="anchor" id="line-363"></span>
<span class="anchor" id="line-364"></span>Heres your base shader from the above example
<span class="anchor" id="line-365"></span>models/mapobjects/strogg/barrels_and_containers/barrels/medium1_low
<span class="anchor" id="line-366"></span>
<span class="anchor" id="line-367"></span>Select out a pesky bit of geometry and hit Q enter this
<span class="anchor" id="line-368"></span>models/mapobjects/strogg/barrels_and_containers/barrels/medium1_low.1
<span class="anchor" id="line-369"></span>
<span class="anchor" id="line-370"></span>While the model is rendering, it will render the top shader first and then render the .1 shader separately afterwards. All in the same render and the same file.
<span class="anchor" id="line-371"></span>
<span class="anchor" id="line-372"></span>If you really want to get tricky, lets say only one area of the model isnt rendering properly, and you know you need a higher trace value for one section. Instead of cutting and pasting into the local map select the geometry and add
<span class="anchor" id="line-373"></span>models/mapobjects/strogg/barrels_and_containers/barrels/medium1_low.2 trace .09
<span class="anchor" id="line-374"></span>
<span class="anchor" id="line-375"></span>This will render that area at a higher trace. The only drawback to this is it can make for some weird lighting. The best thing to do for this is to select whole sections of geometry…select a whole side verses part of a side.
<span class="anchor" id="line-376"></span></pre><span class="anchor" id="line-377"></span><ul><li><p class="line891"><strong>Painting on the normal</strong>: Sometimes youll get weird anamolies that no amount of rerendering or altering the trace height will get rid of. In those cases, the artist would paint on the normal map in Photoshop to get rid of the anamoly. Painting on the normal takes skill and a real good understanding of how the normal map works. Several of our artists definitely painted on their normals, but we recommend that the best thing to do is to either CUT and PASTE from another “clean” section of the normal or use the CLONING tool in Photoshop. You can also pull detail from other local maps, but be sure the renders are on the same planes and you cannot rotate anything you may bring into the new local map. <span class="anchor" id="line-378"></span><span class="anchor" id="line-379"></span></li></ul><p class="line867"><strong>Step 7: Trouble shooting</strong> <span class="anchor" id="line-380"></span>There will occasionally be problems that arise with the renderbumping system. Some of the problems can be solved pretty easily while others may take time to figure out. Refer to this listing when you have a problem… <span class="anchor" id="line-381"></span><span class="anchor" id="line-382"></span><p class="line867"><strong>IMPORTANT!</strong> If something isnt working right wait until the render is done and look through the errors. When the render has finished look at the print-out that pops up afterwards. Nine times out of ten, if its a shader or a model issue it will show up there. <span class="anchor" id="line-383"></span><span class="anchor" id="line-384"></span><p class="line867"><strong>Problems and possible fixes:</strong> <span class="anchor" id="line-385"></span><ul><li style="list-style-type:none"><p class="line891"><strong>7.a The render window pops up, but theres no local map being drawn:</strong>This could be any number of things. <span class="anchor" id="line-386"></span><span class="anchor" id="line-387"></span><ol type="1"><li>Check the error <span class="anchor" id="line-388"></span><span class="anchor" id="line-389"></span></li><li class="gap">Check the shader for spelling and path <span class="anchor" id="line-390"></span><span class="anchor" id="line-391"></span></li><li class="gap">Check the low poly models shader surface name. <span class="anchor" id="line-392"></span><span class="anchor" id="line-393"></span></li><li class="gap">Check to make sure youre rendering from the correct model. <span class="anchor" id="line-394"></span><span class="anchor" id="line-395"></span></li><li class="gap">Sometimes the model will have a surface that is actually a shader. If this happens the game gets caught in a loop and wont render. <span class="anchor" id="line-396"></span><span class="anchor" id="line-397"></span></li></ol><p class="line891"><strong>7.b The low or high poly model wont load:</strong> <span class="anchor" id="line-398"></span><span class="anchor" id="line-399"></span><ol type="1"><li><p class="line862">Check to see if model is tripled and has only tris. If any model has quads in it or anything other than tris it <strong>WILL NOT LOAD.</strong> <span class="anchor" id="line-400"></span><span class="anchor" id="line-401"></span></li><li class="gap">The High poly model may have some surface the game doesnt like. Its rare that this happens, but it does occur in some of the Maya and 3D Studio MAX translated models. <span class="anchor" id="line-402"></span><span class="anchor" id="line-403"></span></li></ol><p class="line891"><strong>7.c The render is creating weird colors in the local map:</strong> <span class="anchor" id="line-404"></span><span class="anchor" id="line-405"></span><ol type="1"><li><p class="line891"><strong>Shards of color</strong>: This could be a couple of different things. Either you need to heighten or lower your trace height or you have some problem with overdraw. For trace height use the .1, .2 trace .07 trick. Or re-render the local and piece the files together in Photoshop. Remember to change the local.tga name when you re-render otherwise it will overwrite the local that may be good. For overdraw youll have to move some pieces out of the high poly model and render them separately. <span class="anchor" id="line-406"></span><span class="anchor" id="line-407"></span></li><li class="gap"><p class="line891"><strong>The green/purple cut</strong>: This happens in unsmoothed tangents mostly and happens quite often. It may have something to do with how unsmoothed tangents averages smaller geometry. In game, it causes a black line in the middle of the lighting. To fix this, youll need to re-render that area separately using the .1 method or selecting out the area and copy and pasting it into the local map. <span class="anchor" id="line-408"></span><span class="anchor" id="line-409"></span></li></ol><p class="line891"><strong>7.d My local map has distortion</strong>: There are various reasons this can happen. The first thing to do is to create some temp textures and get them in game to see if the normal is really distorted. Sometimes the local map looks distorted but isnt. Some distortions are from the lack of polys on the low poly model. Depending on game issues and cost you may be able to add polys to the model to alleviate the problem. <span class="anchor" id="line-410"></span><span class="anchor" id="line-411"></span><p class="line891"><strong>7.e I have a model in game that has lighting issues along the seams</strong>: There are only a couple ways to fix this, one is to make sure your skin is painted right, the other is to directionally weld the points to the other half of the UV map. This forces the low poly to read a certain way. Also make sure your seams match on the diffuse, height and specular. In some cases you may need to re-rip and rerender the UVs to make this problem go away. Make sure you load the model in game with a temp texture before you get into the paint stage to avoid hours of lost work, etc. <span class="anchor" id="line-412"></span><span class="anchor" id="line-413"></span><p class="line891"><strong>7.f UVs arent translating over to the .obj file</strong>: Youll need to follow the directions in Step 4. <span class="anchor" id="line-414"></span><span class="anchor" id="line-415"></span><p class="line891"><strong>7.g The model wont show up in-game or only shows up partially in-game</strong>: A couple things could be wrong. The error message will tell you a lot if you encounter this problem. It will either be that the .tga files are in the wrong place, the shader name is bad, the shader isnt applied to the whole surface, or the d3t files are overriding the render. <span class="anchor" id="line-416"></span><span class="anchor" id="line-417"></span></li></ul><p class="line867">
<h2 id="head-4152af2ebdcdf51e21eaf84fd7ea3f511a7a1fab">Painting Your Diffuse, Specular, and Height Maps:</h2>
<span class="anchor" id="line-418"></span><p class="line874">After you have rendered out the normal map, you can then start painting the diffuse, specular, and height maps for your creature or character. Any painting program can be used to create your skin, but we at Raven use Photoshop, as do most computer and console game studios. <span class="anchor" id="line-419"></span><span class="anchor" id="line-420"></span><p class="line867"><strong>Diffuse Map</strong>: The diffuse map is the color portion of your skin. It determines the colors of the creatures flesh, paint job, decals, blood, etc. Since your creature or character is somewhat realistic looking in the game, we recommend using photo reference for your diffuse. Photo reference are digital photos of rusty metal, different types of metals, chipped paint, blood, wounds, flesh, etc that are used to create realistic looking skins. You can use a digital camera and go out and shoot lots of real asset photos to use for your diffuse map. There is still plenty of “real” painting to do on the skin, even with using photo reference. <span class="anchor" id="line-421"></span><span class="anchor" id="line-422"></span><p class="line874">For the Makrons diffuse map, the artist used photos of the scratched up paint on a bulldozer that he took for the painted and scratched areas of the skin. The artist altered the color slightly and adjusted and added additional scratches, dirt, and rust. He also used several different photos of differing types of metals, etc to vary up the detail on the Makron. For the Makrons exposed flesh, he used photos of pig flesh and added in the veins, bruising, and ripped open wounds and blood. See examples of the bulldozer photo reference and the final diffuse below: <span class="anchor" id="line-423"></span><span class="anchor" id="line-424"></span><p class="line867"><img class="attachment" src="ArtReference_CreatingModels_08.jpg" title="attachment:image_08.jpg" /> <span class="anchor" id="line-425"></span><span class="anchor" id="line-426"></span><p class="line867"><img class="attachment" src="ArtReference_CreatingModels_09.jpg" title="attachment:image_09.jpg" /> <span class="anchor" id="line-427"></span><span class="anchor" id="line-428"></span><p class="line867"><strong>Specular Map</strong>: The specular map is used to add sheen to areas of your creatures skin, highlights to edges, and can help determine different types of metals, chipped paint, etc. I believe the specular map is the hardest part of the skin to paint and the most time-consuming of the three maps. Do a really nice job on the specular and itll really make your skin sing. <span class="anchor" id="line-429"></span><span class="anchor" id="line-430"></span><p class="line862">I have included a sample of the Makrons specular map with areas of flesh, blood, metal, etc pointed out. You can use this as a basis to determine how to do your specular. Also, look at some of the other Q4 creatures speculars to gain a better understanding and read our <a href="./ArtReference_SpecularMaps.html">Specular Maps</a> write up. Its very basic, but informative as to how we created specular maps for Quake4. <span class="anchor" id="line-431"></span><span class="anchor" id="line-432"></span><p class="line867"><img class="attachment" src="ArtReference_CreatingModels_10.jpg" title="attachment:image_10.jpg" /> <span class="anchor" id="line-433"></span><span class="anchor" id="line-434"></span><p class="line874">Tips to painting nice specular maps: <span class="anchor" id="line-435"></span><span class="anchor" id="line-436"></span><ol type="1"><li>When doing flesh, rubber, and other not too reflective surfaces make those areas on your specular map the darkest areas in relation to the other more reflective parts. Flesh and rubber dont usually reflect a lot of light and therefore would be darker on your specular than some shiny metal, etc. <span class="anchor" id="line-437"></span><span class="anchor" id="line-438"></span></li><li class="gap">You can define chrome, stainless steel, and other very reflective metals by upping the highlights or brightness on those areas of the specular. <span class="anchor" id="line-439"></span><span class="anchor" id="line-440"></span></li><li class="gap">Adding little “hotspots” of light to highlighted edges can really help sell the realism of your skin. <span class="anchor" id="line-441"></span><span class="anchor" id="line-442"></span></li><li class="gap">Make painted areas slightly less reflective than the metal underneath. If the metal showing though the chipped areas is a tad brighter than the painted parts, the skin will look more realistic. <span class="anchor" id="line-443"></span><span class="anchor" id="line-444"></span></li><li class="gap">On cylinders and other rounded areas on your skin, adding a highlighted section or horizon line will make that area read much more realistically as the light rolls across/over it. <span class="anchor" id="line-445"></span><span class="anchor" id="line-446"></span></li><li class="gap">You can add percentages of color to your specular map to intensify particular colors on your creatures or characters skin. A good example would be the Nexus Protector (Stream Protector). His bodys paint job is white, but has a greenish pallor to it. Making his specular map a purplish color created a pearlescent white color to his skin. <span class="anchor" id="line-447"></span><span class="anchor" id="line-448"></span></li><li class="gap">Creating realistic looking blood on your specular: On your diffuse, paint your blood the normal reddish color on a layer, and then for your specular map slide a copy of the blood over and invert it. In Photoshop, hit Image, then Adjustments, then Invert. That will invert the color information of your blood. After being inverted, the blood will be blue green in color. You can adjust the brightness and intensity and flatten it onto your specular map. Once that is in place and saved out, the blood will look so much more realistic and wet. See example above. <span class="anchor" id="line-449"></span><span class="anchor" id="line-450"></span></li></ol><p class="line867"><strong>Height Map</strong>: The height map compliments the normal map. It is used to add dings, dents, scratches, indented wounds to flesh, etc. It is just a grey-scaled image. The way the height map works is that white equates to height and black equals depth. By varying the intensities of white and black, it creates differing height and depth information to the height map. The brighter or more intense the white, the greater the height indicated on your height map. The darker or more intense the black, the deeper the depth on your height map. The height map can only indicate height and depth on a 90 degree up and down angle. It cant indicate angled information like the normal map can. <span class="anchor" id="line-451"></span><span class="anchor" id="line-452"></span><span class="anchor" id="line-453"></span><p class="line874">Tips to doing height maps correctly: <span class="anchor" id="line-454"></span><span class="anchor" id="line-455"></span><ol type="1"><li><p class="line891"><strong>DO NOT</strong> just grayscale the normal map and invert it to create your height map! Doing so will only cause the height map to fight the light vectoring information of the normal and nullify its effectiveness. <span class="anchor" id="line-456"></span><span class="anchor" id="line-457"></span></li><li class="gap">Start out your height map out with a 50% gray as its base background color. Consider 50% gray as being totally flat and anything lighter in value as being raised above it and anything darker than 50% as being lower or beneath it. <span class="anchor" id="line-458"></span><span class="anchor" id="line-459"></span></li><li class="gap">Avoid adding tons of noise to create height. Too much noise will only muddy your height and normal maps and destroy the effectiveness of both. <span class="anchor" id="line-460"></span><span class="anchor" id="line-461"></span></li><li class="gap">The height map doesnt need to be overly detailed or very busy looking to do its job. It is meant to compliment the normal, not override it. If you look at the Makrons height map, youll notice that its pretty simple. All that are on it are indications of scratches in the paint job of the Makrons metal body parts and the flesh areas with the wounds. Notice that the veins and wrinkles on the flesh are raised with pretty intense white and that the wounds are pushed in with some very dark grays. The scratches in the metal parts of the Makrons body are a very light gray color since paint is usually only microns thick and the scratches wouldnt be very deep when the paint is on top of metal. <span class="anchor" id="line-462"></span><span class="anchor" id="line-463"></span></li></ol><p class="line867"><img class="attachment" src="ArtReference_CreatingModels_11.jpg" title="attachment:image_11.jpg" /> <span class="anchor" id="line-464"></span><span class="anchor" id="line-465"></span><p class="line867"><strong>Glow Map</strong>: The glow map indicates areas on the skin that glow or look like lights. The glow map usually has a 100% black as its base background and snippets of color that indicate the lights, etc. Through the shader, you can have the glow map flicker, etc. As an example, we have provided the Makrons glow map below. On some of the glow maps we created for Quake4, youll notice that some of the lights are painted to look like headlight-like lamps. Indicating the little lines and boxes that you see in a headlamp, make your lights look a lot more realistic. You get a better understanding, go out and look at your cars headlights or find a picture of some and look at how the glass covering is etched to refract and concentrate the light emitted from the bulb. <span class="anchor" id="line-466"></span><span class="anchor" id="line-467"></span><p class="line867"><img class="attachment" src="ArtReference_CreatingModels_12.jpg" title="attachment:image_12.jpg" /> <span class="anchor" id="line-468"></span><span class="anchor" id="line-469"></span><p class="line867"><strong>Hit Map</strong>: The hit map indicates to the engine what kind of material parts of your creature or character are made of, such as solid metal, hollow metal, rubber, etc. <a href="./FXEditor.html">Effects</a> are also tied to it and fire when that particular area is shot. Flesh will squirt blood when shot. Metal will emit sparks when shot. Concrete will spout puffs of dust and pebbles. We created a material detection system based on the RGB setting numbers of particular colors. We have included our material detection color guide and an example of the Makrons hit map below. Since pixel density isnt as important on the hit map, we usually decrease the size of it by one or two times to save on texture memory. <span class="anchor" id="line-470"></span><span class="anchor" id="line-471"></span><p class="line867"><img class="attachment" src="ArtReference_CreatingModels_13.jpg" title="attachment:image_13.jpg" /> <span class="anchor" id="line-472"></span><span class="anchor" id="line-473"></span><p class="line867"><img class="attachment" src="ArtReference_CreatingModels_14.jpg" title="attachment:image_14.jpg" /> <span class="anchor" id="line-474"></span><span class="anchor" id="line-475"></span><p class="line867"><strong>Viewing your model in <a href="./ModView.html">ModView</a></strong>: The Quake4 game comes with a nifty little addition called <a href="./ModView.html">ModView</a> that allows you to see the skin on your model as you are painting and updating it. <a href="./ModView.html">ModView</a> is a model viewer. You can see your model in wireframe mode, rotate the model on all axes, update your skin, view animations on your model, change lighting, and access alternate skins and models. Its a wonderful little tool. <span class="anchor" id="line-476"></span><span class="anchor" id="bottom"></span></div><p id="pageinfo" class="info" lang="en" dir="ltr">ArtReference CreatingModels (last edited 2005-11-04 18:56:57 by <span title="EricBiessman @ 67.129.250.254[67.129.250.254]"><a class="nonexistent" href="./EricBiessman.html" title="EricBiessman @ 67.129.250.254[67.129.250.254]">EricBiessman</a></span>)</p>
<div id="pagebottom"></div>
</div>
<div id="footer">
<ul class="editbar"><li><span class="disabled">Immutable Page</span></li><li><a href="./ArtReference_CreatingModels?action=info">Info</a></li><li><a href="./ArtReference_CreatingModels?action=AttachFile">Attachments</a></li><li>
<form class="actionsmenu" method="get" action="">
<div>
<label>More Actions:</label>
<select name="action"
onchange="if ((this.selectedIndex != 0) &&
(this.options[this.selectedIndex].disabled == false)) {
this.form.submit();
}
this.selectedIndex = 0;">
<option value="raw">Raw Text</option>
<option value="print">Print View</option>
<option value="RenderAsDocbook">Render as Docbook</option>
<option value="refresh">Delete Cache</option>
<option value="show" disabled class="disabled">------------</option>
<option value="SpellCheck">Check Spelling</option>
<option value="LikePages">Like Pages</option>
<option value="LocalSiteMap">Local Site Map</option>
<option value="show" disabled class="disabled">------------</option>
<option value="RenamePage" disabled class="disabled">Rename Page</option>
<option value="DeletePage" disabled class="disabled">Delete Page</option>
<option value="show" disabled class="disabled">------------</option>
<option value="MyPages">My Pages</option>
<option value="SubscribeUser">Subscribe User</option>
<option value="show" disabled class="disabled">------------</option>
<option value="Despam">Remove Spam</option>
<option value="PackagePages">Package Pages</option>
</select>
<input type="submit" value="Do">
</div>
<script type="text/javascript">
<!--// Init menu
actionsMenuInit('More Actions:');
//-->
</script>
</form>
</li></ul>
<ul id="credits">
<li><a href="http://moinmoin.wikiwikiweb.de/">MoinMoin Powered</a></li><li><a href="http://www.python.org/">Python Powered</a></li><li><a href="http://validator.w3.org/check?uri=referer">Valid HTML 4.01</a></li>
</ul>
</div>
</body>
</html>