Keywords: sources, tagging, dynamic control

Summary

This demonstration shows how GLIST tags and a control file can be used to dynamically enable/disable sources in a scene. In this example, a system of lights (headlights, taillights, brake lights, turn signals) have been added to a car and they are turned on and off as function of time.

Details

Tagging System

This scenario uses the generic geometry tagging system that was introduced in DIRSIG5. The point of the system is to introduce named tags to geometry in the scene that can be used to dynamically bind features and controls to that geometry at run time. Tags are simply name strings that are associated with GLIST elements (including lists, objects and instances). You can add one or more tags to any element (as a comma separated list) and these tags are inherited by children in the geometry list hierarchy. For example, tags assigned to a geometry list will be inherited by objects within that list, and the instances of those objects will inherit them as well. When smartly planned, the tags can be used to access extensive sets of geometry or very specific geometric items in the scene.

Dynamic Control

The second key component of this demonstration is the use of an instance specific "control" file that dynamically enables and disables geometry in a given instance using the tag system. This mechanism can be used to introduce site evolution mechanics to a scene, where buildings don’t exist in the scene until a specific time. Or "pattern of life" properties, where cars populate a parking lot at specific times of day. In this case, we are using this mechanism to enable/disable light sources on a vehicle. The general mechanism employs a temporal control file that enables and disables geometry with specific tags as a function of time.

Important Files

This section highlights key files important to the simulation.

Nissan March Bundle

The primary object in the scene is a Nissan March sedan. The geometry, materials, sources, etc. for this object are stored in the geometry/bundles/nissan_march folder. The bundle features the vehicle geometry and a set of lights that are defined using the <basesource> mechanism in the GLIST file. The vehicle bundle contains 12 individual sources that are grouped into 6 pairs:

<geometrylist>
  <object enabled="true" search_paths="local">
    <localmaterials>nissan_march.mat</localmaterials>
    <basegeometry>
      <obj swapyz="false">
        <filename>nissan_march.obj</filename>
        ...
        [lines deleted for documentation purposes]
        ...
      </obj>
    </basegeometry>
    <staticinstance/>
  </object>

  <object enabled="true" search_paths="local" tags="headlights_low">
    <localmaterials>nissan_march.mat</localmaterials>
    <basesource>
      <pointsource matid="headlight_low">
        <pointing><vector><x>0.0</x><y>1.0</y><z>0.0</z></vector></pointing>
      </pointsource>
    </basesource>
    <staticinstance>
      <translation>
        <point><x>-0.86</x><y>1.86</y><z>0.7</z></point>
      </translation>
    </staticinstance>
    <staticinstance>
      <translation>
        <point><x>+0.86</x><y>1.85</y><z>0.7</z></point>
      </translation>
    </staticinstance>
  </object>

  ...
  [lines deleted for documentation purposes]
  ...

  <object enabled="true" search_paths="local" tags="right_turn">
    <localmaterials>nissan_march.mat</localmaterials>
    <basesource>
      <pointsource matid="turn_light_orange">
        <pointing><vector><x>0.0</x><y>1.0</y><z>0.0</z></vector></pointing>
      </pointsource>
    </basesource>
    <staticinstance>
      <translation>
        <point><x>+0.86</x><y>+1.85</y><z>0.7</z></point>
      </translation>
    </staticinstance>
    <staticinstance>
      <translation>
        <point><x>+0.86</x><y>-1.85</y><z>0.7</z></point>
      </translation>
      <rotation units="degrees" rotationorder="xyz">
        <cartesiantriple><x>0</x><y>0</y><z>180</z></cartesiantriple>
      </rotation>
    </staticinstance>
  </object>

Below is a summary of the sources and the associated tag names:

  • Head lights, low beam: Left and right, tag = "headlight_low"

  • Tail lights: Left and right, tag = "taillight"

  • Brake lights: Left and right, tag = "brakelight"

  • Turn signals (left side): Front and back, tag = "left_turn"

  • Turn signals (right side): Front and back, tag = "right_turn"

The tag names associated with the base source are important because they are what is used to link the temporal enable/disable commands to the geometry.

The material file in the bundle describes the radiometric properties of the different sources. These materials are associated with the sources in the GLIST using alpha-numeric labels (IDs). Note that the turn signal source used the BLINK_FREQUENCY to define the frequency at which the turn signals will flash when they are enabled. The "blink" mechansim is a instantaneous and binary on/off (not too different from most modern LEDs). If a softer on/off tranistion is desired, the appropriate frequency spectrum can be supplied.

Enable/Disable Control File

To manipulate these tagged geometry items, a Comma Separated Variable (CSV) "control" file is created. The first line of the file defines the tags to be controlled. The remaining lines specify the enable/disable state of the list of tagged geometry items as a function of time.

Note
The control file can be used to enable/disable any geometry. It is a generic mechanism that is being used here to control sources.

Consider the example control file below. The first line defines the tags in the geometry we want to control. In this case, we have listed tags we associated with our sources in the GLIST file. The remaining lines define times at which the enable/disable state for all the tag geometry will be changed. The simulation relative time is the first token, and the remaining tokens represent the "state" for that tagged geometry. A value of 0 disables the geometry and a value of 1 enables the geometry.

Note
The enable/disable token can be a fraction between [0,1]. Hence, an alternative to the approach of having a separate set of low- and high-beam sources could be to change the magnitude of a single source. For example, "off" would be a value of 0.0, "low" could be a value of 0.5 and "high" could be a value of 1.0. However high-beams are also aimed higher (further down the road) than low driving lights.

This demo has two instances of the same car bundle in it. One is parked and one drives, turns into a parking spot and then stops. Each instance will have it’s own control file.

The control file for the parked car can be found as geometry/control/nissan_march0.txt. The first line is the name of the tagged items we want to control. The remaining lines are toggle states for the corresponding items. For the parked car, we start by making all the lights off (everything gets state 0) and then we turn on the headlights and taillights 5 seconds into the simulation:

"headlights_low","taillights","brakelights","left_turn","right_turn"
"0.0","0","0","0","0","0"
"5.0","1","1","0","0","0"

The control file for the driving/parking car is found as geometry/control/nissan_march1.txt. In this case, we start with the low headlights and taillights enabled. A second later we switch from the low to high headlights by disabling one and enabling the other. Shortly later, we switch back. At t = 2 seconds the brakelights are enabled, followed by the left turn signals. As a reminder, the turn signal sources have an inherent blink frequency and do not need to be toggled on/off in this control file. After the turn into the parking spot, the left turn signals and brakelights are disabled. The brakelights come on one last time as the car comes to a stop. And finally, all the lights are turned off:

"headlights_low","taillights","brakelights","left_turn","right_turn"
"0.0","1","1","0","0","0"
"1.5","1","1","1","0","0"
"2.0","1","1","1","1","0"
"5.5","1","1","0","0","0"
"7.5","1","1","1","0","0"
"8.5","0","0","0","0","0"
Important
The use of double-quotes is important to the parsing of a CSV file. This allows the CSV tokens to contain whitespace and other commas.

Binding the Bundle and Commands

The control file is bound to a specific instance of a GLIST <object>, which allows each instance to have a unique set of commands associated with it. This is done using the control attribute in either a <staticinstance> or <dynamicinstance> element. Below is a portion of the main GLIST file for the simulation (see geometry/demo.glist). Here we can see the two instances (one static and one dynamic) being defined and each getting a unique control file assigned to it:

  <object enabled="true">
    <basegeometry>
      <glist>
        <filename>bundles/nissan_march/nissan_march.glist</filename>
      </glist>
    </basegeometry>
    <staticinstance tags="nissan_march0" control="control/nissan_march0.txt">
      <translation>
        <point><x>-2.6</x><y>6.0</y><z>0.0</z></point>
      </translation>
      <rotation units="degrees" rotationorder="xyz">
        <cartesiantriple><x>0</x><y>0</y><z>90</z></cartesiantriple>
      </rotation>
    </staticinstance>
    <dynamicinstance tags="nissan_march1" control="control/nissan_march1.txt">
      <motion type="generic">
        <filename>motion/nissan_march1.ppd</filename>
      </motion>
    </dynamicinstance>
  </object>

Setup

This section includes any step-by-step instructions for running and visualizing the simulation. Since this is a night (low-light) scene, the convergence parameters should be adjusted to use a lower threshold.

To run the single-frame simulation, use the following syntax:

$ dirsig5 --convergence=50,300,1e-12 demo.sim

or to run the multi-frame (animation) simulation, use the following syntax:

$ dirsig5 --convergence=50,300,1e-12 video.sim

Results

The video.sim simulation produces 72 image frames that spans the 9 second task window.

video.gif
Figure 1. Animation of video simulation.