1 |
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "https://www.web3d.org/specifications/x3d-3.0.dtd">
|
3 | <X3D profile='Immersive' version='3.0' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='https://www.web3d.org/specifications/x3d-3.0.xsd'> |
4 | <head> |
5 | <meta name='title' content=' SatellitePairPrototype.x3d '/> |
6 | <meta name='description' content='A Pair of TRC-170s. A TRC-170 is a long-range SHF communication system. It operates in 3 modes. 1)Direct point-to-point link (< 30 miles). 2) Tropospheric shot (up to 100 or 150 miles, depending on system version). 3) Defraction shot over an a terrain feature or object in the path ( < 50 miles).'/> |
7 | <meta name='creator' content='Mike Hunsberger'/> |
8 | <meta name='created' content='8 May 2001'/> |
9 | <meta name='modified' content='20 October 2019'/> |
10 | <meta name='identifier' content=' https://www.web3d.org/x3d/content/examples/Savage/CommunicationsAndSensors/Satellite/SatellitePairPrototype.x3d '/> |
11 | <meta name='generator' content='X3D-Edit 3.2, https://www.web3d.org/x3d/tools/X3D-Edit'/> |
12 | <meta name='license' content='../../license.html'/> |
13 | </head> |
14 | <Scene> |
15 | <!-- ExternProtoDeclare definitions must be included verbatim --> |
16 | <ExternProtoDeclare name='BeamCone' appinfo='Produce wireframe or transparent beam cones. Typical uses include propeller/thruster water flow or line-of-sight sonar/radar/light beams. Negative range values invert base and apex at same relative location. Default: beam with apex at (0 0 0) and base of radius 1 in x-z plane at (1 0 0).' url=' "../../CommunicationsAndSensors/Beam/BeamConePrototype.x3d#BeamCone" "https://www.web3d.org/x3d/content/examples/Savage/CommunicationsAndSensors/Beam/BeamConePrototype.x3d#BeamCone" "../../CommunicationsAndSensors/Beam/BeamConePrototype.wrl#BeamCone" "https://www.web3d.org/x3d/content/examples/Savage/CommunicationsAndSensors/Beam/BeamConePrototype.wrl#BeamCone" '> |
17 |
<field name='contact' type='SFBool' accessType='inputOnly'
appinfo='(communications) is transmitted signal in contact with receiver or (sensor) is a target return detected?'/> |
18 |
<field name='range' type='SFFloat' accessType='inputOnly'
appinfo='distance in meters along x axis'/> |
19 |
<field name='defaultRange' type='SFFloat' accessType='initializeOnly'
appinfo='distance in meters used until eventIn range sent'/> |
20 |
<field name='wireframe' type='SFBool' accessType='initializeOnly'
appinfo='whether wireframe beam is drawn'/> |
21 |
<field name='solid' type='SFBool' accessType='initializeOnly'
appinfo='whether solid beam is drawn'/> |
22 |
<field name='beamHeightDegrees' type='SFFloat' accessType='initializeOnly'
appinfo='degrees across vertical y axis'/> |
23 |
<field name='beamWidthDegrees' type='SFFloat' accessType='initializeOnly'
appinfo='degrees across horizontal z axis'/> |
24 |
<field name='contactColor' type='SFColor' accessType='initializeOnly'
appinfo='rendering color when contact=true'/> |
25 |
<field name='noContactColor' type='SFColor' accessType='initializeOnly'
appinfo='rendering color when contact=false'/> |
26 |
<field name='transparency' type='SFFloat' accessType='inputOutput'
appinfo='1 = fully transparent wireframe only'/> |
27 |
<field name='name' type='SFString' accessType='initializeOnly'
appinfo='BeamCone name aids in node identification and tracing'/> |
28 |
<field name='traceEnabled' type='SFBool' accessType='initializeOnly'
appinfo='flag to turn on Script tracing'/> |
29 | </ExternProtoDeclare> |
30 | <ProtoDeclare name='SatellitePair' appinfo='SatellitePair consists of two TRC170 dishes for long range (up to 100 mile) point-to-point communication. TRC170s can be used in 3 different settings. The first is a direct link of up to 30 miles. The second is a defraction setting over an obstruction in the path. The third is a tropospheric scatter shot of up to 100 miles in which the signal is bounced off the troposphere. This PROTO allows specification for the initial placement of each TSSR. It automatically calculates the correct angle to complete the link.'> |
31 | <ProtoInterface> |
32 | <field name='GroundLocation' type='SFVec3f' value='1 1 1' accessType='initializeOnly'/> |
33 | <field name='SatelliteLocation' type='SFVec3f' value='0 0 0' accessType='initializeOnly'/> |
34 | </ProtoInterface> |
35 | <ProtoBody> |
36 | <Group> |
37 | <Transform DEF='HighAboveXZTranslation'/> |
38 |
<!-- ROUTE information for GroundViewpoint node:
[from CalculateAngleScript.Ground_Viewpoint to position
]
[from CalculateAngleScript.Ground_ViewpointAngle to orientation
]
-->
<Viewpoint DEF='GroundViewpoint' description='Ground Station'/> |
39 |
<!-- ROUTE information for SatelliteViewpoint node:
[from CalculateAngleScript.Satellite_Viewpoint to position
]
[from CalculateAngleScript.Satellite_ViewpointAngle to orientation
]
-->
<Viewpoint DEF='SatelliteViewpoint' description='Satellite'/> |
40 | <Script DEF='TransmitScript'> |
41 | <field name='transState' type='SFInt32' accessType='inputOnly'/> |
42 | <field name='size' type='SFVec3f' accessType='outputOnly'/> |
<![CDATA[
ecmascript: function initialize () { size = new SFVec3f(100, 100, 100) ; Browser.println ('TransmitScript initialize() complete') ; } // function name matches eventIn variable name ('hour') // hourValue captures the new value of the ROUTE hour event // minutes is just the current field value function transState (newValue, timestamp) { transmitState = newValue ; if (transmitState == 3) { size = new SFVec3f(10, 10, 10) ; } else { size = new SFVec3f(100, 100, 100) ; } Browser.println ('size = ' + size) ; }
]]>
|
|
44 | </Script> |
45 | <Script DEF='TransmitScript2'> |
46 | <field name='transState' type='SFInt32' accessType='inputOnly'/> |
47 | <field name='size' type='SFVec3f' accessType='outputOnly'/> |
<![CDATA[
ecmascript: function initialize () { size = new SFVec3f(100, 100, 100) ; Browser.println ('TransmitScript initialize() complete') ; } // function name matches eventIn variable name ('hour') // hourValue captures the new value of the ROUTE hour event // minutes is just the current field value function transState (newValue, timestamp) { transmitState = newValue ; if (transmitState == 3) { size = new SFVec3f(10, 10, 10) ; } else { size = new SFVec3f(100, 100, 100) ; } Browser.println ('size = ' + size) ; }
]]>
|
|
49 | </Script> |
50 | <LOD range='200000'> |
51 | <!-- TRC 1 Two Transforms. One in the XZ plane, the second in the XY plane. Inlines for the TRC body, stand, and the dome pattern. --> |
52 |
<!-- ROUTE information for GROUND_TRANSFORM node:
[from CalculateAngleScript.Ground_XZangle to rotation
]
-->
<Transform DEF='GROUND_TRANSFORM' translation='-2 0 0'> |
53 | <IS> |
54 | <connect nodeField='translation' protoField='GroundLocation'/> |
55 | </IS> |
56 |
<!-- ROUTE information for Ground_XY_TRANSFORM node:
[from CalculateAngleScript.Ground_XYangle to rotation
]
-->
<Transform DEF='Ground_XY_TRANSFORM' translation='1 5 0'> |
57 | <Inline DEF='GroundBody' url=' "SatelliteDish.x3d" "../../CommunicationsAndSensors/Satellite/SatelliteDish.x3d" "https://www.web3d.org/x3d/content/examples/Savage/CommunicationsAndSensors/Satellite/SatelliteDish.x3d" "../../CommunicationsAndSensors/Satellite/SatelliteDish.wrl" "SatelliteDish.wrl" "https://www.web3d.org/x3d/content/examples/Savage/CommunicationsAndSensors/Satellite/SatelliteDish.wrl" '/> |
58 | <Transform DEF='GroundCone' translation='2 0 0'> |
59 | <Group> |
60 |
<!-- ROUTE information for GROUND_BEAMCONE node:
[from CalculateAngleScript.Ground_beamLength to range
]
[from CalculateAngleScript.LinkEstablished to contact
]
-->
<ProtoInstance name='BeamCone' DEF='GROUND_BEAMCONE'> |
61 | <fieldValue name='defaultRange' value='10'/> |
62 | <fieldValue name='beamHeightDegrees' value='5'/> |
63 | <fieldValue name='beamWidthDegrees' value='5'/> |
64 | <fieldValue name='transparency' value='0.2'/> |
65 | <fieldValue name='wireframe' value='true'/> |
66 | <fieldValue name='solid' value='true'/> |
67 | <fieldValue name='noContactColor' value='.8 .1 .1'/> |
68 | <fieldValue name='contactColor' value='.3 .5 .5'/> |
69 | </ProtoInstance> |
70 | </Group> |
71 | </Transform> |
72 | </Transform> |
73 | <Transform> |
74 | <Inline DEF='GroundStand' url=' "SatelliteTripod.x3d" "../../CommunicationsAndSensors/Satellite/SatelliteTripod.x3d" "https://www.web3d.org/x3d/content/examples/Savage/CommunicationsAndSensors/Satellite/SatelliteTripod.x3d" "../../CommunicationsAndSensors/Satellite/SatelliteTripod.wrl" "SatelliteTripod.wrl" "https://www.web3d.org/x3d/content/examples/Savage/CommunicationsAndSensors/Satellite/SatelliteTripod.wrl" '/> |
75 | <LOD range='500'> |
76 | <Transform> |
77 | <Viewpoint description='Ground Station Side View' position='0 5 40'/> |
78 | </Transform> |
79 | <WorldInfo info='"null node for no rendering when distant"'/> |
80 | </LOD> |
81 | </Transform> |
82 | </Transform> |
83 | <WorldInfo info='"null node for no rendering when distant"'/> |
84 | </LOD> |
85 | <LOD range='200000'> |
86 | <!-- TRC 2 Two Transforms. One in the XZ plane, the second in the XY plane. Inlines for the TRC body, stand, and the dome pattern. --> |
87 |
<!-- ROUTE information for Satellite_TRANSFORM node:
[from CalculateAngleScript.Satellite_XZangle to rotation
]
-->
<Transform DEF='Satellite_TRANSFORM' translation='-2 0 0'> |
88 | <IS> |
89 | <connect nodeField='translation' protoField='SatelliteLocation'/> |
90 | </IS> |
91 | <Transform scale='5 5 5'> |
92 | <Inline url=' "SatelliteBody.x3d" "../../CommunicationsAndSensors/Satellite/SatelliteBody.x3d" "https://www.web3d.org/x3d/content/examples/Savage/CommunicationsAndSensors/Satellite/SatelliteBody.x3d" "../../CommunicationsAndSensors/Satellite/SatelliteBody.wrl" "SatelliteBody.wrl" "https://www.web3d.org/x3d/content/examples/Savage/CommunicationsAndSensors/Satellite/SatelliteBody.wrl" '/> |
93 | </Transform> |
94 |
<!-- ROUTE information for Satellite_XY_TRANSFORM node:
[from CalculateAngleScript.Satellite_XYangle to rotation
]
-->
<Transform DEF='Satellite_XY_TRANSFORM' translation='1 5 0'> |
95 | <Transform DEF='SatelliteCone' translation='0 -10 0'> |
96 | <Group> |
97 |
<!-- ROUTE information for Satellite_BEAMCONE node:
[from CalculateAngleScript.LinkEstablished to contact
]
-->
<ProtoInstance name='BeamCone' DEF='Satellite_BEAMCONE'> |
98 | <fieldValue name='defaultRange' value='10'/> |
99 | <fieldValue name='beamHeightDegrees' value='60'/> |
100 | <fieldValue name='beamWidthDegrees' value='60'/> |
101 | <fieldValue name='transparency' value='0.2'/> |
102 | <fieldValue name='wireframe' value='true'/> |
103 | <fieldValue name='solid' value='true'/> |
104 | <fieldValue name='noContactColor' value='.8 .1 .1'/> |
105 | <fieldValue name='contactColor' value='.3 .5 .5'/> |
106 | </ProtoInstance> |
107 | </Group> |
108 | </Transform> |
109 | </Transform> |
110 | <Transform> |
111 | <LOD range='500'> |
112 | <Viewpoint description='Satellite Side View' position='0 5 40'/> |
113 | <WorldInfo info='"null node"'/> |
114 | </LOD> |
115 | </Transform> |
116 | </Transform> |
117 | <WorldInfo info='"null node"'/> |
118 | </LOD> |
119 |
<!-- ROUTE information for CalculateAngleScript node:
[from Ground_XZangle to GROUND_TRANSFORM.rotation
]
[from Satellite_XZangle to Satellite_TRANSFORM.rotation
]
[from Ground_beamLength to GROUND_BEAMCONE.range
]
[from Ground_XYangle to Ground_XY_TRANSFORM.rotation
]
[from Satellite_XYangle to Satellite_XY_TRANSFORM.rotation
]
[from LinkEstablished to GROUND_BEAMCONE.contact
]
[from LinkEstablished to Satellite_BEAMCONE.contact
]
[from Ground_Viewpoint to GroundViewpoint.position
]
[from Satellite_Viewpoint to SatelliteViewpoint.position
]
[from Ground_ViewpointAngle to GroundViewpoint.orientation
]
[from Satellite_ViewpointAngle to SatelliteViewpoint.orientation
]
-->
<Script DEF='CalculateAngleScript'> |
120 | <field name='GroundLocation' type='SFVec3f' accessType='initializeOnly'/> |
121 | <field name='SatelliteLocation' type='SFVec3f' accessType='initializeOnly'/> |
122 | <field name='Ground_XZangle' type='SFRotation' accessType='outputOnly'/> |
123 | <field name='Satellite_XZangle' type='SFRotation' accessType='outputOnly'/> |
124 | <field name='beamScale' type='SFVec3f' accessType='outputOnly'/> |
125 | <field name='Ground_beamLength' type='SFFloat' accessType='outputOnly'/> |
126 | <field name='Satellite_beamLength' type='SFFloat' accessType='outputOnly'/> |
127 | <field name='Ground_XYangle' type='SFRotation' accessType='outputOnly'/> |
128 | <field name='Satellite_XYangle' type='SFRotation' accessType='outputOnly'/> |
129 | <field name='LinkEstablished' type='SFBool' accessType='outputOnly'/> |
130 | <field name='Ground_Viewpoint' type='SFVec3f' accessType='outputOnly'/> |
131 | <field name='Satellite_Viewpoint' type='SFVec3f' accessType='outputOnly'/> |
132 | <field name='Ground_ViewpointAngle' type='SFRotation' accessType='outputOnly'/> |
133 | <field name='Satellite_ViewpointAngle' type='SFRotation' accessType='outputOnly'/> |
134 | <IS> |
135 | <connect nodeField='GroundLocation' protoField='GroundLocation'/> |
136 | <connect nodeField='SatelliteLocation' protoField='SatelliteLocation'/> |
137 | </IS> |
<![CDATA[
ecmascript: function initialize () { Browser.println ('GroundStation =' + GroundLocation) ; Browser.println ('Satellite =' + SatelliteLocation) ; Browser.println ('TransmitScript initialize() complete') ; active = true ; Ground_XZangle = new SFRotation(0, 1, 0, 0) ; Satellite_XZangle = new SFRotation(0, 1, 0, 0) ; Ground_XYangle = new SFRotation(0, 0, 1, 0) ; Satellite_XYangle = new SFRotation(0, 0, 1, 0) ; XZangle = new SFRotation(0, 1, 0, 0) ; XYangle = new SFRotation(0, 0, 1, 0) ; Ground_ViewpointAngle = new SFRotation(0, 1, 0, 0) ; Satellite_ViewpointAngle = new SFRotation(1, 0, 0, 0) ; HighAboveViewpointAngle = new SFRotation(1, 0, 0, 0) ; HighAboveTranslationAngle = new SFRotation(0, 1, 0, 0) ; beamScale = new SFVec3f ( ) ; center = new SFVec3f ( ) ; Ground_Viewpoint = new SFVec3f ( ) ; Satellite_Viewpoint = new SFVec3f ( ) ; HighAboveViewpoint = new SFVec3f ( ) ; LinkEstablished = true; compute(active) ; } function compute ( ) { computeDistance( ) ; computeXZangle( ); computeXYangle( ) ; Ground_Viewpoint[0] = GroundLocation[0] + Math.sin(Ground_XZangle[3] - 1.57)*40; Ground_Viewpoint[1] = GroundLocation[1] + 10; Ground_Viewpoint[2] = GroundLocation[2] +Math.cos(Ground_XZangle[3] - 1.57)*40; print ('Ground_Viewpoint '+ Ground_Viewpoint) ; Ground_ViewpointAngle[3] = Ground_XZangle[3] - 1.57 ; Satellite_Viewpoint[0] = SatelliteLocation[0] ; Satellite_Viewpoint[1] = SatelliteLocation[1] + 200; Satellite_Viewpoint[2] = SatelliteLocation[2] ; Satellite_ViewpointAngle[3] = -1.57 ; print ('Satellite_Viewpoint '+ Satellite_Viewpoint) ; } function computeDistance( ) { Browser.println ('Ground =' + GroundLocation) ; Browser.println ('Satellite =' + SatelliteLocation) ; deltaX = (SatelliteLocation[0] - GroundLocation[0]) ; deltaY = (SatelliteLocation[1] - GroundLocation[1]) ; deltaZ = (SatelliteLocation[2] - GroundLocation[2]) ; distanceSquared = deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ ; Browser.println ('Distance Squared =' + distanceSquared) ; distance = Math.sqrt(distanceSquared) ; Browser.println ('Distance =' + distance) ; beamScale[0] = distance/10; beamScale[1] = 10; beamScale[2] = 10; Browser.println ('BeamScale =' + beamScale) ; Ground_beamLength = distance -2; Satellite_beamLength = 2000; if (distance > 60000/.6*1000) { LinkEstablished = false; Ground_beamLength = 5000/.6 ; Satellite_beamLength = 5000/.6 ; } } function computeXZangle( ) { if (deltaZ == 0) { deltaZ = .00000001 ; } angle = Math.atan(deltaX/deltaZ) ; if (deltaZ < 0) { Ground_XZangle[3] = angle + Math.PI/2; } else { Ground_XZangle[3] = angle - Math.PI/2; } Satellite_XZangle[3] = 1.57; Browser.println ('Angle =' + Ground_XZangle[3]) ; Browser.println ('Angle2 =' + Satellite_XZangle[3]) ; } function computeXYangle( ) { angle = Math.asin(deltaY/distance) ; Ground_XYangle[3] = angle ; Satellite_XYangle[3] = -1.57; Browser.println ('AngleXY =' + Ground_XYangle[3]) ; Browser.println ('Angle2XY =' + Satellite_XYangle[3]) ; }
]]>
|
|
139 | </Script> |
140 | </Group> |
141 | < ROUTE fromNode='CalculateAngleScript' fromField='Ground_XZangle' toNode='GROUND_TRANSFORM' toField='rotation'/> |
142 | < ROUTE fromNode='CalculateAngleScript' fromField='Satellite_XZangle' toNode='Satellite_TRANSFORM' toField='rotation'/> |
143 | < ROUTE fromNode='CalculateAngleScript' fromField='Ground_beamLength' toNode='GROUND_BEAMCONE' toField='range'/> |
144 | < ROUTE fromNode='CalculateAngleScript' fromField='Ground_XYangle' toNode='Ground_XY_TRANSFORM' toField='rotation'/> |
145 | < ROUTE fromNode='CalculateAngleScript' fromField='Satellite_XYangle' toNode='Satellite_XY_TRANSFORM' toField='rotation'/> |
146 | < ROUTE fromNode='CalculateAngleScript' fromField='LinkEstablished' toNode='GROUND_BEAMCONE' toField='contact'/> |
147 | < ROUTE fromNode='CalculateAngleScript' fromField='LinkEstablished' toNode='Satellite_BEAMCONE' toField='contact'/> |
148 | < ROUTE fromNode='CalculateAngleScript' fromField='Ground_Viewpoint' toNode='GroundViewpoint' toField='position'/> |
149 | < ROUTE fromNode='CalculateAngleScript' fromField='Satellite_Viewpoint' toNode='SatelliteViewpoint' toField='position'/> |
150 | < ROUTE fromNode='CalculateAngleScript' fromField='Ground_ViewpointAngle' toNode='GroundViewpoint' toField='orientation'/> |
151 | < ROUTE fromNode='CalculateAngleScript' fromField='Satellite_ViewpointAngle' toNode='SatelliteViewpoint' toField='orientation'/> |
152 | </ProtoBody> |
153 | </ProtoDeclare> |
154 | <!-- ==================== --> |
155 | <WorldInfo info='"Authors: Mike Hunsberger" "Revised: 30 April 2001" "Purpose: Pair of TSSRs" "Browser: CosmoPlayer"' title='AntennaWorld'/> |
156 | <Background groundAngle='1.57079' groundColor='1 0.8 0.6 0.6 0.4 0.2' skyAngle='0.2' skyColor='1 1 1 0.2 0.2 1'/> |
157 | <ProtoInstance name='SatellitePair'> |
158 | <fieldValue name='GroundLocation' value='0 0 0'/> |
159 | <fieldValue name='SatelliteLocation' value='-1020000 42000000 -22000000'/> |
160 | </ProtoInstance> |
161 | </Scene> |
162 | </X3D> |
Event Graph ROUTE Table entries with 11 ROUTE connections total, showing X3D event-model relationships for this scene.
Each row shows an event cascade that may occur during a single timestamp interval between frame renderings, as part of the X3D execution model.
This node has 11 outgoing ROUTEs, which is greater than $maxROUTEdepth=8 | |||||||
CalculateAngleScript
Script Ground_XZangle SFRotation |
GROUND_TRANSFORM
Transform rotation SFRotation |
||||||
CalculateAngleScript
Script Satellite_XZangle SFRotation |
Satellite_TRANSFORM
Transform rotation SFRotation |
||||||
CalculateAngleScript
Script Ground_beamLength SFFloat |
GROUND_BEAMCONE
ProtoInstance range SFFloat |
||||||
CalculateAngleScript
Script Ground_XYangle SFRotation |
Ground_XY_TRANSFORM
Transform rotation SFRotation |
||||||
CalculateAngleScript
Script Satellite_XYangle SFRotation |
Satellite_XY_TRANSFORM
Transform rotation SFRotation |
||||||
CalculateAngleScript
Script LinkEstablished SFBool |
GROUND_BEAMCONE
ProtoInstance contact SFBool |
||||||
CalculateAngleScript
Script LinkEstablished SFBool |
Satellite_BEAMCONE
ProtoInstance contact SFBool |
||||||
CalculateAngleScript
Script Ground_Viewpoint SFVec3f |
GroundViewpoint
Viewpoint position SFVec3f |
||||||
TransmitScript
Script |
No direct ROUTE connection found for events to/from this node. This Script has no direct access to other nodes. |
TransmitScript2
Script |
No direct ROUTE connection found for events to/from this node. This Script has no direct access to other nodes. |
line 157
ProtoInstance SatellitePair |
No direct ROUTE connection found for events to/from this node. This ProtoInstance contains SFNode/MFNode fieldValue declarations with direct access to other nodes, and thus has potential to produce run-time animation. |
GROUND_BEAMCONE
ProtoInstance BeamCone |
No direct ROUTE connection found for events to/from this node. This ProtoInstance contains SFNode/MFNode fieldValue declarations with direct access to other nodes, and thus has potential to produce run-time animation. |
Satellite_BEAMCONE
ProtoInstance BeamCone |
No direct ROUTE connection found for events to/from this node. This ProtoInstance contains SFNode/MFNode fieldValue declarations with direct access to other nodes, and thus has potential to produce run-time animation. |
<!--
Color-coding legend: X3D terminology
<X3dNode
DEF='idName' field='value'/>
matches XML terminology
<XmlElement
DEF='idName' attribute='value'/>
(Light-blue background: event-based behavior node or statement)
(Grey background inside box: inserted documentation)
(Magenta background: X3D Extensibility)
<ProtoInstance name='ProtoName'>
<field
name='fieldName'/> </ProtoInstance>
-->
<!--
For additional help information about X3D scenes, please see X3D Tooltips, X3D Resources, and X3D Scene Authoring Hints.
-->