@prefix :        <https://www.web3d.org/x3d/content/examples/Basic/development/ViewpointGroupPrototype.ttl#> .
@prefix owl:     <http://www.w3.org/2002/07/owl#> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix schema:  <http://schema.org/> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix xsd:     <http://www.w3.org/2001/XMLSchema#> .
@prefix x3d:     <https://www.web3d.org/specifications/x3d-4.1.xsd#> .
@prefix x3do:    <https://www.web3d.org/specifications/X3dOntology4.1#> .

:X3D a owl:NamedIndividual, x3do:X3D ;
  x3do:hasHead :head ;
  x3do:hasScene :Scene ;
  x3do:profile 'Immersive' ;
  x3do:version '3.0' ;
  x3do:noNamespaceSchemaLocation 'https://www.web3d.org/specifications/x3d-3.0.xsd' .
:head a owl:NamedIndividual, x3do:head ;
  x3do:hasParent :X3D ;
  x3do:hasMeta :meta_1_1, :meta_1_2, :meta_1_3, :meta_1_4, :meta_1_5, :meta_1_6, :meta_1_7, :meta_1_8, :meta_1_9, :meta_1_10, :meta_1_11, :meta_1_12, :meta_1_13, :meta_1_14 .
:meta_1_1 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'ViewpointGroupPrototype.x3d' ;
  x3do:name 'title' .
:meta_1_2 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'ViewpointGroup contains Viewpoint and ViewpointGroup nodes, allowing nested lists and viewpoint scoping in viewpoint lists. This is a developmental example for potential specification improvement. It is needed because (a) currently specified rules for X3D/VRML node binding state that behavior of child Viewpoints beneath Switch/LOD/etc. is undefined, and (b) browser viewpoint list display behavior is undefined.' ;
  x3do:name 'description' .
:meta_1_3 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'Don Brutzman' ;
  x3do:name 'creator' .
:meta_1_4 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content '29 October 2003' ;
  x3do:name 'created' .
:meta_1_5 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content '20 October 2019' ;
  x3do:name 'modified' .
:meta_1_6 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'this prototype is for development purposes only, do not override native player support for ViewpointGroup' ;
  x3do:name 'warning' .
:meta_1_7 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'ViewpointListViewpointGroupProse.html' ;
  x3do:name 'reference' .
:meta_1_8 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'ViewpointGroupExample.x3d' ;
  x3do:name 'reference' .
:meta_1_9 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'https://www.web3d.org/specifications/X3Dv4/ISO-IEC19775-1v4-IS/Part01/components/navigation.html#Viewpoint' ;
  x3do:name 'reference' .
:meta_1_10 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'https://www.web3d.org/technicalinfo/specifications/vrml97/part1/nodesRef.html#Viewpoint' ;
  x3do:name 'reference' .
:meta_1_11 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'ViewpointGroup Viewpoint' ;
  x3do:name 'subject' .
:meta_1_12 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'https://www.web3d.org/x3d/content/examples/Basic/development/ViewpointGroupPrototype.x3d' ;
  x3do:name 'identifier' .
:meta_1_13 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'X3D-Edit 3.3, https://www.web3d.org/x3d/tools/X3D-Edit' ;
  x3do:name 'generator' .
:meta_1_14 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content '../license.html' ;
  x3do:name 'license' .
:meta dcterms:title "ViewpointGroupPrototype.x3d" .
:meta dcterms:description "ViewpointGroup contains Viewpoint and ViewpointGroup nodes, allowing nested lists and viewpoint scoping in viewpoint lists. This is a developmental example for potential specification improvement. It is needed because (a) currently specified rules for X3D/VRML node binding state that behavior of child Viewpoints beneath Switch/LOD/etc. is undefined, and (b) browser viewpoint list display behavior is undefined." .
:meta dcterms:creator "Don Brutzman" .
:meta dcterms:created "29 October 2003" .
:meta dcterms:modified "20 October 2019" .
:meta dcterms:warning "this prototype is for development purposes only, do not override native player support for ViewpointGroup" .
:meta dcterms:reference "ViewpointListViewpointGroupProse.html" .
:meta dcterms:reference "ViewpointGroupExample.x3d" .
:meta dcterms:reference "https://www.web3d.org/specifications/X3Dv4/ISO-IEC19775-1v4-IS/Part01/components/navigation.html#Viewpoint" .
:meta dcterms:reference "https://www.web3d.org/technicalinfo/specifications/vrml97/part1/nodesRef.html#Viewpoint" .
:meta dcterms:subject "ViewpointGroup Viewpoint" .
:meta dcterms:identifier "https://www.web3d.org/x3d/content/examples/Basic/development/ViewpointGroupPrototype.x3d" .
:meta dcterms:generator "X3D-Edit 3.3, https://www.web3d.org/x3d/tools/X3D-Edit" .
:meta dcterms:license "../license.html" .
:Scene a owl:NamedIndividual, x3do:Scene ;
  x3do:hasParent :X3D ;
  x3do:hasChildren :WorldInfo_2_1, :NavigationInfo_2_3, :Anchor_2_4, :Viewpoint_2_5, :Viewpoint_2_6 ;
  x3do:hasProtoDeclare :ProtoDeclare_2_2 .
:WorldInfo_2_1 a owl:NamedIndividual, x3do:WorldInfo ;
  x3do:hasParent :Scene ;
  x3do:title 'ViewpointGroupPrototype.x3d' .
:ProtoDeclare_2_2 a owl:NamedIndividual, x3do:ProtoDeclare ;
  x3do:hasParent :Scene ;
  x3do:hasProtoInterface :ProtoInterface_2_2_1 ;
  x3do:hasProtoBody :ProtoBody_2_2_2 ;
  x3do:appinfo 'warning: developmental prototype for X3D v3.2 node do not override native support!' ;
  x3do:name 'ViewpointGroup' .
:ProtoInterface_2_2_1 a owl:NamedIndividual, x3do:ProtoInterface ;
  x3do:hasParent :ProtoDeclare_2_2 ;
  x3do:hasField :field_2_2_1_1, :field_2_2_1_2, :field_2_2_1_3, :field_2_2_1_4, :field_2_2_1_5, :field_2_2_1_6, :field_2_2_1_7 .
:field_2_2_1_1 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_2_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo '[Viewpoint | ViewpointGroup] only' ;
  x3do:name 'children' ;
  x3do:type 'MFNode' .
:field_2_2_1_2 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_2_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo 'Text description or navigation hint to be displayed for this ViewpointGroup.' ;
  x3do:name 'description' ;
  x3do:type 'SFString' .
:field_2_2_1_3 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_2_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo 'Whether this ViewpointGroup description is displayed in current viewpoint list.' ;
  x3do:name 'displayed' ;
  x3do:type 'SFBool' ;
  x3do:value true .
:field_2_2_1_4 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_2_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo 'Position offset from origin of local coordinate system.' ;
  x3do:name 'center' ;
  x3do:type 'SFVec3f' ;
  x3do:value ( 0 0 0 ) .
:field_2_2_1_5 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_2_1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:appinfo '[0..infinity) Radius in meters of Proximity box within which the ViewpointGroup is usable and displayed on the viewpoint list.' ;
  x3do:name 'radius' ;
  x3do:type 'SFFloat' ;
  x3do:value 10 .
:field_2_2_1_6 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_2_1 ;
  x3do:accessType 'inputOnly' ;
  x3do:appinfo '[0..infinity) Radius in meters of Proximity box within which the ViewpointGroup is usable and displayed on the viewpoint list.' ;
  x3do:name 'set_radius' ;
  x3do:type 'SFFloat' .
:field_2_2_1_7 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_2_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo 'Whether viewpoint needs to retain (true) or rezero (false) any prior user navigation offsets from defined viewpoint position orientation.' ;
  x3do:name 'retainUserOffsets' ;
  x3do:type 'SFBool' ;
  x3do:value true .
:ProtoBody_2_2_2 a owl:NamedIndividual, x3do:ProtoBody ;
  x3do:hasParent :ProtoDeclare_2_2 ;
  x3do:hasChildren :Group_2_2_2_1 .
:Group_2_2_2_1 a owl:NamedIndividual, x3do:Group ;
  x3do:hasParent :ProtoBody_2_2_2 ;
  x3do:hasChildren :ProximityZone, :ViewpointsSwitch, :HoldExposedFields, :UnbindingControlScript ;
  x3do:hasROUTE :ROUTE_2_2_2_1_5 .
:ProximityZone a owl:NamedIndividual, x3do:ProximitySensor ;
  x3do:hasParent :Group_2_2_2_1 ;
  x3do:hasIS :IS_2_2_2_1_1_1 ;
  x3do:DEF 'ProximityZone' ;
  x3do:size ( 20 20 20 ) .
:IS_2_2_2_1_1_1 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :ProximityZone ;
  x3do:hasConnect :connect_2_2_2_1_1_1_1 .
:connect_2_2_2_1_1_1_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_2_2_1_1_1 ;
  x3do:nodeField 'center' ;
  x3do:protoField 'center' .
:ViewpointsSwitch a owl:NamedIndividual, x3do:Switch ;
  x3do:hasParent :Group_2_2_2_1 ;
  x3do:hasChildren :Group_2_2_2_1_2_1 ;
  x3do:DEF 'ViewpointsSwitch' ;
  x3do:whichChoice 0 .
:Group_2_2_2_1_2_1 a owl:NamedIndividual, x3do:Group ;
  x3do:hasParent :ViewpointsSwitch ;
  x3do:hasIS :IS_2_2_2_1_2_1_1 .
:IS_2_2_2_1_2_1_1 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :Group_2_2_2_1_2_1 ;
  x3do:hasConnect :connect_2_2_2_1_2_1_1_1 .
:connect_2_2_2_1_2_1_1_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_2_2_1_2_1_1 ;
  x3do:nodeField 'children' ;
  x3do:protoField 'children' .
:HoldExposedFields a owl:NamedIndividual, x3do:Switch ;
  x3do:hasParent :Group_2_2_2_1 ;
  x3do:hasChildren :DescriptionHolder, :DisplayedHolder ;
  x3do:DEF 'HoldExposedFields' ;
  x3do:whichChoice -1 .
:DescriptionHolder a owl:NamedIndividual, x3do:Anchor ;
  x3do:hasParent :HoldExposedFields ;
  x3do:hasIS :IS_2_2_2_1_3_1_1 ;
  x3do:DEF 'DescriptionHolder' .
:IS_2_2_2_1_3_1_1 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :DescriptionHolder ;
  x3do:hasConnect :connect_2_2_2_1_3_1_1_1 .
:connect_2_2_2_1_3_1_1_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_2_2_1_3_1_1 ;
  x3do:nodeField 'description' ;
  x3do:protoField 'description' .
:DisplayedHolder a owl:NamedIndividual, x3do:ProximitySensor ;
  x3do:hasParent :HoldExposedFields ;
  x3do:hasIS :IS_2_2_2_1_3_2_1 ;
  x3do:DEF 'DisplayedHolder' .
:IS_2_2_2_1_3_2_1 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :DisplayedHolder ;
  x3do:hasConnect :connect_2_2_2_1_3_2_1_1 .
:connect_2_2_2_1_3_2_1_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_2_2_1_3_2_1 ;
  x3do:nodeField 'enabled' ;
  x3do:protoField 'displayed' .
:UnbindingControlScript a owl:NamedIndividual, x3do:Script ;
  x3do:hasParent :Group_2_2_2_1 ;
  x3do:hasField :field_2_2_2_1_4_1, :field_2_2_2_1_4_2, :field_2_2_2_1_4_3, :field_2_2_2_1_4_4, :field_2_2_2_1_4_5, :field_2_2_2_1_4_6, :field_2_2_2_1_4_7, :field_2_2_2_1_4_8, :field_2_2_2_1_4_9, :field_2_2_2_1_4_10 ;
  x3do:hasIS :IS_2_2_2_1_4_11 ;
  x3do:DEF 'UnbindingControlScript' ;
  x3do:directOutput true ;
  x3do:sourceCode """
ecmascript:

function initialize ()
{
	// since Viewpoints remain on binding stack as before,
	// no initialization action is necessary when implemented natively.
	description = descriptionHolder.description;
	displayed = displayedHolder.enabled;
	tracePrint ('displayed=' + displayed);
	if (!displayed) viewpointsSwitch.whichChoice = -1;
	set_radius (radius);

	// typecheck valid children nodes:
	tracePrint ('viewpointsSwitch.choice.length=' + viewpointsSwitch.choice.length);
	if (viewpointsSwitch.choice.length >= 1)
		for (i=0; i >= viewpointsSwitch.choice.length; i)
		{
			// how to check type?
			// if (viewpointsSwitch.choice[i].____ etc.)
			// once type checked, warn if Viewpoint position outside proximity box size
		}
	tracePrint ('... initialize() complete');
}
function isActive (activeValue)
{
	// Most likely, viewpoint list actions will be controlled by browser.

	// If viewpoint list is exposed via SAI, could do things here
	// such as setting ViewpointGroup.description as browser label.

	// Current action:  switch child Viewpoints in/out of scope.
	tracePrint ('activeValue=' + activeValue);

	tracePrint ('displayed=' + displayed);
	if (!displayed) return;

	if (activeValue) viewpointsSwitch.whichChoice =  0;
	else             viewpointsSwitch.whichChoice = -1;

	tracePrint ('viewpointsSwitch.whichChoice=' + viewpointsSwitch.whichChoice);
}
function set_radius (value, timestamp)
{
	radius = value;
	ProximityZone.size.x = 2 * radius;
	ProximityZone.size.y = 2 * radius;
	ProximityZone.size.z = 2 * radius;
	tracePrint ('set_radius (' + value + '), radius=' + radius + ', ProximityZone.size=' + ProximityZone.size);
}

function tracePrint(outputString)
{
	if (traceEnabled) Browser.println ('[ViewpointGroup' + description + ']' + outputString);
}
function alwaysPrint(outputString)
{
	Browser.println ('[ViewpointGroup' + description + ']' + outputString);
}
""" .
:field_2_2_2_1_4_1 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :UnbindingControlScript ;
  x3do:accessType 'inputOnly' ;
  x3do:name 'isActive' ;
  x3do:type 'SFBool' .
:field_2_2_2_1_4_2 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :UnbindingControlScript ;
  x3do:hasChildren :ProximityZone-USE-1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'ProximityZone' ;
  x3do:type 'SFNode' .
:ProximityZone-USE-1 a owl:NamedIndividual, x3do:ProximitySensor ;
  x3do:hasParent :field_2_2_2_1_4_2 ;
  owl:sameAs :ProximityZone . # DEF matching this USE
:field_2_2_2_1_4_3 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :UnbindingControlScript ;
  x3do:accessType 'initializeOnly' ;
  x3do:appinfo '[0..infinity) Radius in meters of Proximity box within which the ViewpointGroup is usable and displayed on the viewpoint list.' ;
  x3do:name 'radius' ;
  x3do:type 'SFFloat' .
:field_2_2_2_1_4_4 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :UnbindingControlScript ;
  x3do:accessType 'inputOnly' ;
  x3do:appinfo '[0..infinity) Radius in meters of Proximity box within which the ViewpointGroup is usable and displayed on the viewpoint list.' ;
  x3do:name 'set_radius' ;
  x3do:type 'SFFloat' .
:field_2_2_2_1_4_5 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :UnbindingControlScript ;
  x3do:hasChildren :ViewpointsSwitch-USE-1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'viewpointsSwitch' ;
  x3do:type 'SFNode' .
:ViewpointsSwitch-USE-1 a owl:NamedIndividual, x3do:Switch ;
  x3do:hasParent :field_2_2_2_1_4_5 ;
  owl:sameAs :ViewpointsSwitch . # DEF matching this USE
:field_2_2_2_1_4_6 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :UnbindingControlScript ;
  x3do:hasChildren :DescriptionHolder-USE-1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'descriptionHolder' ;
  x3do:type 'SFNode' .
:DescriptionHolder-USE-1 a owl:NamedIndividual, x3do:Anchor ;
  x3do:hasParent :field_2_2_2_1_4_6 ;
  owl:sameAs :DescriptionHolder . # DEF matching this USE
:field_2_2_2_1_4_7 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :UnbindingControlScript ;
  x3do:hasChildren :DisplayedHolder-USE-1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'displayedHolder' ;
  x3do:type 'SFNode' .
:DisplayedHolder-USE-1 a owl:NamedIndividual, x3do:ProximitySensor ;
  x3do:hasParent :field_2_2_2_1_4_7 ;
  owl:sameAs :DisplayedHolder . # DEF matching this USE
:field_2_2_2_1_4_8 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :UnbindingControlScript ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'description' ;
  x3do:type 'SFString' .
:field_2_2_2_1_4_9 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :UnbindingControlScript ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'displayed' ;
  x3do:type 'SFBool' ;
  x3do:value true .
:field_2_2_2_1_4_10 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :UnbindingControlScript ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'traceEnabled' ;
  x3do:type 'SFBool' ;
  x3do:value false .
:IS_2_2_2_1_4_11 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :UnbindingControlScript ;
  x3do:hasConnect :connect_2_2_2_1_4_11_1, :connect_2_2_2_1_4_11_2 .
:connect_2_2_2_1_4_11_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_2_2_1_4_11 ;
  x3do:nodeField 'radius' ;
  x3do:protoField 'radius' .
:connect_2_2_2_1_4_11_2 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_2_2_1_4_11 ;
  x3do:nodeField 'set_radius' ;
  x3do:protoField 'set_radius' .
:ROUTE_2_2_2_1_5 a owl:NamedIndividual, x3do:ROUTE ;
  x3do:hasParent :Group_2_2_2_1 ;
  x3do:fromField 'isActive' ;
  x3do:fromNode 'ProximityZone' ;
  x3do:toField 'isActive' ;
  x3do:toNode 'UnbindingControlScript' .
:NavigationInfo_2_3 a owl:NamedIndividual, x3do:NavigationInfo ;
  x3do:hasParent :Scene ;
  x3do:type '"FLY" "ANY"' .
:Anchor_2_4 a owl:NamedIndividual, x3do:Anchor ;
  x3do:hasParent :Scene ;
  x3do:hasChildren :Shape_2_4_1 ;
  x3do:description 'ViewpointGroupExample' ;
  x3do:parameter '"target=_blank"' ;
  x3do:url '"ViewpointGroupExample.x3d" "https://www.web3d.org/x3d/content/examples/Basic/development/ViewpointGroupExample.x3d" "ViewpointGroupExample.wrl" "https://www.web3d.org/x3d/content/examples/Basic/development/ViewpointGroupExample.wrl"' .
:Shape_2_4_1 a owl:NamedIndividual, x3do:Shape ;
  x3do:hasParent :Anchor_2_4 ;
  x3do:hasGeometry :Text_2_4_1_1 ;
  x3do:hasAppearance :Appearance_2_4_1_2 .
:Text_2_4_1_1 a owl:NamedIndividual, x3do:Text ;
  x3do:hasParent :Shape_2_4_1 ;
  x3do:hasFontStyle :FontStyle_2_4_1_1_1 ;
  x3do:string '"ViewpointGroupPrototype" "defines a prototype" "" "Click on this text to see" "ViewpointGroupExample scene"' .
:FontStyle_2_4_1_1_1 a owl:NamedIndividual, x3do:FontStyle ;
  x3do:hasParent :Text_2_4_1_1 ;
  x3do:justify '"MIDDLE" "MIDDLE"' ;
  x3do:size 0.5 .
:Appearance_2_4_1_2 a owl:NamedIndividual, x3do:Appearance ;
  x3do:hasParent :Shape_2_4_1 ;
  x3do:hasMaterial :Material_2_4_1_2_1 .
:Material_2_4_1_2_1 a owl:NamedIndividual, x3do:Material ;
  x3do:hasParent :Appearance_2_4_1_2 ;
  x3do:diffuseColor ( 1 1 0.2 ) .
:Viewpoint_2_5 a owl:NamedIndividual, x3do:Viewpoint ;
  x3do:hasParent :Scene ;
  x3do:description 'inside scope: ViewpointGroup' ;
  x3do:position ( 0 0 5 ) .
:Viewpoint_2_6 a owl:NamedIndividual, x3do:Viewpoint ;
  x3do:hasParent :Scene ;
  x3do:description 'outside scope: ViewpointGroup' ;
  x3do:position ( 0 0 12 ) .
