This tutorial has been somewhat superseded by the more recently written:
Making an Avatar from Immediate Spheres and Cylinders 
tutorial.

 

Making high quality skin animated creations using a

Minimalist Approach


The picture of the face above shows what I have made starting with a single triangle as a demonstration of what can be done when only simple hand editing methods are used and when you don't have good drawing skills. If you are an artists who is good at getting proportions right you could do a lot better i am sure.

By using low-level ways like hand editing triangles as opposed to using advanced shape generating techniques and only using color per vertex we can have great versatility with a minimum amount of functions and concepts. I want to write a tutorial that demonstrates that you don't need to learn and use lots of advanced concepts before you can start developing original worth while quality creations without loosing a sense of being fully in control of the position of each vertex the color of it and how it animates. Something I have learned over the years in building computers from chips and years of low-level programming is that you can take many short cuts and do what many would otherwise think could only be achieved by those who have been in the business for years and read many books on the subject. Although this tutorial will revolve around a low-level approach there will be no need to do any VRML hand coding in a text editor in order to edit a vertex since this can instead be done with ease using Seamless3D's graphics user interface. This tutorial is aimed to make it non intellectually taxing by keeping everything simple and using the more intuitively straight forward approach of hand editing triangles. Animation requires a little more intellectual effort but by only attempting the basics it should be pretty easy for anyone to quickly feel at home with all the essential concepts and skills to be able to feel no barrier to mastering sophisticated skin animated creations, all this using just a few functions from Seamless3d. I don't want to give the impression that I am against using the more advanced features in Seamless3d they can save a lot of time and give us the joy of experiencing enlightenment but I really want to stress the point in establishing the security of a rock solid foundation one can always depend on to be versatile enough for anyone to be able to do what they want even if it means they did not take the most efficient path to achieve it. With a stable platform the more advanced features can be learned with time at a pleasant pace without getting caught up in the stress of "must learn lots before any fun can be had". This is my goal in this tutorial!

Some tips when using Seamless3d
If seamless wont open anymore but use to, go to the folder where the Seamless3d.exe file is located and delete the seamless3dSetup.wrl file. If this fails try renaming or deleting the file named untitled.smls. This should force seamless to create a brand new smls file with an introductory sphere.
Scaling the whole seamless shape is best done using the scale field from the Seamless node. Try to avoid using the scale field to scale any of the part nodes because for some reason related to Direct X (that i have yet to fix) the parts color and shading will be displayed horribly wrong if this is done. Scaling a part can be done without leaving side effects if you compile the scale field. This is done by selecting the part and then selecting compileTransform/scale from the main menu. This function will restore scale field back to 1 1 1 (not-scaled) but the part's geometry and the geometry for any descendant parts will remain the same size when it was scaled.
Many of the commands in the cursor/view control sub menu show commands like zoomIn and zoomOut that only work if keys are used because such keys have to be held down or to little would be noticed to be worth making them menu commands as well. They are shown in the menu simply as guides to show the keys.

Crashes and Undo/Redo
There are so many combinations possible in seamless its hard to make it guard against all possible combinations the user may attempt without it crashing. Most functions should work but because you see a function in a menu or window it does not necessarily mean it works in the current version and may always cause a crash for that version. I like to think however that all the functions in this minimalist tutorial are pretty stable all of the time and is one reasons for writing a tutorial like this as it serves as a standard of what should work. If you find any function here unreliable please let me know.

You can Undo and Redo using the buttons from the tool bar but do not rely on this without backing up your work manually because nothing is 100% reliable especially in a cutting edge program like seamless3d. If Seamless crashes unexpectedly you can usually retrieve your work. Go to the folder where seamless3d.exe is located or the working folder and open the folder named undoCache. In here there will be all the smls files that get backed up after each command.

Making a new Seamless file that contains a Seamless node
Click on the new smls file button

save the new smls file as the name you desire.

To see the nodes our new file contains, open the scene tree window

Nodes are the building blocks of VRML
The nodes in the scene tree window are represented by icons

In this minimalist tutorial we will be using 6 nodes:

Scene
Seamless
ColorEffect
Part
TimeSensor
OrientationInterpolator

and a Proto (a blueprint for a node)

which always consists of the 3 components:

ProtoDeclare
ProtoInterface
ProtoBody

We will also need one more node, a:

ProtoInstance

so that we get an instance of the Proto ( a user defined node created to the form of the Proto)

To select a node or a Proto component in the scene tree window, click on the node's icon. This will also cause the control panel for the node to open.

The  Scene node always exists at the top of the scene tree window though it may be hidden from view if the window is scrolled. The Scene node is the base or root node in the scene tree. This means all nodes in the scene tree will be descendants of this node. When the Scene node is selected (by clicking on it in the scene tree window ) we will see the Scene node's control panel open.

 Scene
output

The Scene node's control panel has just one field called output. This button generates a VRML file that will have the same file name as the current .smls file that is open in seamless except it will have a .wrl, .x3d;.x3dz;.x3dv;.x3dvz extension instead of a .smls extension. The generated VRML/X3D file will have any nodes that are not standard VRML/X3D nodes converted to standard VRML/X3D nodes and or nodes specific to Bitmanagement/Blaxxun Contact if this is specified in the Settings window (genContactSBVT checked).

When we create a new smls file by default we have a Seamless  node already added with a  ColorEffect node added to the Seamless node.

The  ColorEffect node will make all the triangles use the color per vertex method, the only method of coloring vertices used in this minimalist tutorial.

Adding Part nodes in the scene tree to make a skeleton of parts
Until we get to animate anything the only node we really need to know much about is the Part node. Part nodes are the nodes that contain the actual triangles.

To add a node to a node as a child (meaning it branches out from it):

click on the node in the node bar

and drag it to the right of the node you want it to branch out from and then release the mouse button

To add a node as a sibling below so that it is directly below the node (meaning it shares the same parent node):

drag the mouse so that it is directly over and to the lower end of the node you want it to be below before releasing

To DEFine a node select it (if not already selected) then click it again to the right of the node's icon and then type in the name.
The following example shows the first Part node DEFined as torso and the second  DEFined as l_arm

To delete a node:
    right click on the node and select delete

 

Adding the first triangle to a Part
To add a triangle to a part first select the Part you want the triangle to belong to (which can be done by clicking on the Part in the scene tree window) then from the main menu select paste/new triangle

Wire frame mode (space bar)
When the 3d window is selected (when the 3d windows's title bar is blue) you can toggle between wire frame mode and solid mode by pressing the space bar.

Background color (ctrl+B)
Often it is hard to see dark triangles on a black background or vice versa. To toggle the background color between black and white press Ctrl+B

Dragging a vertex to change the shape
If we click on a vertex (a triangle corner) and drag it we can easily modify the shape of any triangle/s that use this vertex for a corner.


The little yellow sphere you see in wireframe mode shows the location of the selected part but we will get to that later.

Viewing triangles from a different Angle

If we right click and drag on the 3d scene we can view our work from any orientation. This allows us to be able to drag a vertex to any location in 3d space.

Viewing triangles from a different Position

Use the keys from the num pad

  • 4 moves the triangles left
  • 6 moves the triangles right
  • 2 moves the triangles down
  • 8 moves the triangles up
  • 9 moves the triangles closer to us
  • 3 moves the triangles away into the screen
Viewing triangles from a different orientation using keyboard
Pressing the key Esc is very useful for resetting the view orientation translation and zoom.
Pressing the key , (comma) is very useful for resetting only the orientation in the view

Pressing Esc or the , key and then using the number keys above the alpha keys is good for viewing work from clean precise angles (I do this a lot to see the sides and back of my work)

  • 1    rotates the view on the x axis -PI*.5 (-90 degrees)
  • 2    rotates the view on the x axis PI*.5 (90 degrees)
  • 3    rotates the view on the y axis -PI*.5 (-90 degrees)
  • 4    rotates the view on the y axis PI*.5 (90 degrees)
  • 5    rotates the view on the z axis -PI*.5 (-90 degrees)
  • 6    rotates the view on the z axis PI*.5 (90 degrees)


Zooming In and Zooming Out

press the key that has + sign on it (can be from the num pad) to zoom in
press the key that has - sign on it (can be from the num pad) to zoom out

Hiding Parts

Often triangles from other parts make it hard to edit the triangles in the part we want to work on. When this is the case parts can be hidden in the 3d window by left clicking on the Part node's icon in the scene tree window. The scene tree window shows a hidden part by showing the icon as a dash as shown in the following example for the part DEFined as torso.

 clicking on the dash will return the node back to it's visible status

Vertex and Triangle Selection using Mouse and W, E, F7 and F8 keys

When ever we click on a vertex successfully we will see the little red sphere or dot lock onto the vertex. This means its the "selected vertex". When ever a vertex is selected a triangle is selected as well. The red, green and blue dots show which triangle is selected.

We can usually select any vertex by clicking on it but often this is not so straightforward when a vertex is very close to another also we may need to select a different triangle to the one that gets selected. To get around these problems we can use the keys W, E, F7 and F8

  • W selects the previous triangle that shares the selected vertex
  • E selects the next triangle that shares the selected vertex
  • F7 selects the previous vertex in the selected triangle
  • F8 selects the next vertex in the selected triangle
Suppose we have the following triangle selected


If we press E this will cause the next triangle that shares the selected vertex to be selected.

and if we press E again this will cause the next triangle that shares the selected vertex to be selected.

If we press F8 we will select the next vertex in the selected triangle

and if we press F8 again we will select the next vertex in the selected triangle

Using the keyboard to move the selected vertex
I have found sometimes its easier to move a vertex using the keyboard instead of the mouse when doing detailed work on vertices that are close to each other and when you only want to move a vertex a precise small amount. Also when using the keyboard we have the possibility of being able to move a vertex in the z dimension when looking straight into the z dimension.

To move the selected vertex Press Ctrl and one of the following keys from the numb pad

  • 4 decrements in the x dimension
  • 6 increments in the x dimension
  • 2 decrements in the y dimension
  • 8 increments in the y dimension
  • 9 decrements in the z dimension
  • 3 increments in the z dimension

To change how much the keyboard moves a vertex at a time select settings from the main menu

and change the value to the amount you want in the incDecRes field


Using the mouse to select a vertex without changing the position of the vertex

Hold down the ctrl key before clicking on a vertex. While ctrl is down the mouse is unable to drag a vertex but ctrl does not prevent the vertex from being selected when it is clicked on.

Adding more Triangles

We can split any triangle selected by pressing the key S. The split will be made between the red and green dots in the selected triangle.

Triangle Before Split

Split Triangle (Key S)

Another way of creating a triangle is to use  the mirrorTriangle function. To do this press the key M. This will cause a new triangle to be made that joins the selected triangle. The new triangle will be created sharing vertices with the corners marked by the red and green dots.

Triangle Before Mirror function

Mirrored Triangle (Key M)

Changing the triangle Divide of Two Triangles (D)
This function though we could get by without using it I use it so often when hand editing I decided to add it to the minimalist list of functions.
Often we have two triangles divided like this

 when we would rather them be divided like this

To swap the triangle divide first select one of the triangles, press R then select the other triangle and press D

Forcing a vertex to Mirror a Vertex (F)
We can get by without ever using this function but its simple to understand and can save a lot of time.
Often when making a model we want it to be symmetrical, we want the left vertices to be in the same positions as the right except in mirrored form. This can be done using the function move mirrorX
In the following example we see a triangle whose left vertex is not the same as the vertex to the right.

To make the left vertex mirror the right select the left vertex, press R and then select the right vertex and press F

After move vertex to mirrorX function (key F)

Centering a Vertex in the X Dimension (Alt+X)
We can get by without ever using this function but its simple to understand and can save a lot of time.
This function simply causes any selected vertex to go to the center in the x dimension (in the middle of left and right)  This function is useful for when making symmetrical models when we want to make vertices that are meant to be exactly in the middle exactly that.

before selected vertex not in middle

after zero x function (Alt+X)

Delete a single Triangle
Select the triangle then press Delete

Joining a Vertex to another Vertex (J)
Select the vertex whose position (coord value) and color you wish to keep and then press R to copy it, then select the other vertex and press J to paste in the coord and color value. For more options in joining vertices see Breaking and Joining Vertices.

Break a Vertex away from another Vertex (B)
Select the triangle and the vertex you want to break away and press B

Changing the Color of a Vertex
To change the color of the selected vertex press down control and one of the 6 decrement/increment keys from the keyboard

       [ ]
      ; '
     . /

to save time we can copy a vertex by pressing R (or Ctrl+C) and paste the color of this vertex into another vertex by pressing C

Finding triangles to thin or small to see (Alt+F)
The findThinTriangle function might not seem like a function you would have in a minimalist list of essential functions but I think it is one because making triangles to hard to see by mistake can cause annoying problems and is something that can easily happen when triangle structures get complex. Triangles to thin to be considered triangles don't generate normals properly and so you end up with points in your model that don't look how they should (to dark or to bright). To find a thin triangle in all the part's that belong to a seamless node first select the seamless node or one of the parts that belongs to it and then press the short cut keys Alt+F. If there is a triangle that owns 2 vertices that are close to each other within the range of about 1 mm this triangle will get selected. When such triangles are selected you may only be able to see 2 of the 3 colored dots at one time but you can reveal all 3 by pressing F8 to rotate the dots round the corners. When a thin triangle is found you can either tug it's vertices to make the triangle wider or delete it.

Changing which part owns a vertex (Alt+o)

Changing the ownership of a vertex wont make any noticeable changes to the vertex or the whole shape when not animated but changing a vertex to be owned by a different part will logically affect how the vertex gets animated. To be able to see which Part a vertex belongs to select the vertex in question and look at the blue title bar in the 3d window. The name seen here shows which part the selected vertex belongs to. To paste in the ownership from a part into a vertex first right click on the part you want to be the owner in the scene tree window and select copy then click on any vertex you want to be owned by the copied part and select Alt+o the short cut keys for paste ownership. You do not have to copy the owner before each time you press Alt+o Only once for the first vertex does this have to be done. So like this it is relatively fast to change a number of vertices ownership one at a time. Pasting the ownership might seem a bit strange to grasp at first but the concept is like pasting the color of a vertex into another except we are pasting the ownership of the vertex instead of it's color.

Changing the location of a part for animation

To change the location of a part ( which is logically the same as changing the location of a part's joint or hinge) change the value in the Part's translation field. In wireframe mode the little yellow sphere shows the location point of the part. When a part is rotated during animation it will rotate around this point. Pressing Alt+0 will move the view so that we see the part's location point in the center of the 3d window.
(feature soon to be added) Clicking on the yellow dot and dragging it changes the location of the part.
(feature soon to be added) Right Clicking on the yellow dot and dragging it changes the orientation of the part.

TimeSensor and OrientationInterpolator nodes

The best way to learn how to use the TimeSensor node and OrientationInterpolator node is to play about with the following simple example we will make;
First set up the scene tree with a part DEFined as triangle (or what ever name you like)

and paste in a triangle to the part

so that we see a triangle in the 3d window.

then....
select the Scene node, right click and select paste/children/new/TimeSensor

DEFine the TimeSensor as timeSensor or any name you like

Right click on the TimeSensor node and select paste/sibling below/new/OrientationInterpolator

DEFine the OrientationInterpolator as orientationInterpolator or any name you like.

Now we have the 2 nodes for animation added we need to wire up the signals so that the time sensor node sends it's timing to the OrientationInterpolator and in turn the OrientationInterpolator node sends it's rotation values to the Part node
We will start by first adding the ROUTE from the OrientationInterpolator to the Part
To do this we must first right click on the destination node for the ROUTE and copy it

so that seamless will remember this node so that when we now right click on the OrientationInterpolator in the scene tree window


we can select paste/value_changed/TO triangle/rotation
for the destination of the ROUTE

Now that our ROUTE is added we should see the ROUTE displayed in the OrientionInterpolator's control panel at the bottom of the window:
 


this line specifies that a ROUTE exists from the field named value_changed to the field named rotation owned by the Part DEFined as triangle.

We must also add a ROUTE from the TimeSensor to the OrientationInterpolator.
To Do this:
copy the destination node (the OrientationInterpolator) for our ROUTE

right click on the TimeSensor node and select paste/fraction_changed/TO orientationInterpolator/set_fraction


We should now see the ROUTE from the TimeSensor to the OrientationInterpolator completing all the routes we need for this simple animation.

Check ( make TRUE) the loop field so that the TimeSensor will continuously send timing signals out via the ROUTE.

Our TimeSensor node is now powering away but our triangle is still because we have not added any values to the OrientationInterpolator.
To add 2 values to the OrientationInterpolator click on the count up button twice so that we see count = 2

the part node is now receiving rotation values from the OrientationInterpolator but we see no movement yet because the rotation values being sent out via the ROUTE are all 0 1 0 0
If we now click and hold down on the last button owned by the field keyValue (the z axis button for the keyValue field)

we should see our triangle animate from the first rotation value (the value at index 0) to the last rotation value (the value at index 1) and then jump back to the first value repeating the cycle endlessly. To make it animate smoothly back to the first value the rule is you must have the last value = the first. We can do this by simply clicking on the up count button  to add one more value of 0 1 0 0 (making count = 3)

When we add extra values using the count button seamless automatically works out the values for the key field. The key values can be altered manually but if you don't know what you are doing and want to keep everything minimalist leave the key values alone and only play with the keyValue values.
We can add as many rotation values as we like by clicking on the count up button.
The TimeSensor node's field cycleInterval specifies the time in seconds how long it takes the OrientationInterpolator to complete the cycle of sending out the sequence or rotation values.

Removing Routes
Normally we don't disable routes by removing them but if we find the need to delete a route this can easily be done by right clicking on the route displayed in the node's control panel and then selecting delete this ROUTE.

Tugging vertices after they have animated
If we want to now work on our triangle and drag a vertex we must turn off the TimeSensor node
This can be done by un-checking the loop field or un-checking the enabled field.
Because when the OrientationInterpolator was active it sent it's rotation values via the route to the Part's rotation field, the Part's rotation field will be left with values it received at the point in time we disable the TimeSensor. To reset the Part rotation fields back to values of 0 1 0 0 (no rotation) for all the Seamless and Part nodes click on reset rotations

Making an avatar with triggered gestures.
To make our triangle only animate from a gesture when used in Blaxxun multi-user mode we must wrap all our nodes into a single Proto.
This is best done by first saving our current work and then loading a Proto from a file already set up with the gesture fields set up for a multi user blaxxun avatar.
So after first saving our click on open smls file

and select the file AvatarProto.smls (from the seamless_way_examples.zip) file and open it

we should now see the empty AvatarProto and an instance of it in the scene tree window already named Avatar for us.
So that we don't corrupt the file we just loaded:
open the main menu select file/saveAs

save the file with a brand new name for your avatar
then go to the scene tree and right click on the ProtoBody in the scene tree window and select paste/children/import/nodes from file

in the Open a file dialogue box change the Files of type drop down menu to seamless files (*.smls) and select our minimalists avatar the same file we just saved a short time ago

After importing our minimalist avatar back we have our nodes (and routes) wrapped inside the Avatar Proto where we want them for an av.

To make it so that the TimeSensor is triggered by a gesture select the TimeSensor node in the scene tree window and then in the control panel uncheck the loop field so that the TimeSensor will start an animation sequence only when it is triggered by a gesture. To select a gesture right click on the name for the field startTime and select IS/gesture1

We will now see the startTime field displayed as:

which shows it is now connected to the ProtoInterface field gesture1

Because all nodes for an avatar should be inside the ProtoBody, from now on when we add more TimeSensor and OrientationInterpolator nodes, instead of adding them to the Scene node we should add them to the ProtoBody
this is done by right clicking on the ProtoBody's icon and selecting paste/children/new/ and the node you desire

Setting the position of the eyes
In a Blaxxun multi-user environment avatars should be set to have the eyes located at 0 meters in height.
To be able to see where a model is centered in relation to the world we will import a model of a cross hair.
To do this:

right click on the Scene node and select paste/children/import/nodes from file
In the Open a file dialogue box change the Files of type drop down menu to seamless files (.smls)
select the crosshairs.smls file and click open

now we should see a crosshairs object marking the center of the scene.

To get the eye at centre in height change the translation field for the root Part node (in this case our only Part) by clicking down on the translation field's middle button (the Y dimension button ) until we see our avs eyes at center.

If our av has more than one part we should always change the translation field that belongs to the first Part at the top in the scene tree (the root Part) to change the position of the whole av.

After getting the eyes centered right click on the Seamless node named crosshairs and select delete to get rid of the corsshairs object now we no longer need it.

Outputing the avatar as a wrl

Now if we select the scene node and press the output button we have an animated avatar triggered by a gesture.


This av may be pretty simple but if we can make this av knowing that vertices are animated in accordance to which part they belong to and that the position of the joint is determined by the rotation field there is no barrier preventing us from making very detailed sophisticated animated seamless avs and all done without the need of a text editor!

Viewing the gestures in single user mode
If we want to view our gestures open the file showGesture.wrl in a text editor and change the file name (shown in red) in the following line of text:
["myAvatar.wrl#Avatar" ]
to the name of our avatar
now if we open the showGesture.wrl in a VRML viewer we can view our animations by clicking on the gesture buttons.



Copyright © 2000-2006 Graham Perrett thyme@seamless3d.com