iddevnet/quake4/ArtReference_CreatingModels.html

424 lines
83 KiB
HTML
Raw Permalink Normal View History

<!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">
2021-04-10 13:40:18 +00:00
<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>
2021-04-10 13:40:18 +00:00
<ul id="username"><li><a href="./ArtReference_CreatingModels?action=login" id="login">Login</a></li></ul>
<div id="locationline">
<ul id="pagelocation">
2021-04-10 13:40:18 +00:00
<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>
2021-04-10 13:40:18 +00:00
<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 nor
<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
<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="
<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 c
<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-re
<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
<div id="pagebottom"></div>
</div>
<div id="footer">
2021-04-10 13:40:18 +00:00
<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>