Robert L. Hoffman
Aliases –
rlhoffman, nzy3vc, Rogue Leader
Table of Contents
2. Index ( Table of Contents )
3. Modeling Methods Defined
3. Tools
4. Modeling a simple object
11. Skinning a simple object
12. Creating / editing and .odf file
13. Modeling a complex object.
23. Skinning a complex object.
29. Links and citations
30. Definitions
31. Document Version Control
Modeling Methods Defined
There are several modeling methods. The most basic method is called the "Box Modeling" method. This can be thought of in the following manner. Imagine if you had a bunch of cardboard boxes. These boxes are one foot by one foot by one foot. Now let's say you stack them three wide by three deep by three tall. You would now have a cube that has a total of nine boxes. Now the beauty of this method is that you can move points on these boxes without causing wrinkles like what would happen with real cardboard. This method uses more than just cubes. In fact, this method can use many primitives such as; sphere, cone, and cylinder are a few of the more commonly used objects.
Tools
There are several software pieces you will need;
These are the tools I have installed and use. There may be others that aren't listed that work. the basic rule here is, find at least one tool that works, that you are comfortable with.
Modeling a Simple Object
I will begin by using XSI Foundation ( since it has a working exporter ). Let us begin with a simple object. I plain wall is even too simple, so we will start with a wall that can have a door in it. We will make it a double wide door. What I have found with XSI products, is that 1 square is about three feet, or 1 meter. So an average human standing with arms stretched will be two squares high by 2 squares wide. With that in mind, let us consider a typical wall and doorway.
Average floor height in a home is about eight feet. Average doorway is about three feet by seven feet. Let’s make the room is about fifteen feet wide.
Open up XSI Foundation.
You will have a blank scene.
The upper left is the top view. The upper right is the camera view. The lower left is the front view. Finally, the lower right is the right side view.
Start by selecting Primitives from the tool bar.
Then from the drop-down, select null.
You should now see a little plus sign that is centered at 0,0,0.
Take any of the view windows where it says A , B, C, or D and select explorer. I usually use top view.
Now, in the explorer window, right click on the null you just created and select rename. Make the new name MS3DSceneRoot . Type it exactly as listed. Why ? I don’t know, but every object that I’ve exported from the game was this way. I’ve tried different root names, and the object didn’t appear correctly when imported.
Now right click on MS3DSceneRoot and select properties, then from the side pop windows select viewing.
Now uncheck the Render Visibility check box, and click the " x " close window in the upper right of the properties box.
What this does is allow you to see and select the Scene Root, but it will not be visible when rendered.
The Scene Root must be selectable when you export, because all objects must be under one Scene Root.
Now we start to create our wall. From the top toolbar, select Primitives, then Polygon Mesh, then cube. It will create a cube that is 8x8x8 and start with the properties box open. Since walls are generally only about a foot thick, highlight the length 8 and type .33 yes that’s point or dot 33.
Close the properties box.
The object just created will be highlight white. The "Art Design Guide" provided with BFBuilder states that all objects should be created with their center at 0,0,0. But we don’t want half the wall buried in the ground. And since we created out MS3DSceneRoot at 0,0,0 we can adjust our object at will and not worry about it.
Adjustments are done through the Transform tool on the right side panel. It looks like this;
The S is for Size. The R is for Rotation. The T is for location. Yeah I know, weird but oh well.
Anyway, the first thing we want to do is get the wall to the proper size.
We do this before moving it, because when you re-size an object it grows out in both directions.
So click on the S. you’ll now notice three color bars that correspond to the x-axis, y-axis, and z-axis.
Red, Green and blue respectively. Since we don’t want to spend all day stacking one foot boxes to make our wall, we simply stretch the y-axis by a factor of eight. This should give us our eight foot high clearance.
Now we can stretch the wall to fit our width. Remember we want the wall to be fifteen feet wide with a double wide doorway. So let’s stretch the x-axis by a factor of 4.5.
Now that our object is at it’s proper size let us move it to the proper location, so in the Transform tool panel, click on the T.
Adjust the x-axis by -1.7425, and then adjust the y-axis by 1.33. It should look like this ;
Now in the explorer window, right click on the cube and select rename. Type leftside .
Now a quick and easy shortcut. In the explorer window, right click on leftside and select duplicate. Now you should see a leftside1 object, and it should be highlighted. Now we want to move this to the right side of the door, so under the Transform tool panel, select the T and adjust the x-axis to be 1.7425 and verify that that y-axis is 1.33. Now you can rename leftside1 to rightside.
Now from the top toolbar select Primitives, then Polygon Mesh and then Cube. You will see a new cube with a length of 8, and it’s properties box. Modify the length to 2, and close the properties box.
Next we want to resize this piece so select the S from the Transform tool panel. Adjust the z-axis to .165 ( .165 of a 2 block is equal to the .33 of a one block that we made the first two pieces out of )
Then adjust the y-axis to be also .165 and the result should be a cube 6 feet wide, 1 foot high and 1 foot deep. Now you can rename this piece top.
Now we need to move it into place, so select the T from the transform tool panel. Adjust the y-axis by 2.4825. Now all three objects should line up. You can zoom in by selecting the perspective ( looks like a little camera )
Under this, the main uses are ;
Pan & Zoom tool ( Pan moves the scene by left click and hold and drag, or right click to zoom out )
Zoom tool ( left click, hold and move left to zoom in, right to zoom out )
Orbit tool ( only useful in the camera view , lets you rotate your object )
Frame Selected ( centers screen on current object )
Frame all ( centers screen on all objects )
Now we come to an important part, under the explorer view, left click and drag all three objects to the MS3DSceneRoot. Open MS3DSceneRoot to verify that all three objects are under it.
Now using the select tool located in the upper right hand corner ( click the arrow icon ) and then drag a rectangle around all your items. When they are highlighted, you can select Render from the top toolbar, then click Render – Preview , and then select All Layers.
A new window will open with a 3D rendered version of your object.
You can use the save as button to save a .jpg version for your friends, but don’t do it yet, because you haven’t skinned it yet. Before we go into skinning it, we need to verify that there are no flaws. With the Render view open, use the orbit tool on the Camera view window. As you orbit in the camera view, the render view will change. Orbit all around your object looking for flaws.
Be warned, the default creation process only has one light source. If you want to illuminate all sides of your object you can select Light from the top toolbar, then select infinite. Then move the object z-axis -5, and rotate the object y-axis 180. This moves the new light source behind and facing your object. Now you have the front and back illuminated, you can do the same for the sides as well, but should not bee needed. I recommend deleting all non needed things before saving. Needed objects – camera – light – MS3DSceneRoot.
If you are working on a large scale item you can merge related polygons to save on the poly count.
With the three objects selected ( leftside, rightside, and top ) from the left tool panel locate the Create section, then select Poly.Mesh then select merge. It will create a polymesh and open it’s properties box. Press the hide/unhide inputs button. Now you can rename your one object to doorwall , or whatever. You will need to move this new polymesh under the MS3DSceneRoot.
This will save on poly count as you now have 1 object instead of 3.
General Guidelines from the "Art Design Guide"
Props 0-500 polys
Buildings 200-3000 polys
Vehicles 1500-2000 polys
Characters 1500-2000 polys
Now is a good time to save your scene.
Save early, save often. Make different version so you don’t overwrite. This can be useful if you make a mistake and have to go back.
Now, select your three objects and merge them if you haven’t already. If you have then highlight the polymesh from the explorer view right click and select duplicate. This creates an identical object. Rename this new object collision and move it under MS3DSceneRoot.
Note – Some people will tell you to make your collision slightly smaller than your normal object. You can do this by using the transform tool on the right pane, select S and then change the x,y,z axis to .9999.
Another method, and the one I use, is to right click on the collision mesh, select properties, viewing. And then un-check the Render view. Basically this allows you to see you mesh in the editor, but when rendered it will be invisible.
Now right click on the collision, and select duplicate. Rename the new object x_lowrez where x = whatever your object is. You will also want to right click – select properties – viewing – and then uncheck the Render Visibility box.
What this does is create a low resolution version of your object. Why do that when it’s such a simple object? Answer, so it’s viewable from a distance. The Battlefront game engine has a near / far range ( which can be altered when making maps ) that controls what you see and when. If you don’t have a _lowrez version of your item, then it just disappears at a medium / long distance.
Skinning a simple object
A simple object can be skinned extremely easily. For this example I will use a pre-existing texture. I rather like
C:\LucasArts\BFBuilder\Assets\Shipped Worlds\Bespin\MSH\bes2_bldg_set05.tga
So I copy it to my desktop and rename it ( here’s where it gets tricky as we the modders need to come up with a naming convention ) bldg_lego_double_door_wall.tga
Bldg = building
Lego = generic
Double door wall = descriptor
Suggested naming convention
Bldg lego yada-whatever
Prop courscant
Weap
You get the point.
Now, inside of XSI Foundation, we should still have our object(s) selected. Make sure that the collision object is not part of the selection. From the left tool pane under the Get section is material, select it then select Phong. A properties box will now show up. Under the diffuse section you will see a little plug icon to the right of color. Click it, then image. The properties window will change. Under the image section click the new button, then from file. Browse to your selected file, remember mine is on the desktop.
When selected, the color number grid will be replaced by your choice. Like so ;
Now, under the Texture Projection section click the new button, and then click cubic. ( for this demonstration cubic should work best, planarxy would also work. Some choices are self explanatory. Others are not. If you have a very complex item then you would select UniqueUV’s ( polymesh ).
Now if you didn’t merge the objects then the texture would be applied to each box independently. Meaning you would get the two tone on the top box also.
Now you can close the properties box.
And now you can select Render then Render – Preview then All Layers.
Examine your object closely.
If all is well, SAVE then scene.
Now you have you object(s), a collision mesh, and it’s skinned. If you are using XSI Foundation and have the updated exporter, the click on file then pandemic tools [u] and then export mesh [u].
Adjust the path by clicking the browse button or simply typing in the box.
I will save this to my desktop as bldg_lego_double_door_wall.msh
Then click the export selected models button.
Creating / Editing an .odf
Now you have you .msh and .tga file. Time for the .odf file.
Copy any exiting Prop .odf or use the text below to create a new one.
[GameObjectClass]
ClassLabel = "prop"
GeometryName = "bldg_lego_double_door_wall.msh"
[Properties]
GeometryName = "bldg_lego_double_door_wall"
FoleyFXGroup = "stone_foley"
Notice that the Properties – Geometry doesn’t end in .msh
Now you have your .odf file. Place the .odf file in the ODF directory and the .msh and .tga files in the MSH directory. Load the editor and put them on a test map. Save and munge. Test your test map.
Notice that the ordinance is in fact impacting on the wall. Also not that modeling to live scale isn’t user friendly. Online players will feel that this is too small. Especially if there were a roof at that height. Talk about claustrophobia!
Modeling a complex object
Let’s make a flyable rocket. Not too terribly complex, but more involved than a simple wall, door or not.
Start a new scene. First thing we do with a new scene, that’s right make a null, and then rename it to MS3DSceneRoot. Next we right click on it, select properties – viewing and uncheck the Render visibility box.
Now when we create the rocket, we will want to create it laying on it’s side, but when we place it on our map we will rotate it ninety degrees. This is because rockets "lift off" but if we make it that way in the XSI Modeler, then it won’t fly correctly.
So we start, the biggest part of a rocket is the body. So we create a new primitive cylinder.
We want it round so change the Geometry U divisions to at least 32.
We don’t need it sub-divided so change the v divisions and base to 1.
Now at 1 radius, are rocket will only be 4-6 feet in diameter, so we change radius to 3.
At 4 height, our rocket would look meager indeed, so we change that to 15.
Now we rotate the object on it’s x-axis by 90 degrees.
At this point, we won’t care about moving the object up out of the dirt, because when we place it on the map we need to rotate it anyway, so might as well move it then.
You may at this point have to use the zoom tool to shrink the object some.
Now create a new primitive – polymesh – cone with the following settings.
Base radius 3, height 4, u subdivisions 32, v subdivision 1, base subdivisions 1.
Now rotate the cone 90 degrees on the x-axis
Now move the cone 8.8325 on the z-axis
In explorer you can rename the cylinder to body and the cone to nose_cone.
So it should look like this ;
Now for the Flash Gordon esque look, we will make the stabilizers / foils.
Create a new primitive – poly mesh – cube with the following ;
Length .5 , u subs 1, v subs 1, base subs 1.
Then resize the cube on the y-axis by 6, and on the z-axis by 6.
Now move it on the z-axis by minus -6, and the y-axis by 4.45.
Now to shape it. Make sure this new cube is the only object highlighted.
Now from the left tools menu under the Modify pane, click component and then select Move Point Tool. Go to the right hand pane and hover over the upper right most point.
Right click on the upper right most point and move it three grid squares to the right. ( left click is free hand move, right click is move left or right ). It should look like this ;
You will still see a point in the upper right corner of the square because it is a cube and only the surface point was moved. Now select the second point and if you hold down the left control key it will temporarily ( as long as held ) activate snapping. So while holding the left control key down, right click and drag the point to the right and drop it on the point you moved first.
And it should look like this;
Now right click and move the upper left point 3 grid squares to the right.
There will still be a point in the upper left, so hold the left control key down, right click on that point and move it to the right three grid squares. Make it look like this;
It’s ok, but doesn’t quite look pleasing to me, So we are going to move both the lower left points, let’s say three grid squares to the left and make it look so;
Ah, much better.
Now under the explorer view, rename this item stabilizer. Then right click on it and select duplicate. Make a second duplicate. Highlight stabilizer1, and then rotate on the z-axis 120 degrees. Highlight stabilizer2 and rotate on the z-axis 240 degrees. Move both stabilizer1 and stabilizer2 on the y-axis to -2.25. Move stabilizer1 on the x-axis to -3.75 and move stabilizer2 on the x-axis 3.75.
It should look like this from the front;
Now we can make the engine exhaust.
Create a new primitive – poly mesh – cone with the following properties;
Base Radius 3, Height 2, u sub divisions 32, v subdivisions 2, base subdivisions 1. Then close the properties box. Now rotate the new object on the x-axis by -90 degrees. Now move it on the z axis by -8.166.
Now in the left tool bar, in the modify pane, click on modify component, then select move point tool.
Hold the left control key and right click on the point of the cone and move if left to the bottom of the rocket so it looks like this;
You can rename this object to engine_exhaust and then move it under the MS3DSceneRoot.
Remember, all objects have to be under the root.
Make a note here, the co-ordinates of our engine exhaust are x = 0, y = 0, z = -8.15
( but for our purposes -8 will work better, more described later )
Now lets continue with our Flash Gordon rocket, lets make the laser mounts.
Create a new primitive – poly mesh – cube with the following properties;
Length .5 , leave all subdivisions at 1.
Close the properties box.
Resize the new cube on its z-axis by 3, and it’s x-axis by 2.
Move the new cube on its x-axis by 3.4 and it’s z-axis by 4.
Rename this left_strut and move under the MS3DSceneRoot
Highlight the left_strut and right click, select duplicate.
Rename the left_strut1 to right_strut. Now move the right_strut on it’s x-axis to -3.4.
It should look so;
Now for the lasers.
Create a new primitive – polymesh – cylinder with the following properties;
Radius .5, height 2, u subdivisions 32, v and base subs 1.
Rotate on it’s x axis by 90 degrees.
Move it on it’s z-axis by 4, and it’s x-axis 4.25
Rename this object to left_laser_housing and move under the root.
Duplicate this object and rename it right_laser_housing. Move it on it’s x-axis to -4.25.
Now for the barrels.
Create new primitive – polymesh – cylinder with the following properties;
Radius .125, height 1, u subs 32, v and base 1.
Rotate on x-axis 90 degrees.
Move on x-axis 4.25, on z-axis 6.
Rename this to left_laser and move under the root.
Duplicate the object, rename to right_laser and move it’s x-axis to -4.25.
The front and side should look like this;
Now for the cockpit.
I like to do things a wee bit different, so here’s one way of doing it.
Create a new primitive – polymesh – sphere with the following properties;
Radius 2, u and v sub divisions 32.
Now move it’s z-axis 5.5, and y-axis 2.
Now change the size on it’s x-axis to .5 and it should look like this;
Rename the object to windowglass and move it under the root. It isn’t that big of a deal when objects intersect each other.
Go ahead and render it and you’ll see what I mean. . . .
Pretty neat huh? Not done yet. Close the render view.
Ok now since this is a pilot-able vehicle, we need to add some labels to parts.
Create a new primitive – poly mesh – cone , with the following properties;
Base radius .25, height .25, u subs 4, v and base subs 1.
Close properties box.
Move the object on it’s z-axis to 5.5 and it’s y-axis to 2.75.
Rename this object hp_active and move it under the root ( this will be used later )
Duplicate this object 6 times.
Rename the duplicates as follows; hp_damage_1, hp_damage_2, hp_damage_3, hp_smoke_1, hp_laser_01, and hp_laser_02.
(these are used by the .odf much the same as hp_active )
Highlight the hp_laser_01 and rotate it on it’s x-axis 90 degrees.
Now move it on it’s y-axis to 0, x-axis to 4.25 and it’s z-axis to 6
Highlight the hp_laser_02 and rotate it on it’s x-axis 90 degrees.
Now move it on it’s y-axis to 0, x-axis to -4.25 and it’s z-axis to 6
So our laser point s are at x= +/- 4.25, y=0 and z= 6. Remember that for later.
Highlight the hp_damage_1 and move it’s x-axis to -2.2, y-axis to 2.2 and z-axis to 0.
Now rotate it on it’s z-axis by 45 degrees.
Highlight the hp_damage_2 and move it’s x-axis to 2.2, y-axis to 2.2 and z-axis to -3.
Now rotate it on it’s z-axis by -45 degrees.
Highlight the hp_damage_3 and move it’s x-axis to -1, y-axis to 2.9 and z-axis to -6.
Now rotate it on it’s z-axis by 22.5 degrees.
Highlight the hp_smoke_1 and move it’s x-axis to 1.7, y-axis to 1.7, and z-axis to -8.
Now rotate it on it’s x-axis by -55 degrees, it’s y-axis -20 degrees.
Now under the explorer view, click once on the hp_active, then hold down the left control key and slowly click on all the other hp_ objects ( 7 total ) when all 7 are highlighted, you can right click on any of them, select properties, then click on viewing. In the properties box, uncheck the Render Visibility box , and then close the properties box. All 7 of these should now have a gray h on them in the explorer view.
Do a test render and verify that none of these hp_ points show.
Now from the explorer view, select body , and while holding down the left control key also select cockpit_glass, engine_exhaust, left_barrel, left_laser_housing, left_strut, nose_cone, right_barrel, right_laser_housing, right_strut, stabilizer, stabilizer1, and stabilizer2.
When these 13 objects are highlight, the under the create pane on the left tool panel select poly.mesh and then click on merge.
Close the properties box. Rename the polymesh to collision and move it under the root.
Right click on collision, select properties, viewing and uncheck Render Visibility.
Right click on collision and select duplicate. Rename collision1 to rocket_lowrez. Right click on rocket_lowrez, select properties – viewing – uncheck the Render Visibility box.
Here is a good time to save your scene file, as well as export it and test it as a prop.
I exported this as any_fly_rocket.msh
Any = usable by any of the sides
Fly = it isn’t hover or walker you know ;-)
Rocket = well duh :-P
Then just whip a quick prop .odf.
One thing, if you are using a different .odf make sure you have metal_foley and not stone_foley.
Here’s how it looks in-game so far.
Coming along nicely.
Now it’s time to skin it so let’s first start with a blank 512x512 tga file.
You can then you use any graphics program you want to make the texture. For starters I just used paint, then ported it over to photoshop. I saved the file as any_fly_rocket.tga
Now that we have something to work with, we can apply it to our model.
Highlight all of the body parts.
Change the left tool panel from Model to Render.
Under the get section select texture then image. Browse to your file and select it. Then under the texture projection, press the new button and select Planar xy
This is not complicated, but I’m not going to take 6 plus pages to explain. So here’s the short story.
Now you open the explorer window in the lower right quadrant, and adjust the quadrants so that the bottom two are smaller. Highlight body and hit alt 7 , and this will open the texture editor.
In the upper left corner of the texture edit you will notice an icon like an arrow or pointer. This is the select tool. Click it, then draw a box around all points of the object. To the right of the texture editor tool bar you will see an s r and t. Yep you guessed it, size rotation and location. Now that the points are selected you can hit the s button and shrink it, then hit t and move it to fit the area of the color map you want.
Here are the locations of the other items.
All Three Stabilizers Engine Exhaust Left and Right Laser
Left and Right Laser Housing Left and Right Strut Nose Cone
Since we have weapons involved, we have to freeze all transforms. I don’t know why but weapons don’t work unless the transforms are frozen. Freezing the transforms, however, has the undeseried effect of making each object think that it’s own location is 0,0,0. ( which is why I notes previously that you should write down all of the co-ordinates of each hp_object.
Now you can use the Pandemic exporter to export the .msh file.
Now you load the .msh into Nimlot’s Bconstructor, like so;
You now need all the hp_object co-ordinates. Open the Models hive ( the little + symbol ) then open the Static hive. Find each hp_object and double click it. Under the Tran section enter the correct x,y,z co-ordinates. Then save the .msh.
Now of course if you put more time in and had a hole in the cylinder you could put a cockpit interior and controls. But that’s a lesson for the Advanced Modeling Techniques
Since this only has two lasers and one engine, it most closely resembles a TIE Fighter.
So now that things are getting along, we need to fetch all the .odf ‘s regarding the TIE fighter from the assets\sides\IMP\ODFs folder
So we copy the imp_fly_tiefighter.odf to any_fly_rocket.odf
First we have to change the mesh call out, so replace imp_fly_tiefighter in both Geometry locations.
Next we put a // in front of the 1st person view. ( Later on, when we make our own 1st person view, we can call it out )
Scrolling down to the weapons section, we have to change the hp_fire_1 to hp_laser_01 and the same goes for 2.
For the collisions, have one line state that the collision = "collision" , and rem out duplicate call-outs by placing a // at the line beginning.
NOTE * you can make your own chunks and call them out instead of using the tie chunks. That will be discussed in Advanced Modeling.
Save the .odf file
Here are the files that go into your test\MSH directory
Any_fly_rocket.tga
Any_fly_rocket.msh
Imp_fly_tiefighter_chunk1.msh
Imp_fly_tiefighter_chunk2.msh
Here are the files that go into your test\ODf directory
Any_fly_rocket.odf
Imp_weap_fly_tiefighter_cannon.odf
Imp_weap_fly_tiefighter_cannon_ord.odf
Imp_weap_fly_tiefighter_cannon_exp.odf
So move them there, load the editor and test, test, test !
Here is what she looks like at the start of the game.
And here she is in flight with weapons working;
And yes, on the ground you can see the quick and dirty snub fighter and the A-Wing I designed for the game.
Links and Citations
LucasArts Forum regarding modding for SWBF
LucasArts Forum regarding modding for SWBF2
GameToast Forum regarding SWBF1 and 2 Modding
psych0fred's SWBF modding site
Google search of ( 3d modeling "box method" )
Saturn's website, simply click on the Lab to see what he and his crew have done
Definitions
.odf Object Definition File
.msh Mesh file
.tga Targa Graphic image
Hp_ Hard point ( also known as hidden point )
Document Version Control