[Opal-commits] web documentation.html,1.13,1.14 tutorial4.html,1.4,1.5 tutorial8.html,1.1,1.2
Status: Inactive
Brought to you by:
tylerstreeter
|
From: tylerstreeter <tyl...@us...> - 2005-03-28 20:08:07
|
Update of /cvsroot/opal/web In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9551 Modified Files: documentation.html tutorial4.html tutorial8.html Log Message: added tutorial on contact groups Index: tutorial8.html =================================================================== RCS file: /cvsroot/opal/web/tutorial8.html,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** tutorial8.html 26 Mar 2005 17:34:52 -0000 1.1 --- tutorial8.html 28 Mar 2005 20:07:54 -0000 1.2 *************** *** 25,44 **** <o:Author>Tyler Streeter</o:Author> <o:LastAuthor>Tyler Streeter</o:LastAuthor> ! <o:Revision>173</o:Revision> ! <o:TotalTime>364</o:TotalTime> <o:Created>2004-06-05T15:20:00Z</o:Created> ! <o:LastSaved>2005-03-26T17:17:00Z</o:LastSaved> <o:Pages>1</o:Pages> ! <o:Words>540</o:Words> ! <o:Characters>3084</o:Characters> <o:Company>none</o:Company> ! <o:Lines>25</o:Lines> <o:Paragraphs>7</o:Paragraphs> ! <o:CharactersWithSpaces>3617</o:CharactersWithSpaces> <o:Version>10.6714</o:Version> </o:DocumentProperties> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> ! <w:Zoom>90</w:Zoom> <w:GrammarState>Clean</w:GrammarState> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> --- 25,45 ---- <o:Author>Tyler Streeter</o:Author> <o:LastAuthor>Tyler Streeter</o:LastAuthor> ! <o:Revision>204</o:Revision> ! <o:TotalTime>431</o:TotalTime> <o:Created>2004-06-05T15:20:00Z</o:Created> ! <o:LastSaved>2005-03-28T20:05:00Z</o:LastSaved> <o:Pages>1</o:Pages> ! <o:Words>570</o:Words> ! <o:Characters>3250</o:Characters> <o:Company>none</o:Company> ! <o:Lines>27</o:Lines> <o:Paragraphs>7</o:Paragraphs> ! <o:CharactersWithSpaces>3813</o:CharactersWithSpaces> <o:Version>10.6714</o:Version> </o:DocumentProperties> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> ! <w:Zoom>75</w:Zoom> ! <w:SpellingState>Clean</w:SpellingState> <w:GrammarState>Clean</w:GrammarState> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> *************** *** 81,84 **** --- 82,88 ---- text-decoration:underline; text-underline:single;} + span.SpellE + {mso-style-name:""; + mso-spl-e:yes;} @page Section1 {size:8.5in 11.0in; *************** *** 108,112 **** </style> <![endif]--><!--[if gte mso 9]><xml> ! <o:shapedefaults v:ext="edit" spidmax="64514"> <o:colormenu v:ext="edit" fillcolor="white"/> </o:shapedefaults></xml><![endif]--><!--[if gte mso 9]><xml> --- 112,116 ---- </style> <![endif]--><!--[if gte mso 9]><xml> ! <o:shapedefaults v:ext="edit" spidmax="66562"> <o:colormenu v:ext="edit" fillcolor="white"/> </o:shapedefaults></xml><![endif]--><!--[if gte mso 9]><xml> *************** *** 141,186 **** <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> ! <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>Sensors ! acquire information from a simulation.<span style='mso-spacerun:yes'> ! </span>There are several types of Sensors, including Acceleration Sensors, ! Raycast Sensors, and Volume Sensors.<span style='mso-spacerun:yes'> ! </span>This tutorial will show how to setup each type.<span ! style='mso-spacerun:yes'> </span>It will also give examples of how each type ! could be used.<span style='mso-spacerun:yes'> </span>Keep in mind that a ! Sensor can either be attached to a Solid or just positioned somewhere in the ! environment.<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> ! <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>Lets ! first create all the objects well need (and assume they will be initialized ! elsewhere):<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> ! <table class=MsoNormalTable border=1 cellspacing=0 cellpadding=0 align=left ! style='background:silver;border-collapse:collapse;border:none;mso-border-alt: ! solid windowtext .25pt;mso-table-lspace:9.0pt;margin-left:.1in;mso-table-rspace: ! 9.0pt;margin-right:.1in;mso-table-anchor-vertical:paragraph;mso-table-anchor-horizontal: ! page;mso-table-left:7.35pt;mso-table-top:12.7pt;mso-padding-alt:0in 5.4pt 0in 5.4pt'> ! <tr style='mso-yfti-irow:0;mso-yfti-lastrow:yes;height:22.95pt'> ! <td width=974 valign=top style='width:584.6pt;border:solid windowtext 1.0pt; ! mso-border-alt:solid windowtext .25pt;padding:0in 5.4pt 0in 5.4pt; ! height:22.95pt'> ! <p class=MsoNormal><span style='font-family:Courier;color:black'><o:p> </o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>opal::Simulator* ! sim = opal::createSimulator();<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>opal::Solid* ! solid = sim->createSolid();<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> ! </td> ! </tr> ! </table> ! <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span ! style='font-size:16.0pt;font-family:"Book Antiqua";color:black'>Acceleration ! Sensor<o:p></o:p></span></b></p> ! <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>The ! first Sensor we will use here is an Acceleration Sensor:<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <table class=MsoNormalTable border=1 cellspacing=0 cellpadding=0 align=left --- 145,195 ---- <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> ! <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>Usually ! all Solid/Solid collisions generate physical contacts that keep them from ! interpenetrating.<span style='mso-spacerun:yes'> </span>Sometimes this is ! not desired, either for performance reasons (fewer constraints means faster ! simulation) or for special effects.<span style='mso-spacerun:yes'> ! </span>Contact groups can be used to enable <span class=SpellE>forcefields</span> ! that repel only a subset of objects, efficient ray casts that only collide ! with certain objects, invisible trigger volumes that generate collision ! events but dont make physical contacts with anything, etc.<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> + <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>It is + important to note the difference between collision events and contacts + the way OPAL defines them.<span style='mso-spacerun:yes'> </span>Collision events + occur whenever two Solids collide (but are only handled if at least one of + the two Solids uses a collision event handler).<span + style='mso-spacerun:yes'> </span>Contacts are physical constraints that keep + Solids from penetrating one another.<span style='mso-spacerun:yes'> + </span>Solids can use collision events and/or contacts.<span + style='mso-spacerun:yes'> </span>By default, every collision group generates + contacts, and every Shape starts in group 0.<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> + <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>Every + OPAL Shape is in one (and only one) contact group.<span + style='mso-spacerun:yes'> </span>A contact group can be set to enable or + disable contacts with other contact groups, including itself. <span + style='mso-spacerun:yes'> </span>For example, if groups 5 and 8 are set not + to generate contacts, object A is in group 5, and object B is in group 8, + objects A and B will pass through one another when they collide.<span + style='mso-spacerun:yes'> </span>OPAL can use up to 32 different contact + groups.<span style='mso-spacerun:yes'> </span>Contact groups always work + both ways between two groups: if group X makes contacts with group Y, group Y + will make contacts with group X.<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span ! style='font-family:"Book Antiqua";color:black'>Warning:</span></b><span ! style='font-family:"Book Antiqua";color:black'> Because the contact group ! interactions are always two-way, be careful about the order in which you ! setup the groups.<span style='mso-spacerun:yes'> </span>If you set group 3 ! not to make contacts with group 5, then set group 5 to make contacts with ! group 3, the two groups will make contacts.<span style='mso-spacerun:yes'> ! </span><o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> ! <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>Here ! is an example that shows how to create three objects: object A, object B, and ! object C.<span style='mso-spacerun:yes'> </span>We will generate contacts ! only between objects A and B and objects B and C, but not between objects B ! and C:<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <table class=MsoNormalTable border=1 cellspacing=0 cellpadding=0 align=left *************** *** 194,213 **** height:22.95pt'> <p class=MsoNormal><span style='font-family:Courier;color:black'><o:p> </o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>opal::AccelerationSensorData ! data;<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>data.solid ! = solid;<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>data.transform.translate(4, ! 0, -1);<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>opal::AccelerationSensor* ! accelSensor = sim->createAccelerationSensor();<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>accelSensor->init(data);<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:Courier;color:black'><o:p> </o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>...<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:Courier;color:black'><o:p> </o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>opal::Vec3r ! accel = accelSensor-></span><span style='font-size:10.0pt;font-family: ! "Courier New";color:windowtext'>getGlobalLinearAccel();</span><span ! style='font-family:Courier;color:black'><o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> </td> --- 203,257 ---- height:22.95pt'> <p class=MsoNormal><span style='font-family:Courier;color:black'><o:p> </o:p></span></p> ! <p class=MsoNormal><span class=SpellE><span style='font-family:Courier; ! color:black'>opal::Simulator</span></span><span style='font-family:Courier; ! color:black'>* <span class=SpellE>sim</span> = <span class=SpellE>opal::createSimulator</span>();<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:Courier;color:black'><o:p> </o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>// Create ! three Solids, each with a Shape in a different contact group.<o:p></o:p></span></p> ! <p class=MsoNormal><span class=SpellE><span style='font-family:Courier; ! color:black'>opal::SphereShapeData</span></span><span style='font-family: ! Courier;color:black'> <span class=SpellE>sphereData</span>;<o:p></o:p></span></p> ! <p class=MsoNormal><span class=SpellE><span style='font-family:Courier; ! color:black'>opal::Solid</span></span><span style='font-family:Courier; ! color:black'>* <span class=SpellE>objectA</span> = <span class=SpellE>sim</span>-><span ! class=SpellE>createSolid</span>();<o:p></o:p></span></p> ! <p class=MsoNormal><span class=SpellE><span style='font-family:Courier; ! color:black'>sphereData.contactGroup</span></span><span style='font-family: ! Courier;color:black'> = 1;<o:p></o:p></span></p> ! <p class=MsoNormal><span class=SpellE><span style='font-family:Courier; ! color:black'>objectA</span></span><span style='font-family:Courier; ! color:black'>-><span class=SpellE>addShape</span>(<span class=SpellE>sphereData</span>);<o:p></o:p></span></p> ! <p class=MsoNormal><span class=SpellE><span style='font-family:Courier; ! color:black'>opal::Solid</span></span><span style='font-family:Courier; ! color:black'>* <span class=SpellE>objectB</span> = <span class=SpellE>sim</span>-><span ! class=SpellE>createSolid</span>();<o:p></o:p></span></p> ! <p class=MsoNormal><span class=SpellE><span style='font-family:Courier; ! color:black'>sphereData.contactGroup</span></span><span style='font-family: ! Courier;color:black'> = 2;<o:p></o:p></span></p> ! <p class=MsoNormal><span class=SpellE><span style='font-family:Courier; ! color:black'>objectB</span></span><span style='font-family:Courier; ! color:black'>-><span class=SpellE>addShape</span>(<span class=SpellE>sphereData</span>);<o:p></o:p></span></p> ! <p class=MsoNormal><span class=SpellE><span style='font-family:Courier; ! color:black'>opal::Solid</span></span><span style='font-family:Courier; ! color:black'>* <span class=SpellE>objectC</span> = <span class=SpellE>sim</span>-><span ! class=SpellE>createSolid</span>();<o:p></o:p></span></p> ! <p class=MsoNormal><span class=SpellE><span style='font-family:Courier; ! color:black'>sphereData.contactGroup</span></span><span style='font-family: ! Courier;color:black'> = 3;<o:p></o:p></span></p> ! <p class=MsoNormal><span class=SpellE><span style='font-family:Courier; ! color:black'>objectC</span></span><span style='font-family:Courier; ! color:black'>-><span class=SpellE>addShape</span>(<span class=SpellE>sphereData</span>);<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:Courier;color:black'><o:p> </o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>// Setup ! the contact groups.<o:p></o:p></span></p> ! <p class=MsoNormal><span class=SpellE><span style='font-family:Courier; ! color:black'>sim</span></span><span style='font-family:Courier;color:black'>-><span ! class=SpellE>setupContactGroups</span>(1, 2, true);<o:p></o:p></span></p> ! <p class=MsoNormal><span class=SpellE><span style='font-family:Courier; ! color:black'>sim</span></span><span style='font-family:Courier;color:black'>-><span ! class=SpellE>setupContactGroups</span>(2, 3, true);<o:p></o:p></span></p> ! <p class=MsoNormal><span class=SpellE><span style='font-family:Courier; ! color:black'>sim</span></span><span style='font-family:Courier;color:black'>-><span ! class=SpellE>setupContactGroups</span>(1, 3, false);<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> </td> *************** *** 225,285 **** <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>The - Sensor is automatically attached to the Solid if its Solid pointer is - set.<span style='mso-spacerun:yes'> </span>It calculates the linear and angular - acceleration of the attached Solid at the point of the Sensor (which can be - offset from the Solid by using the Sensors transform).<o:p></o:p></span></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span - style='font-size:16.0pt;font-family:"Book Antiqua";color:black'>Raycast - Sensor<o:p></o:p></span></b></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>The - next Sensor is the Raycast Sensor:<o:p></o:p></span></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> - <table class=MsoNormalTable border=1 cellspacing=0 cellpadding=0 align=left - style='background:silver;border-collapse:collapse;border:none;mso-border-alt: - solid windowtext .25pt;mso-table-lspace:9.0pt;margin-left:.1in;mso-table-rspace: - 9.0pt;margin-right:.1in;mso-table-anchor-vertical:paragraph;mso-table-anchor-horizontal: - page;mso-table-left:7.35pt;mso-table-top:12.7pt;mso-padding-alt:0in 5.4pt 0in 5.4pt'> - <tr style='mso-yfti-irow:0;mso-yfti-lastrow:yes;height:22.95pt'> - <td width=974 valign=top style='width:584.6pt;border:solid windowtext 1.0pt; - mso-border-alt:solid windowtext .25pt;padding:0in 5.4pt 0in 5.4pt; - height:22.95pt'> - <p class=MsoNormal><span style='font-family:Courier;color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:Courier;color:black'>opal::RaycastSensorData - data;<o:p></o:p></span></p> - <p class=MsoNormal><span style='font-family:Courier;color:black'>data.solid - = solid;<o:p></o:p></span></p> - <p class=MsoNormal><span style='font-family:Courier;color:black'>data.ray.setOrigin(opal::Point3r(0, - 0, 0));<o:p></o:p></span></p> - <p class=MsoNormal><span style='font-family:Courier;color:black'>data.ray.setDir(opal::Vec3r(0, - 0, -1));<o:p></o:p></span></p> - <p class=MsoNormal><span style='font-family:Courier;color:black'>data.contactGroup - = 2;<o:p></o:p></span></p> - <p class=MsoNormal><span style='font-family:Courier;color:black'>opal::RaycastSensor* - raySensor = sim->createRaycastSensor();<o:p></o:p></span></p> - <p class=MsoNormal><span style='font-family:Courier;color:black'>raySensor->init(data);<o:p></o:p></span></p> - <p class=MsoNormal><span style='font-family:Courier;color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:Courier;color:black'>...<o:p></o:p></span></p> - <p class=MsoNormal><span style='font-family:Courier;color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:Courier;color:black'>opal::RaycastResult - result = raySensor-></span><span style='font-family:Courier;mso-bidi-font-family: - "Courier New";color:windowtext'>fireRay();<o:p></o:p></span></p> - <p class=MsoNormal><span style='font-family:Courier;mso-bidi-font-family: - "Courier New";color:windowtext'>opal::Point3r hitPoint = - result.intersection;<o:p></o:p></span></p> - <p class=MsoNormal><span style='font-family:Courier;mso-bidi-font-family: - "Courier New";color:windowtext'>opal::Solid* hitSolid = result.solid;</span><span - style='font-family:Courier;color:black'><o:p></o:p></span></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> - </td> - </tr> - </table> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:Courier;color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> --- 269,272 ---- *************** *** 291,308 **** <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> ! <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>Raycast ! Sensors must be fired manually they do not update anything every time ! step.<span style='mso-spacerun:yes'> </span>When they are fired, they cast a ! ray into the environment and return data describing the closest point of ! intersection (if any) from the rays origin.<span style='mso-spacerun:yes'> ! </span>The Raycast Sensor uses a contact group to limit which objects it ! collides with.<span style='mso-spacerun:yes'> </span>(See other tutorials ! for more information on contact groups.)<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><span ! style='mso-spacerun:yes'> </span><o:p></o:p></span></p> ! <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span ! style='font-size:16.0pt;font-family:"Book Antiqua";color:black'>Volume Sensor<o:p></o:p></span></b></p> ! <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>The ! Volume Sensor is similar to the Raycast Sensor:<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <table class=MsoNormalTable border=1 cellspacing=0 cellpadding=0 align=left --- 278,283 ---- <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> ! <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>To setup ! an object that doesnt make contacts with anything else, do the following:<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <table class=MsoNormalTable border=1 cellspacing=0 cellpadding=0 align=left *************** *** 316,370 **** height:22.95pt'> <p class=MsoNormal><span style='font-family:Courier;color:black'><o:p> </o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>opal::VolumeSensorData ! data;<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>data.contactGroup ! = 5;<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>opal:: ! VolumeSensor* volSensor = sim->createVolumeSensor();<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>volSensor->init(data);<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'><o:p> </o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>// Define ! a volume Solid.<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>opal::Solid* ! volume = sim->createSolid();<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>opal::SphereShapeData ! sphereData;<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>sphereData.radius ! = 5;<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>volume->addShape(sphereData);<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'><o:p> </o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>...<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'><o:p> </o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>opal::VolumeQueryResult ! result = volSensor-></span><span style='font-family:Courier;mso-bidi-font-family: ! "Courier New";color:windowtext'>queryVolume(volume);<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;mso-bidi-font-family: ! "Courier New";color:windowtext'>for (int i=0; i<result.getNumSolids(); ! ++i)<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;mso-bidi-font-family: ! "Courier New";color:windowtext'>{<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;mso-bidi-font-family: ! "Courier New";color:windowtext'><span style='mso-spacerun:yes'> ! </span>opal::Solid* s = result.getSolid(i);<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;mso-bidi-font-family: ! "Courier New";color:windowtext'><span style='mso-spacerun:yes'> ! </span>opal::Force f;<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;mso-bidi-font-family: ! "Courier New";color:windowtext'><span style='mso-spacerun:yes'> ! </span>f.type = opal::GLOBAL_FORCE;<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;mso-bidi-font-family: ! "Courier New";color:windowtext'><span style='mso-spacerun:yes'> ! </span>f.duration = (opal::real)0.05;<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;mso-bidi-font-family: ! "Courier New";color:windowtext'><span style='mso-spacerun:yes'> ! </span>f.vec = s->getPosition() volume->getPosition();<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;mso-bidi-font-family: ! "Courier New";color:windowtext'><span style='mso-spacerun:yes'> ! </span>f.vec *= 100;<span style='mso-spacerun:yes'> </span><o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;mso-bidi-font-family: ! "Courier New";color:windowtext'><span style='mso-spacerun:yes'> ! </span>s->addForce(f);<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;mso-bidi-font-family: ! "Courier New";color:windowtext'>}<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> </td> --- 291,312 ---- height:22.95pt'> <p class=MsoNormal><span style='font-family:Courier;color:black'><o:p> </o:p></span></p> ! <p class=MsoNormal><span class=SpellE><span style='font-family:Courier; ! color:black'>opal::Simulator</span></span><span style='font-family:Courier; ! color:black'>* <span class=SpellE>sim</span> = <span class=SpellE>opal::createSimulator</span>();<o:p></o:p></span></p> ! <p class=MsoNormal><span class=SpellE><span style='font-family:Courier; ! color:black'>opal::BoxShapeData</span></span><span style='font-family:Courier; ! color:black'> <span class=SpellE>boxData</span>;<o:p></o:p></span></p> ! <p class=MsoNormal><span class=SpellE><span style='font-family:Courier; ! color:black'>boxData.contactGroup</span></span><span style='font-family: ! Courier;color:black'> = 15;<o:p></o:p></span></p> ! <p class=MsoNormal><span class=SpellE><span style='font-family:Courier; ! color:black'>opal::Solid</span></span><span style='font-family:Courier; ! color:black'>* trigger = <span class=SpellE>sim</span>-><span ! class=SpellE>createSolid</span>();<o:p></o:p></span></p> ! <p class=MsoNormal><span style='font-family:Courier;color:black'>trigger-><span ! class=SpellE>addShape</span>(<span class=SpellE>boxData</span>);<o:p></o:p></span></p> ! <p class=MsoNormal><span class=SpellE><span style='font-family:Courier; ! color:black'>sim</span></span><span style='font-family:Courier;color:black'>-><span ! class=SpellE>setupContactGroup</span>(15, false);<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> </td> *************** *** 372,388 **** </table> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:Courier;color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> --- 314,317 ---- *************** *** 393,410 **** <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> - <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>Volume - Sensors take a volume Solid and query the environment for Solids that - collide with the volume Solid.<span style='mso-spacerun:yes'> </span>The - resulting data structure contains a list of pointers to those Solids.<span - style='mso-spacerun:yes'> </span>Like Raycast Sensors, they can utilize - contact groups to limit the set of Solids that are collided with the volume - Solid; simply set the contact group of the volume Solid.<span - style='mso-spacerun:yes'> </span>They also are not updated every time step; - they must be queried manually.<span style='mso-spacerun:yes'> </span>The example - above shows how to simulate an explosion: it finds all the Solids within a 5 - unit radius from the volumes center and applies an outward force on each - object scaled linearly by its distance from the center.<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> </td> --- 322,342 ---- <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> + <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>The <span + class=SpellE>setupContactGroup</span> function sets up the interaction + between a contact group and every other contact group at once, making it easy + to create a trigger volume object that doesnt affect anything else physically + but can still generate collision events.<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> + <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>When + using the <span class=SpellE>RaycastSensor</span> and <span class=SpellE>VolumeSensor</span>, + keep in mind that contact groups can be used to make more efficient collision + queries.<span style='mso-spacerun:yes'> </span>Remember, the <span + class=SpellE>VolumeSensor</span> takes a pointer to a volume Solid and checks + which other Solids collide with that Solid.<span style='mso-spacerun:yes'> + </span>Simply use a contact group on the volume Solids Shape(s).<span + style='mso-spacerun:yes'> </span>The <span class=SpellE>RaycastSensor</span> + has an explicit contact group that can be setup to limit which other groups + it collides with.<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> </td> Index: tutorial4.html =================================================================== RCS file: /cvsroot/opal/web/tutorial4.html,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** tutorial4.html 28 Mar 2005 18:45:53 -0000 1.4 --- tutorial4.html 28 Mar 2005 20:07:54 -0000 1.5 *************** *** 25,44 **** <o:Author>Tyler Streeter</o:Author> <o:LastAuthor>Tyler Streeter</o:LastAuthor> ! <o:Revision>174</o:Revision> ! <o:TotalTime>310</o:TotalTime> <o:Created>2004-06-05T15:20:00Z</o:Created> ! <o:LastSaved>2005-03-28T18:44:00Z</o:LastSaved> ! <o:Pages>3</o:Pages> ! <o:Words>623</o:Words> ! <o:Characters>3552</o:Characters> <o:Company>none</o:Company> <o:Lines>29</o:Lines> <o:Paragraphs>8</o:Paragraphs> ! <o:CharactersWithSpaces>4167</o:CharactersWithSpaces> <o:Version>10.6714</o:Version> </o:DocumentProperties> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> ! <w:Zoom>80</w:Zoom> <w:SpellingState>Clean</w:SpellingState> <w:GrammarState>Clean</w:GrammarState> --- 25,44 ---- <o:Author>Tyler Streeter</o:Author> <o:LastAuthor>Tyler Streeter</o:LastAuthor> ! <o:Revision>175</o:Revision> ! <o:TotalTime>311</o:TotalTime> <o:Created>2004-06-05T15:20:00Z</o:Created> ! <o:LastSaved>2005-03-28T18:49:00Z</o:LastSaved> ! <o:Pages>1</o:Pages> ! <o:Words>622</o:Words> ! <o:Characters>3548</o:Characters> <o:Company>none</o:Company> <o:Lines>29</o:Lines> <o:Paragraphs>8</o:Paragraphs> ! <o:CharactersWithSpaces>4162</o:CharactersWithSpaces> <o:Version>10.6714</o:Version> </o:DocumentProperties> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> ! <w:Zoom>75</w:Zoom> <w:SpellingState>Clean</w:SpellingState> <w:GrammarState>Clean</w:GrammarState> *************** *** 112,116 **** </style> <![endif]--><!--[if gte mso 9]><xml> ! <o:shapedefaults v:ext="edit" spidmax="63490"> <o:colormenu v:ext="edit" fillcolor="white"/> </o:shapedefaults></xml><![endif]--><!--[if gte mso 9]><xml> --- 112,116 ---- </style> <![endif]--><!--[if gte mso 9]><xml> ! <o:shapedefaults v:ext="edit" spidmax="64514"> <o:colormenu v:ext="edit" fillcolor="white"/> </o:shapedefaults></xml><![endif]--><!--[if gte mso 9]><xml> *************** *** 195,199 **** <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span style='font-size:16.0pt;font-family:"Book Antiqua";color:black'>Attractor ! Motors<o:p></o:p></span></b></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>Now well make an Attractor Motor and initialize it:<o:p></o:p></span></p> --- 195,199 ---- <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span style='font-size:16.0pt;font-family:"Book Antiqua";color:black'>Attractor ! Motor<o:p></o:p></span></b></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>Now well make an Attractor Motor and initialize it:<o:p></o:p></span></p> *************** *** 247,251 **** <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span ! style='font-size:16.0pt;font-family:"Book Antiqua";color:black'>Geared Motors<o:p></o:p></span></b></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>Next, lets make a Geared Motor:<o:p></o:p></span></p> --- 247,251 ---- <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span ! style='font-size:16.0pt;font-family:"Book Antiqua";color:black'>Geared Motor<o:p></o:p></span></b></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>Next, lets make a Geared Motor:<o:p></o:p></span></p> *************** *** 306,310 **** <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span ! style='font-size:16.0pt;font-family:"Book Antiqua";color:black'>Servo Motors<o:p></o:p></span></b></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>The next Motor is a Servo Motor:<o:p></o:p></span></p> --- 306,310 ---- <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span ! style='font-size:16.0pt;font-family:"Book Antiqua";color:black'>Servo Motor<o:p></o:p></span></b></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>The next Motor is a Servo Motor:<o:p></o:p></span></p> *************** *** 364,377 **** <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>The Servo will continually use up to its max torque to try to achieve its desired ! angle.<span style='mso-spacerun:yes'> </span>Servos are extremely stable ! controllers, similar to PD or PID controllers.<span ! style='mso-spacerun:yes'> </span>They make automatic adjustments to keep ! from overshoot their target angle.<span style='mso-spacerun:yes'> ! </span>Servos are really good for robot simulations: the robot can simply set ! its desired Joint angles, and the Servo automatically provides enough torque ! to reach that angle without overshooting.<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span ! style='font-size:16.0pt;font-family:"Book Antiqua";color:black'>Spring Motors<o:p></o:p></span></b></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>A Spring Motor is a simple linear and/or <span class=SpellE>torsional</span> --- 364,377 ---- <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>The Servo will continually use up to its max torque to try to achieve its desired ! angle.<span style='mso-spacerun:yes'> </span>Servos are extremely stable controllers, ! similar to PD or PID controllers.<span style='mso-spacerun:yes'> </span>They ! make automatic adjustments to keep from overshoot their target angle.<span ! style='mso-spacerun:yes'> </span>Servos are really good for robot ! simulations: the robot can simply set its desired Joint angles, and the Servo ! automatically provides enough torque to reach that angle without ! overshooting.<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span ! style='font-size:16.0pt;font-family:"Book Antiqua";color:black'>Spring Motor<o:p></o:p></span></b></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>A Spring Motor is a simple linear and/or <span class=SpellE>torsional</span> *************** *** 447,453 **** <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>Springs ! are good for all kinds of things.<span style='mso-spacerun:yes'> </span>In ! an application with 3D graphics you can connect a Spring to your camera and ! have it smoothly move from one desired position/orientation to the next.<span style='mso-spacerun:yes'> </span>They are also great for picking up objects: simply attach the selected object to a Spring with its desired position --- 447,453 ---- <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>Springs ! are good for all kinds of things.<span style='mso-spacerun:yes'> </span>In an ! application with 3D graphics you can connect a Spring to your camera and have ! it smoothly move from one desired position/orientation to the next.<span style='mso-spacerun:yes'> </span>They are also great for picking up objects: simply attach the selected object to a Spring with its desired position *************** *** 456,460 **** <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span style='font-size:16.0pt;font-family:"Book Antiqua";color:black'>Thruster ! Motors<o:p></o:p></span></b></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>The final Motor is a Thruster:<o:p></o:p></span></p> --- 456,460 ---- <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span style='font-size:16.0pt;font-family:"Book Antiqua";color:black'>Thruster ! Motor<o:p></o:p></span></b></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>The final Motor is a Thruster:<o:p></o:p></span></p> Index: documentation.html =================================================================== RCS file: /cvsroot/opal/web/documentation.html,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** documentation.html 28 Mar 2005 18:45:44 -0000 1.13 --- documentation.html 28 Mar 2005 20:07:53 -0000 1.14 *************** *** 25,44 **** <o:Author>Tyler Streeter</o:Author> <o:LastAuthor>Tyler Streeter</o:LastAuthor> ! <o:Revision>106</o:Revision> <o:TotalTime>111</o:TotalTime> <o:Created>2004-06-05T15:20:00Z</o:Created> ! <o:LastSaved>2005-03-28T16:52:00Z</o:LastSaved> <o:Pages>1</o:Pages> ! <o:Words>297</o:Words> ! <o:Characters>1696</o:Characters> <o:Company>none</o:Company> <o:Lines>14</o:Lines> <o:Paragraphs>3</o:Paragraphs> ! <o:CharactersWithSpaces>1990</o:CharactersWithSpaces> <o:Version>10.6714</o:Version> </o:DocumentProperties> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> ! <w:Zoom>90</w:Zoom> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> --- 25,44 ---- <o:Author>Tyler Streeter</o:Author> <o:LastAuthor>Tyler Streeter</o:LastAuthor> ! <o:Revision>107</o:Revision> <o:TotalTime>111</o:TotalTime> <o:Created>2004-06-05T15:20:00Z</o:Created> ! <o:LastSaved>2005-03-28T18:49:00Z</o:LastSaved> <o:Pages>1</o:Pages> ! <o:Words>296</o:Words> ! <o:Characters>1693</o:Characters> <o:Company>none</o:Company> <o:Lines>14</o:Lines> <o:Paragraphs>3</o:Paragraphs> ! <o:CharactersWithSpaces>1986</o:CharactersWithSpaces> <o:Version>10.6714</o:Version> </o:DocumentProperties> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> ! <w:Zoom>75</w:Zoom> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> *************** *** 99,103 **** </style> <![endif]--><!--[if gte mso 9]><xml> ! <o:shapedefaults v:ext="edit" spidmax="61442"> <o:colormenu v:ext="edit" fillcolor="white"/> </o:shapedefaults></xml><![endif]--><!--[if gte mso 9]><xml> --- 99,103 ---- </style> <![endif]--><!--[if gte mso 9]><xml> ! <o:shapedefaults v:ext="edit" spidmax="62466"> <o:colormenu v:ext="edit" fillcolor="white"/> </o:shapedefaults></xml><![endif]--><!--[if gte mso 9]><xml> *************** *** 178,186 **** color:black'>Documentation<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> ! <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>If ! you are using OPAL for the first time, it is recommended that you read ! through the documentation in the following order: 1) overview, 2) tutorials, ! 3) API reference.<span style='mso-spacerun:yes'> </span>The overview and ! tutorials do not cover everything; they exist to help you learn to use OPAL quickly.<span style='mso-spacerun:yes'> </span>Consult the API reference for more details.<o:p></o:p></span></p> --- 178,186 ---- color:black'>Documentation<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> ! <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'>If you ! are using OPAL for the first time, it is recommended that you read through ! the documentation in the following order: 1) overview, 2) tutorials, 3) API ! reference.<span style='mso-spacerun:yes'> </span>The overview and tutorials ! do not cover everything; they exist to help you learn to use OPAL quickly.<span style='mso-spacerun:yes'> </span>Consult the API reference for more details.<o:p></o:p></span></p> *************** *** 221,229 **** <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-size:14.0pt;font-family:"Book Antiqua"; ! color:black'><a href="tutorial7.html">Tutorial 8</a></span><span style='font-family:"Book Antiqua";color:black'>: Contact Groups<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-size:14.0pt;font-family:"Book Antiqua"; ! color:black'><a href="tutorial8.html">Tutorial 9</a></span><span style='font-family:"Book Antiqua";color:black'>: Blueprints and OPAL XML Files<o:p></o:p></span></p> --- 221,229 ---- <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-size:14.0pt;font-family:"Book Antiqua"; ! color:black'><a href="tutorial8.html">Tutorial 8</a></span><span style='font-family:"Book Antiqua";color:black'>: Contact Groups<o:p></o:p></span></p> <p class=MsoNormal><span style='font-family:"Book Antiqua";color:black'><o:p> </o:p></span></p> <p class=MsoNormal><span style='font-size:14.0pt;font-family:"Book Antiqua"; ! color:black'><a href="tutorial9.html">Tutorial 9</a></span><span style='font-family:"Book Antiqua";color:black'>: Blueprints and OPAL XML Files<o:p></o:p></span></p> |