Pinecoast Software Inc.
      Home
Subscribe
 

Tutorial: Layering and Layout

Caution: the Layer and Layout nodes are new to the X3D version 3.2 specification and are not supported by some viewers.

Basic File Structure

Layering

The 3D scene at the left is composed of two layers. The main layer contains scene that is being viewed, including the background, navigation, viewpoints and geometry. A second layer containing the user interface buttons is then superimposed on the screen. In the scene illustrated, the cube can be rotated and the buttons at the bottom can be used to change the color of the cube. For red, the color will change immediately. For blue, the color will change gradually. The functioning of these buttons will be postponed until the next tutorial.



Because the Layering and Layout components require X3D version 3.2, it is first necessary to change the version numbers at the beginning of the X3D file. Component statements are also necessary to indicate that the Layering and Layout components are being used in the file.

In most VRML and X3D scenes the nodes are placed inside the <Scene> element. In this case, however, a <LayerSet> is inserted into the scene and each of the layers is placed inside the LayerSet. Although it is possible to place nodes outside the LayerSet, it is best to insert all geometry nodes inside one of the layers. This avoids some navigation problems, since navigation occurs within one of the layers.

When using a LayerSet, it is very important to remember to set the order parameter. This specifies which layers should be displayed. For this example, both the first and second layers are displayed. If the the order parameter is omitted, nothing will be displayed!

 


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.2//EN" 
    "http://www.web3d.org/specifications/x3d-3.2.dtd">

<X3D profile="Immersive" version="3.2">
  <head>
    <component name="Layering" level="1"/>
    <component name="Layout" level="1"/>
  </head>
  <Scene>
    <LayerSet order="1 2">
      <Layer>
        <!--- The main 3D scene goes here, 
              including background, viewpoints, etc 
              ---> 
        ....
      </Layer>
      <LayoutLayer>
        <!--- The 2D control panel (dashboard) 
              goes here ---> 
        ....
      </LayoutLayer>
    </LayerSet>
  </Scene>
</X3D>

 

Layout

The LayoutLayer is a layer node that is designed to contain the elements of the user interface. We want the control panel centered at the bottom of the screen. This is indicated in the align parameter of the Layout for the LayoutLayer.

As the size of the display changes we want the positions of the buttons to change but we do not want their size to change. To achieve this we specify that the control panel should cover the full width of the screen but should only be 48 pixels wide. The first number in the size parameter is 1 and this indicates the full width of the screen because the first entry in the sizeUnits parameter is FRACTION, which means that the size specifies the fraction of the screen width that is desired. The second entries are for the height and set the height at 48 pixels.

 


  <LayoutLayer>
    <!--- layout for gray rectangle --->  
    <Layout align='"CENTER""BOTTOM"' 
            offsetUnits='"FRACTION""PIXEL"' 
            scaleMode='"FRACTION"PIXEL"' 
            size="1 48" sizeUnits='"FRACTION""PIXEL"'/>
    <!--- The background gray rectangle --->  
    <Transform translation="0 0 -10">
      <Shape>
        <Appearance>
          <Material diffuseColor="0.77 0.77 0.77"/>
        </Appearance>
        <Rectangle2D size="1 48"/>
      </Shape>
    </Transform>
    <LayoutGroup>
      <!--- The layout for blue and red buttons --->  
      <Layout align='"CENTER""TOP"' 
              offsetUnits='"PIXEL""PIXEL"' 
              scaleMode='"PIXEL""PIXEL"' 
              size="200 48" sizeUnits='"PIXEL""PIXEL"'/>
      <!--- The blue button (simplified) --->  
        <Transform translation="-54 -24 2">
            <Shape>
              <Appearance>
                <ImageTexture url="buttons.png"/>
              </Appearance>
              <IndexedFaceSet coordIndex="0 1 3 2" 
                              normalIndex="0 0 0 0" 
                              texCoordIndex="0 1 3 2">
                <Coordinate point="0 0 0, 48 0 0, 
                                   0 48 0, 48 48 0"/>
                <Normal vector="0 0 1"/>
                <TextureCoordinate point="0.0 0.5, 0.5 0.5, 
                                          0.0 1.0, 0.5 1.0"/>
              </IndexedFaceSet>
            </Shape>
        </Transform>
      <!--- The red button (simplified) --->  
        <Transform translation="6 -24 2">
            <Shape>
              <Appearance>
                <ImageTexture url="buttons.png"/>
              </Appearance>
              <IndexedFaceSet coordIndex="0 1 3 2" 
                              normalIndex="0 0 0 0" 
                              texCoordIndex="0 1 3 2">
                <Coordinate point="0 0 0, 48 0 0, 
                                   0 48 0, 48 48 0"/>
                <Normal vector="0 0 1"/>
                <TextureCoordinate point="0.5 0.5, 1.0 0.5, 
                                          0.5 1.0, 1.0 1.0"/>
              </IndexedFaceSet>
            </Shape>
        </Transform>
      </Transform>
    </LayoutGroup>
  </LayoutLayer>

 

Now for the buttons. We specified the width of the control panel in FRACTION because we wanted it to fill the full width of the screen. For the buttons, however, we want to specify their width and height in pixels.

Insert a LayoutGroup inside the LayoutLayer. This will be the container for the buttons. The align parameter indicates that the LayoutGroup will be located at the center and top within the control panel. The Layout group is given a width of 200 pixels and a height of 48 pixels centered within the control panel.

The center of the LayoutGroup has coordinates (0, 0). The Transform node for the red button places its lower left corner 6 pixels to the right of center and 24 pixels down. The button itself is a square of 48 pixels by 48 pixels and uses the upper left quarter of the texture map. The texture map is described in the next tutorial.



Connecting the Buttons

The next step in the process is to add the message routing that will allow the buttons to change the color of the cube. That is the subject of the next tutorial ...... CONTINUE



Download tutorial files



Copyright © Pinecoast Software 2000-2008. All rights reserved.