Making IMVU rooms using Blender - Part II Armatures and Bones
Previously in "Making IMVU furniture rooms in Blender" the contents of the template file used to make furniture room for IMVU was discussed in detail, the rooms in Blender tend to be made from a number of different elements each of which will eventually perform a specific function in IMVU based on their name and position in the overall Armatures structure.
In part two, this structure will be explored further as that relates to making sure rooms are properly set-up to export to Cal3D without too many issues or requiring much additional work after-the-fact.
Structure of an Armature ^
As discussed above room Armatures typically contain a number of separate bone elements that perform different functions depending on their name ("Bone ID"), and more importantly, their position in an overall hierarchical "Parent » Child" structure. This structure is important because it determines the loading order in which bones are pulled into IMVU, if this is wrong and "furniture.Floor.01" loads before "skeleton.Room" for example, the room will break resulting in a partially or incorrectly loading room - this happens because the hierarchy is determined by the first bone that loads, IMVU treats this as the 'master' or 'root' bone to which everything else is subsequently linked. A default hierarchy, assuming a standard no-frills room, looks similar to the following once all the other Armature elements are joined to it (colour-coded for clarity);
- ... +floor
- ... +wall
- ... +ceiling
Design note: The bare minimum requirement for a working room is "skeleton.Room" (previously called "skeleton.Scene") and "node.Room" (previously called "node.Scene"). For a furniture room at least one furniture node is required as their presence is largely what IMVU uses to distinguish Locked from Furniture rooms. If no seat or camera nodes are present IMVU defaults to adding them to the room located approximately at the location of skeleton.Room (which is usually positioned as the 'origin point' for the room). Bones marked "[*]" in the above are the necessary replacements for Blenders Lamp and Camera objects (as discussed above) - Lamp objects are called "Omni" and Camera Entities "camera";
Depending on the rooms set-up, if separate Armature objects are used for the above, they will need to be joined to the main Armature object (Ctrl+J") with their names and parent relationships double-checked.
IMPORTANT: bone names are cSse seNsItiVE; "Seat01.sitting" is not the same a "seat01.Sitting" (the latter is correct, the former, or derivative of it, is not)
A typical room Armature shown in Blender (latest - top, 2.49 - bottom) using the "Outliner" view to check parenting relationships; depending on the bone selected it should generally be parented (shown in the hierarchy indented to the bone above it) to "skeleton.Room" or "node.Room"
Room Armature location ^
When looking at the template file it can be seen that each of the 'room', 'furniture' and 'seating' Armatures originate from the same location. i.e. they all have the same "Origin" point, Blenders grid centre - "0,0,0". Although this is done mostly for convenience it's important the final room Armature remain or be positioned such that both its origin and the "Head" of "skeleton.Room" (bone) are located there to ensure rooms behave properly in IMVU.
Design note: the "Origin" point is the small sphere visible when an object is selected. The 'camera' Armature is excepted from the above because it's expected that that is positioned to make sense to the room and the initial view the user is presented when loading for the first time. Bones are comprised of three sections, the 'fat' end is called the "Head", the 'thin' end is the "Tail" and the bit in the middle, the "Body". The "Head" of each bone acts as an individualised 'virtual origin', this is the point around which rotation and general manipulation occurs. The "Tail" end is the point from which general extrusion of additional bones occurs. Each element can be selected and manipulated; both Head and Tail can be moved (grabbed), but not rotated or scaled, to change the orientation of a bone; Body selects the entire bone and can be moved, rotated or scaled as normal.
It's important for objects to be properly aligned in Blender; "Origin" points should sit over the "0,0,0" XYZ axis to ensure proper room behaviour in IMVU - an objects Origin can be seen when its selected as the small orange (top), for newer versions of Blender, or pink (bottom), in Blender 2.49, sphere
To check the Armature is correctly positioned in Blender the cursor first needs to be snapped to grid centre.
In newer versions of Blender, press "N" to access "Transform" properties and scroll down to the "3D Cursor" sub-section. Here, if the "X:", "Y:" and "Z:" values are not "0.0000", click and then type "0" in each input box respectively. This centres the cursor. Next, select the room Armature ("ROOM.RIG" in this instance) and then press "Shift+S" selecting "Selection to Cursor" from the list that appears. Depending upon the Armature location it will immediately snap to the cursors location based on it's "Origin" point.
To do the same in Blender 2.49, open "View Properties" by clicking the "View" menu option in the 3DView Header, then select "View Properties" from the list of options available. A panel will appear in the 3DView. Check the "3D Cursor" subsection and similarly change the "X:", "Y:" and "Z:" values if they are not "0.00". This sets the cursors location to grid centre With the Armature selected use "Shift+S" to snap "Select - > Cursor".
It's important to ensure and Armatures "Origin" point is properly centred on the grid. This might first mean centring the cursor before snapping objects to it, or adjusting that point to snap to the cursor - the latter is preferable depending on the location of objects in a scene
In doing the above to the template Armatures the change will be focused on what appears to be the 'fat' end of "skeleton.Room". This is because in the Armatures initial state, the bone visible is both what will become skeleton.Room and the Armature itself - the former being called "Bone", the latter "Armature". What this means is that absent any editing, the origin point of the Armature object is the same for both the Armature itself and that first Bone. It's important this always be the case to ensure proper functioning of a room inside IMVU. In instances where this is not the case, the root bone having been moved away from its original location, the Origin point will need to be reset. This is done using the "Origin" tool in conjunction with the cursor.
Design note: if the root bone has been moved it's usually for a reason, meaning, moving it back after-the-fact might not be possible or problematic. Using the "Origin" tools alleviates this.
The centre of a room should ideally align with the Armatures "Origin" point and the "Head" of initial bone that's composed of (eventually to become "skeleton.Room"). Check this in "Transform" Properties, "N", if there is an off-set value, the Origin will need to be reset correctly relative to the root bone
First the Armatures Origin needs to be snapped to the "Head" of "skeleton.Room". To do this "RMB" select the Armature and "Tab" in to Edit mode. Once there "RMB" select the "Head" sphere (the larger of the two) and using "Shift+S" to access the "Snap" menu. Click "Cursor to Selected". The 3D Cursor will snap to the sphere. Press "Tab" to exit Edit mode then in the ToolShelf (press "T" if not visible) to the right, click the "Origin" button and from the list that appears select "Origin to 3D Cursor". In the 3DView the Origin point will snap to the cursor. Once that's done, in "Transform" properties ("N"), from the "3D Cursor" sub-section check and/or change the "Location" data so each "X:", "Y:" and "Z:" axis is "0.000". This resets and re-centres the cursor. With that done, re-select the room Armature ("RMB") and using "Shift+S" again, click "Selection to Cursor". This re-centres the Armature around the recently reset origin point so both the root of the room and the Armatures origin are in the same place.
Editing the rooms Armature often means the "Origin" point needs to be readjusted by first snapping the Cursor to skeleton.Room, "Shift+S", and then snapping the Origin to the Cursor. Once done the entire rig can be re-centred on Blender grid to ensure proper export and functioning in IMVU
In Blender 2.49 "RMB" select the Armature and "Tab" in Edit mode. Select the "Head" of "skeleton.Room" ("RMB") and then using "Shift+S" select "Cursor - > Selection" from the "Snap" menu. The 3D Cursor will snap to the centre of the selected sphere. Press "Tab" to exit Edit mode and from the "Object" menu in the 3DView Header, select "Transform » Center Cursor". The Armatures Origin point will immediately snap to the cursors location. This resets the origin. Next in "View Properties", "View » View Properties", check the "3D Cursor" sub-section properties, if "X:", "Y:" and "Z:" are not "0.00" click the input fields and type "0" (zero). Once done (re)select the Armature, "RMB", and using "Shift+S" again, click "Selection - > Cursor" from the list. The Armature will immediately reposition itself at the cursor based on the now relocated Origin point.
skeleton.Room root bone ^
For rooms, the 'master' or 'root' bone of an Armatures hierarchy is "skeleton.Room" (previously "skeleton.Scene"), everything in one way or another needs to connect to this single bone. As the root bone its location is important so when placing the initial Armature object into the Scene ("Shift+A", select "Armature" in Blender, or "Shift+A » Add » Armature" in Blender 2.49) it's best done from the "Top" view ("NumPad7"), or when in any other view use the "Tail" sphere in Edit mode to lie the bone flat so it's "Z" axis points up into the room. This ensures the Armature is zeroed on the grid (the "X:", "Y:" and "Z:" coordinate data in "Location" properties, "N", should be "0.000"), along with the bones "Head" (see above if this is not the case).
Design note: due to the Scene-scale used to make content for IMVU, the Armature will initially be extremely small. It's size can be changed by being scaled directly, "S", or by tabbing into Edit mode and using "Grab", "G", to drag the "Tail" end of the bone upwards. The latter option is preferable.
Once the initial Armature it placed and the bone correctly size, adding other bones is then simple a question of; RMB selecting the original and using "Shift+D" to "Duplicate" it; RMB selecting the 'Tail' node (smaller of the two spheres) and using "E" to "Extrude" a new bone. Alternatively, another Armature can used and positioned independently of the original Armature but the will eventually need to be joined to the original.
Design note: unlike extruding, duplication does not create an automatic 'link' between parent (original) and child (duplicate) bones. This will have to be done manually in the latter's case. Note also that bone names are appended with an incremental numerical value "*.001", "*.002", "*.003" and so on. These will need to be edited and changed manually (see below).
Room Seating ^
The position avatars stand, sit or otherwise interact with the room is done via a series of named bones parented to the main 'root' bone of the room. Each bone in the set performs a particular function; "Catcher" and "Pitcher" for instance are placement points for avatars when interacting - you on the "Catcher", them on the "Pitcher"; "*.Sitting" and "*.Standing" indicate the 'type' of position the avatar uses, the defaults being 'standing' and 'sitting'; "Handle" acts as the on-screen prompt indicating where the seat node is on screen, when click the avatar will jump to that location.
Important: the distance between the "Catcher" and "Pitcher" bones MUST NOT be altered.
Individual bones that comprise the two main types of seating for IMVU shown in Blender (top) and 2.49 (bottom). Default positions are "*.Sitting" and "*.Standing" - seated and standing, although custom 'seats' can be added. Each Armature is separate unit to allow easy positioning before then needing to be joined to the main room Armature
Seat Numbering ^
IMVU rooms can hold any number of concurrent users, currently ten, after which users have to be invited. To facilitate this a corresponding number of seat nodes need to built into the room. The minimum number of seats is six. For IMVU to work out how many seats there are the associated bones are number sequentially irrespective as to the type of seat being used; having two standing and one sitting seat would be numbered similar to the following;
Design note: there is no "00" seat, number starts at "01" not "00". So "01" to "09, "10" to "999". For example, the tenth seat would be "seat10.[Seat-type]", the one hundredth would be "seat100.[Seat-type]" - note that it's not necessary to have more than a dozen or so seats in a room by default as they are often included with furniture users add to rooms, however, if there are fewer than six IMVU will automatically generate and add seats, often in odd places relative to the room, to meet the minimum requirement. Note also that names are CaSe.sEnstIVe, "Seat01.SITTING" is not the same as "seat01.Sitting" (the latter is correct, for former, not).
Seat Parenting ^
As mentioned briefly above, seat 'nodes' comprise four bones - "Catcher.[n]", "Pitcher.[n]", "seat.[n]" and "Handle.[n]" - each of which performs a particular function based on its position in the room Armatures overall hierarchy In order to facilitate this the bones all need to be correctly parented to the master bone "skeleton.Room" after the respective armatures are joined together ("RMB" select the seat node, then "Shift+RMB" the room node. "Ctrl+J" to join them in the correct order, last being the item everything is joined to).
In Blender (top image below), changing or editing the 'Parent' of a bone is done in "Bone" Properties (the 'Bone' icon); with a bone selected both it's current name and any current parent relationships are shown. To change the relationship simply select a bone ("LMB") from the "Parent:" drop-down list that appears when clicking the input field - depending on the bone this would typically be "skeleton.Room" (note obviously that there needs to be at least two bones in the Armature for there to be anything to select).
In Blender 2.49 (image two below) changing a bones parenting is done in "Editing" mode ("F9"). With a bone selected, in the "Armature Bones" properties panel it will appear under "Selected Bones" sub-section as "BO:[bone name]". To the right of this is the "Parent" property drop-down, clicking this reveals a list of bones available for parenting - "BO:seat01.Sitting" is the "child of" the "skeleton.Room" bone for example (again there needs to be at least two bone in an Armature for there to be anything available for selection).
- seat01.Sitting (+ Catcher etc...)
- seat02.Standing (+ Catcher etc...)
- seat03.Sitting (+ Catcher etc...)
Design note: again pay attention to bone names as they are CaSe-sEnitIVe. In addition note the order bones are parenting to avoid load-order issues in IMVU - "skeleton.Room" must always be the 'root' or 'master' bone to which everything parents else IMVU will consider the first bone it finds the root and break the room when everything else subsequently loads in.
In Blender (top) "Bone" Properties are used to parent bones together by selecting the bone to be edited and changing its "Parent:" property from the bone list ("Handle06" is shown parented to "skeleton.Room"). In Blender 2.49 (bottom) the same operation is done in "Editing" properties (F9); select the bone to be edited then in "Armature Bones" click the "child of" drop-down menu to select the parent, in this instance "skeleton.Room"
Seat Orientation ^
To make rooms and general interaction more interesting seat nodes can be rotated in any direction and positioned in any location where the avatar is expected to appear - turned around a particular axis, upside-down, pitched, rolled, etc.. To avoid problems doing this, manipulation should be done in Object mode and to the seat Armature object, and NOT individual bones in Edit mode.
WARNING : when using the room template DO NOT TAMPER with seat nodes other than to position, rotate and join them to the main room Armature. Once joined, only edit individual bone names and/or change their respective 'parent » child' relationship as required. It's important to avoid tampering with seat nodes as the distances used are not arbitrary, they serve a very specific purpose which tend to break certain aspects of avatar/room interaction when changed, more so when done in Blender 2.45 or 2.49.
Seat nodes can be placed anywhere the avatar is to appear. When manipulating the nodes be mindful to select the node as a unit and not the individual components - shown above in both current Blender and 2.49 the helper avatar mesh can be used as a visual cue to aid in proper placement of nodes - no further editing is necessary
Furniture nodes make a room a 'furniture room'. When placed into a room they will typically form a grid, each being a point upon which a furniture item can be placed (single or multiple items per node). Although there are three types - 'wall' ("furniture.Wall.[n]"), 'floor' ("furniture.Floor.[n]") and 'ceiling' ("furniture.Ceiling.[n]") - they are agnostic in that a given furniture item can be placed on any node, the only difference being their orientation with respect to the room; floor nodes point 'up', ceiling nodes point 'down' and wall node point 'inwards' (from the walls). For all intents and purposes the number of bones used for furniture nodes should be limited to 650 or less in total. Furniture nodes are number sequentially per node type, for example having 200 floor, 20 wall and 10 ceiling nodes would be numbered and named;
Design note: as with seating, numbering for all types of furniture node starts at "01", there is no "00". And again, bone names are cASe SenSitIVE. The grid formed from node placement in this context does not necessarily need to be formal in nature, i.e. each bone needing to be '[n]' units form its neighbours, the general idea is to place nodes such that they facilitate the user being able to get from one side of a room to the other via furniture placed into it. That the number of nodes in a Scene overall does carry with it a certain degree of performance degradation, limiting the number to 650 or below provide ample opportunity to have a good few nodes present whilst at the same time not overloading and unduly taxing the system.
Rooms can contain three different types of furniture nodes, 'wall', 'floor' and 'ceiling', each type allows a user to place furniture items into a room based on the nodes location - a picture can be hung on a wall using a 'wall' node and so on (nodes are shown as separate Armatures before being joined to the main room Armature)
Furniture Parenting ^
To ensure proper functionality of a room and furniture placed into it, all furniture nodes, wall, floor and ceiling, should be parented to the 'root' or 'master' bone of the room, "skeleton.Room". The only general exception to this requirement relates to animated furniture nodes; in this particular instance bones otherwise attached to "skeleton.Room" are instead parented to an animated control bone which will itself then be parented to the rooms root. This facilitates a room animation - a racing track around a room for example - without affecting the entire room. Bones used for furniture should be parented as follows for a typical room;
And as follows for rooms containing animated furniture;
- Animation Control
- ... wall...
- ... ceiling...
Design note: the 'order' in which bones are joined to the root bone and/or listed in the OOPS editor is as important as ensuring a proper hierarchical relationship - a room will break if a furniture nodes loads into IMVU first instead of the root bone.As with all aspect of room creation, if this is not done it can lead to errors upon load in IMVU
Parenting furniture nodes within the overall room Armature. Select a bone and via its properties select "skeleton.Room" from the available list
Furniture Orientation ^
Unless a room needs to be topsy-turvy, the orientation of furniture nodes are important if the room is to make sense to the user in relation to its theme or function. As briefly mentioned above, this is done through each node type pointing of a particular direction relative to it's function. Technically means the "Z" axis for each individual bones should point 'inwards' relative to the room.
The most straightforward way to do this is to activate the "Axes" markers. To do this in Blender select the Armature and click the "Object Data" Properties button. Scroll down to the "Display" sub-section and click-to-activate "Axes" - next time the Armature is put into Edit mode each bone will display an "X/Y/Z" axis widget at the "Tail" (thin) end. In Blender 2.49 the same can be done in "Editing" Properties ("F9") by selecting the Armature and clicking the "Axes" button in the "Armature" panel - which again displays the axes markers when the Armature is in Edit mode. With this enabled it means any additional bones placed into the Scene, either as Duplications (select a bone and press "Shift+D") or as separate Armatures or individual bones from the "Add" menu ("Shift+A"), can have their orientation checked and corrected relative to the requirement above; "Z" should point 'up' for floor nodes with the bone aligned along the floor, 'East/West/North/South' for walls nodes with bones aligned upright, and 'down' for ceiling nodes with bones similarly aligned along the floor with a "Roll:" value of "180°".
Turning on the display of bone axis markers ("Object Data" Properties in Blender and the "Armature" panel in "Editing" Properties for Blender 2.49) helps correctly orientate bones so their "Z" axis, which is a 'constant', always points inwards to a room, important for correctly positioned furniture items. When bones are incorrectly rotated, depending on which type they are, the "Roll" property can be used to reset them
Where custom nodes or additional Armatures are added ("Shift+A", select "Armature"), attention should be paid to the 3DView's current orientation because it effects the orientation of Armatures and Bones when placed; in "Top" view ("NumPad7") Armatures and Bones can be positioned 'front/back' or 'left/right' relative to the view, in "Right" view ("NumPad3") 'up/down' or 'front/back', whilst in "Front" view ("NumPad1") 'up/down' or 'left/right'. However this is done, Bones should conform to the "Z" axis requirement and Armatures need to have "0°" rotational values on the "X:", "Y:" and "Z:" axis. What this all means in practice is that bones used for both floor and ceiling nodes need to lie flat relative to the "Top" view ("NumPad7") with their Z-axis pointing up and down respectively into the room. And wall bones standing upright relative to either "Front" ("NumPad1") or "Right" ("NumPad3") view so their Z-axis points (sideways relative to the bone) into the room.
Design note: done whilst an Armature is in Edit mode, ceiling nodes point down by changing their "Roll" value to "180°". This can be done in the latest Blender via "Transform" ("N") or "Bone" Properties, typing an appropriate value into the "Roll:" input field. Or in Blender 2.49 by through the "Transform Properties" panel ("N"), again altering the "Roll:" value appropriately. Note however, in Blender 2.49 bones may subsequently display roll values as "-180°" - negative 180 - due to a limitation in that particular version of Blender. To fix or force Blender to use positive 180 value it's necessary to type "179.999" instead - the difference amounts to a rotation bias, negative values cause an anti-clockwise rotation, where-as positive values cause clock-wise. Important to know when producing animated rooms in older versions of Blender.
Finally furniture bone orientation should generally be consistent so furniture items added to a room by the user use the same visual metaphors per node type - keep floor and ceiling nodes point in the same direction; wall nodes points relative to their general cardinal (if a bone looks to be pointing 'West', any other bone that might otherwise be slightly off-kilter can also point West rather than necessarily being adjusted to match any off-kilter angles.
Design note: rotation of a Armature can be done in "Object" mode independently of individual bone manipulation in "Edit" mode. To ensure the Armature is 'zeroed', with it selected simply use "Ctrl+A" to set it's "Rotation & Scale" in Blender or its "Scale and Rotation to ObData" in Blender 2.49, this prevents the Mesh and Armature being 'reset' to whatever angle is read in the file on export, which can often mean a room being flipped on it's side or at some other angle in IMVU.