| 1 |
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.2//EN" "https://www.web3d.org/specifications/x3d-3.2.dtd">
|
| 3 | <X3D profile='Immersive' version='3.2' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='https://www.web3d.org/specifications/x3d-3.2.xsd'> |
| 4 | <head> |
| 5 | <meta name='title' content=' CameraPrototypes.x3d '/> |
| 6 | <meta name='description' content='Camera, CameraShot and CameraMovement prototypes that demonstrate storyboard capabilities and precise camera operation. This is a developmental effort for potential X3D Specification improvement.'/> |
| 7 | <meta name='creator' content='Don Brutzman and Jeff Weekley'/> |
| 8 | <meta name='created' content='16 March 2009'/> |
| 9 | <meta name='modified' content='20 January 2020'/> |
| 10 | <meta name=' TODO ' content=' Schematron rules, backed up by initialize() checks '/> |
| 11 | <meta name='reference' content=' BeyondViewpointCameraNodesWeb3D2009.pdf '/> |
| 12 | <meta name='reference' content=' https://www.web3d.org/x3d/specifications/ISO-IEC-FDIS-19775-1.2-X3D-AbstractSpecification/Part01/components/navigation.html '/> |
| 13 | <meta name='subject' content='Camera nodes for Viewpoint navigation control'/> |
| 14 | <meta name='reference' content=' CameraExamples.x3d '/> |
| 15 | <meta name='identifier' content=' https://www.web3d.org/x3d/content/examples/Basic/development/CameraPrototypes.x3d '/> |
| 16 | <meta name='reference' content=' http://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/content/examples/Basic/development/CameraPrototypes.x3d '/> |
| 17 | <meta name='generator' content='X3D-Edit 3.3, https://www.web3d.org/x3d/tools/X3D-Edit'/> |
| 18 | <meta name='license' content='../license.html'/> |
| 19 | </head> |
| 20 | <Scene> |
| 21 | <!-- =============== Camera ============== --> |
| 22 | <WorldInfo title='CameraPrototypes.x3d'/> |
| 23 | <ProtoDeclare name='Camera' appinfo='Camera node provides direct control of scene view to enable cinematic camera animation shot by shot and move by move along with still digital-photography settings for offline rendering of camera images.'> |
| 24 | <!-- Viewpoint-related fields, NavigationInfo-related fields and Camera-unique fields --> |
| 25 | <ProtoInterface> |
| 26 |
<field name='description' type='SFString' accessType='inputOutput'
appinfo='Text description to be displayed for this Camera'/> |
| 27 |
<field name='position' type='SFVec3f' value='0 0 10' accessType='inputOutput'
appinfo='Camera position in local transformation frame, which is default prior to first CameraShot initialPosition getting activated'/> |
| 28 |
<field name='orientation' type='SFRotation' value='0 0 1 0' accessType='inputOutput'
appinfo='Camera rotation in local transformation frame, which is default prior to first CameraShot initialPosition getting activated'/> |
| 29 |
<field name='fieldOfView' type='SFFloat' value='0.7854' accessType='inputOutput'
appinfo='pi/4'/> |
| 30 |
<field name='set_fraction' type='SFFloat' accessType='inputOnly'
appinfo='input fraction drives interpolators'/> |
| 31 |
<field name='set_bind' type='SFBool' accessType='inputOnly'
appinfo='input event binds or unbinds this Camera'/> |
| 32 |
<field name='bindTime' type='SFTime' accessType='outputOnly'
appinfo='output event indicates when this Camera is bound'/> |
| 33 |
<field name='isBound' type='SFBool' accessType='outputOnly'
appinfo='output event indicates whether this Camera is bound or unbound'/> |
| 34 |
<field name='nearClipPlane' type='SFFloat' value='0.25' accessType='inputOutput'
appinfo='Vector distance to near clipping plane corresponds to NavigationInfo.avatarSize[0]'/> |
| 35 |
<field name='farClipPlane' type='SFFloat' value='0.0' accessType='inputOutput'
appinfo='Vector distance to far clipping plane corresponds to NavigationInfo.visibilityLimit'/> |
| 36 |
<field name='shots' type='MFNode' accessType='inputOutput'
appinfo='Array of CameraShot nodes which in turn contain CameraMovement nodes'> |
| 37 | <!-- initialization nodes (if any) go here --> |
| 38 | </field> |
| 39 |
<field name='headlight' type='SFBool' value='true' accessType='inputOutput'
appinfo='Whether camera headlight is on or off'/> |
| 40 |
<field name='headlightColor' type='SFColor' value='1 1 1' accessType='inputOutput'
appinfo='Camera headlight color'/> |
| 41 |
<field name='headlightIntensity' type='SFFloat' value='1' accessType='inputOutput'
appinfo='Camera headlight intensity'/> |
| 42 |
<field name='filterColor' type='SFColor' value='1 1 1' accessType='inputOutput'
appinfo='Camera filter color that modifies virtual lens capture'/> |
| 43 |
<field name='filterTransparency' type='SFFloat' value='1' accessType='inputOutput'
appinfo='Camera filter transparency that modifies virtual lens capture'/> |
| 44 |
<field name='upVector' type='SFVec3f' value='0 1 0' accessType='inputOutput'
appinfo='upVector changes modify camera orientation (and possibly vice versa)'/> |
| 45 |
<field name='fStop' type='SFFloat' value='5.6' accessType='inputOutput'
appinfo='Focal length divided effective aperture diameter indicating width of focal plane'/> |
| 46 |
<field name='focusDistance' type='SFFloat' value='10' accessType='inputOutput'
appinfo='Distance to focal plane of sharpest focus'/> |
| 47 |
<field name='isActive' type='SFBool' accessType='outputOnly'
appinfo='Mark start/stop with true/false output respectively useful to trigger external animations'/> |
| 48 |
<field name='totalDuration' type='SFTime' accessType='outputOnly'
appinfo='Total duration of contained enabled CameraShot (and thus CameraMovement) move durations'/> |
| 49 |
<field name='offlineRender' type='SFNode' accessType='inputOutput'
appinfo='OfflineRender node'> |
| 50 | <!-- initialization node (if any) goes here --> |
| 51 | </field> |
| 52 |
<field name='traceEnabled' type='SFBool' value='false' accessType='initializeOnly'
appinfo='enable console output to trace script computations and prototype progress'/> |
| 53 | </ProtoInterface> |
| 54 | <ProtoBody> |
| 55 |
<!-- Viewpoint
CameraViewpoint is a DEF node that has 1 USE node: USE_1
<!-- ROUTE information for CameraViewpoint node: [from CameraPositionInterpolator.value_changed to position ] [from CameraOrientationInterpolator.value_changed to orientation ] [from CameraScript.position to position ] [from CameraScript.orientation to orientation ] [from CameraScript.isActive to set_bind ] --> <Viewpoint DEF='CameraViewpoint'> |
| 56 | <IS> |
| 57 | <connect nodeField='description' protoField='description'/> |
| 58 | <connect nodeField='position' protoField='position'/> |
| 59 | <connect nodeField='orientation' protoField='orientation'/> |
| 60 | <connect nodeField='fieldOfView' protoField='fieldOfView'/> |
| 61 | <connect nodeField='set_bind' protoField='set_bind'/> |
| 62 | <connect nodeField='bindTime' protoField='bindTime'/> |
| 63 | <connect nodeField='isBound' protoField='isBound'/> |
| 64 | </IS> |
| 65 | </Viewpoint> |
| 66 | <!-- NavInfo EXAMINE used since some browsers (InstantReality) try to lock view to vertical when flying to avoid disorientation --> |
| 67 |
<!-- NavigationInfo
CameraNavInfo is a DEF node that has 1 USE node: USE_1
<!-- ROUTE information for CameraNavInfo node: [from CameraScript.isActive to set_bind ] --> <NavigationInfo DEF='CameraNavInfo' type='"EXAMINE" "FLY" "ANY"'> |
| 68 | <IS> |
| 69 | <connect nodeField='set_bind' protoField='set_bind'/> |
| 70 | <!-- No need to bind outputs bindTime, isBound from NavigationInfo since Viewpoint outputs will suffice. TODO inform BitManagement that bindTime field is missing. --> |
| 71 | <connect nodeField='headlight' protoField='headlight'/> |
| 72 | <connect nodeField='visibilityLimit' protoField='farClipPlane'/> |
| 73 | </IS> |
| 74 | </NavigationInfo> |
| 75 | <!-- this DirectionalLight replaces NavigationInfo headlight in order to add color capability --> |
| 76 |
<!-- ROUTE information for CameraDirectionalLight node:
[from CameraScript.isActive to on
]
-->
<DirectionalLight DEF='CameraDirectionalLight' global='true'> |
| 77 | <IS> |
| 78 | <connect nodeField='on' protoField='headlight'/> |
| 79 | <connect nodeField='color' protoField='headlightColor'/> |
| 80 | <connect nodeField='intensity' protoField='headlightIntensity'/> |
| 81 | </IS> |
| 82 | <!-- TODO confirm other default field values match NavigationInfo spec --> |
| 83 | </DirectionalLight> |
| 84 |
<!-- PositionInterpolator
CameraPositionInterpolator is a DEF node that has 1 USE node: USE_1
<!-- ROUTE information for CameraPositionInterpolator node: [from value_changed to CameraViewpoint.position ] --> <PositionInterpolator DEF='CameraPositionInterpolator' key='0 1' keyValue='0 0 0 0 0 0'> |
| 85 | <IS> |
| 86 | <connect nodeField='set_fraction' protoField='set_fraction'/> |
| 87 | </IS> |
| 88 | </PositionInterpolator> |
| 89 |
<!-- OrientationInterpolator
CameraOrientationInterpolator is a DEF node that has 1 USE node: USE_1
<!-- ROUTE information for CameraOrientationInterpolator node: [from value_changed to CameraViewpoint.orientation ] --> <OrientationInterpolator DEF='CameraOrientationInterpolator' key='0 1' keyValue='0 1 0 0 0 1 0 0'> |
| 90 | <IS> |
| 91 | <connect nodeField='set_fraction' protoField='set_fraction'/> |
| 92 | </IS> |
| 93 | </OrientationInterpolator> |
| 94 | < ROUTE fromNode='CameraPositionInterpolator' fromField='value_changed' toNode='CameraViewpoint' toField='position'/> |
| 95 | < ROUTE fromNode='CameraOrientationInterpolator' fromField='value_changed' toNode='CameraViewpoint' toField='orientation'/> |
| 96 |
<!-- ROUTE information for CameraScript node:
[from position to CameraViewpoint.position
]
[from orientation to CameraViewpoint.orientation
]
[from isActive to CameraViewpoint.set_bind
]
[from isActive to CameraNavInfo.set_bind
]
[from isActive to CameraDirectionalLight.on
]
-->
<Script DEF='CameraScript' directOutput='true' mustEvaluate='true'> |
| 97 | <!-- binding is controlled externally, all camera operations proceed the same regardless of whether bound or not --> |
| 98 |
<field name='description' type='SFString' accessType='inputOutput'
appinfo='Text description to be displayed for this Camera'/> |
| 99 |
<field name='position' type='SFVec3f' accessType='inputOutput'
appinfo='Camera position in local transformation frame'/> |
| 100 |
<field name='orientation' type='SFRotation' accessType='inputOutput'
appinfo='Camera rotation in local transformation frame'/> |
| 101 |
<field name='set_fraction' type='SFFloat' accessType='inputOnly'
appinfo='input fraction drives interpolators'/> |
| 102 |
<field name='set_bind' type='SFBool' accessType='inputOnly'
appinfo='input event binds or unbinds this Camera'/> |
| 103 |
<field name='fieldOfView' type='SFFloat' accessType='inputOutput'
appinfo='pi/4'/> |
| 104 |
<field name='nearClipPlane' type='SFFloat' accessType='inputOutput'
appinfo='Vector distance to near clipping plane'/> |
| 105 |
<field name='farClipPlane' type='SFFloat' accessType='inputOutput'
appinfo='Vector distance to far clipping plane'/> |
| 106 |
<field name='shots' type='MFNode' accessType='inputOutput'
appinfo='Array of CameraShot nodes which in turn contain CameraMovement nodes'> |
| 107 | <!-- initialization nodes (if any) go here --> |
| 108 | </field> |
| 109 |
<field name='filterColor' type='SFColor' accessType='inputOutput'
appinfo='Camera filter color that modifies virtual lens capture'/> |
| 110 |
<field name='filterTransparency' type='SFFloat' accessType='inputOutput'
appinfo='Camera filter transparency that modifies virtual lens capture'/> |
| 111 |
<field name='upVector' type='SFVec3f' accessType='inputOutput'
appinfo='upVector changes modify camera orientation (and possibly vice versa)'/> |
| 112 |
<field name='fStop' type='SFFloat' accessType='inputOutput'
appinfo='Focal length divided effective aperture diameter indicating width of focal plane'/> |
| 113 |
<field name='focusDistance' type='SFFloat' accessType='inputOutput'
appinfo='Distance to focal plane of sharpest focus'/> |
| 114 |
<field name='isActive' type='SFBool' accessType='outputOnly'
appinfo='Mark start/stop with true/false output respectively useful to trigger external animations'/> |
| 115 |
<field name='totalDuration' type='SFTime' accessType='outputOnly'
appinfo='Total duration of contained enabled CameraShot (and thus CameraMovement) move durations'/> |
| 116 |
<field name='offlineRender' type='SFNode' accessType='inputOutput'
appinfo='OfflineRender node'> |
| 117 | <!-- initialization node (if any) goes here --> |
| 118 | </field> |
| 119 |
<field name='ViewpointNode' type='SFNode' accessType='initializeOnly'
appinfo='node reference to permit getting setting fields from within Script'> |
| 120 | <Viewpoint USE='CameraViewpoint'/> |
| 121 | </field> |
| 122 |
<field name='NavInfoNode' type='SFNode' accessType='initializeOnly'
appinfo='node reference to permit getting setting fields from within Script'> |
| 123 | <NavigationInfo USE='CameraNavInfo'/> |
| 124 | </field> |
| 125 |
<field name='CameraPI' type='SFNode' accessType='initializeOnly'
appinfo='node reference to permit getting setting fields from within Script'> |
| 126 | <PositionInterpolator USE='CameraPositionInterpolator'/> |
| 127 | </field> |
| 128 |
<field name='CameraOI' type='SFNode' accessType='initializeOnly'
appinfo='node reference to permit getting setting fields from within Script'> |
| 129 | <OrientationInterpolator USE='CameraOrientationInterpolator'/> |
| 130 | </field> |
| 131 |
<field name='key' type='MFFloat' accessType='inputOutput'
appinfo='key array for interpolators'/> |
| 132 |
<field name='keyValuePosition' type='MFVec3f' accessType='inputOutput'
appinfo='keyValue array for PositionInterpolator'/> |
| 133 |
<field name='keyValueOrientation' type='MFRotation' accessType='inputOutput'
appinfo='keyValue array for OrientationInterpolator'/> |
| 134 |
<field name='animated' type='SFBool' value='false' accessType='inputOutput'
appinfo='whether internal CameraShot and CameraMove nodes are tracking or changed via ROUTE events'/> |
| 135 |
<field name='initialized' type='SFBool' value='false' accessType='initializeOnly'
appinfo='perform checkShots() function once immediately after initialization'/> |
| 136 |
<field name='shotCount' type='SFInt32' value='0' accessType='initializeOnly'
appinfo='how many CameraShot nodes are contained in shots array'/> |
| 137 |
<field name='movesCount' type='SFInt32' value='0' accessType='initializeOnly'
appinfo='how many CameraMove nodes are contained in moves array'/> |
| 138 |
<field name='frameCount' type='SFFloat' value='0' accessType='initializeOnly'
appinfo='how many frames were created in current loop'/> |
| 139 |
<field name='startTime' type='SFTime' value='0' accessType='initializeOnly'
appinfo='holding variable'/> |
| 140 |
<field name='priorTraceTime' type='SFTime' value='0' accessType='initializeOnly'
appinfo='holding variable'/> |
| 141 |
<field name='traceEnabled' type='SFBool' accessType='initializeOnly'
appinfo='enable console output to trace script computations and prototype progress'/> |
| 142 | <IS> |
| 143 | <connect nodeField='description' protoField='description'/> |
| 144 | <connect nodeField='position' protoField='position'/> |
| 145 | <connect nodeField='orientation' protoField='orientation'/> |
| 146 | <connect nodeField='set_fraction' protoField='set_fraction'/> |
| 147 | <connect nodeField='set_bind' protoField='set_bind'/> |
| 148 | <connect nodeField='fieldOfView' protoField='fieldOfView'/> |
| 149 | <connect nodeField='nearClipPlane' protoField='nearClipPlane'/> |
| 150 | <connect nodeField='farClipPlane' protoField='farClipPlane'/> |
| 151 | <connect nodeField='shots' protoField='shots'/> |
| 152 | <connect nodeField='filterColor' protoField='filterColor'/> |
| 153 | <connect nodeField='filterTransparency' protoField='filterTransparency'/> |
| 154 | <connect nodeField='upVector' protoField='upVector'/> |
| 155 | <connect nodeField='fStop' protoField='fStop'/> |
| 156 | <connect nodeField='focusDistance' protoField='focusDistance'/> |
| 157 | <connect nodeField='isActive' protoField='isActive'/> |
| 158 | <connect nodeField='totalDuration' protoField='totalDuration'/> |
| 159 | <connect nodeField='offlineRender' protoField='offlineRender'/> |
| 160 | <connect nodeField='traceEnabled' protoField='traceEnabled'/> |
| 161 | </IS> |
<![CDATA[
ecmascript:
function initialize () // CameraScript
{
// tracePrint ('initialize start...');
NavInfoNode.avatarSize[0] = nearClipPlane;
// remaining setups deferred to invocation of checkShots() method
// thanks to Yvonne Jung Fraunhofer for diagnosing better approach to function initialization
alwaysPrint ('initialize complete');
}
function checkShots (eventValue)
{
tracePrint ('checkShots() method should only occur after initialize() methods in all other Scripts are complete');
// compute totalDuration by summing durations from contained CameraShot and CameraMovement nodes
totalDuration= 0;
shotCount = shots.length;
movesCount = 0;
for (i = 0; i < shotCount; i++) // shots index
{
tracePrint ('shots[' + i + '].moves.length=' + shots[i].moves.length);
movesCount += shots[i].moves.length;
totalDuration = totalDuration + shots[i].shotDuration;
if (shots[i].moves.length == 0)
{
alwaysPrint ('warning: CameraShot[' + i + '][' + shots[i].description + '] has no contained CameraMove nodes');
}
}
// size checks before proceeding
if (shotCount == 0)
{
alwaysPrint ('warning: no CameraShot nodes found for the shots, nothing to do!');
return;
}
else if (movesCount == 0)
{
alwaysPrint ('warning: no CameraMove nodes found for the shots, nothing to do!');
return;
}
else if (totalDuration == 0)
{
alwaysPrint ('warning: totalDuration = 0 seconds, nothing to do!');
return;
}
tracePrint ('number of contained CameraShot nodes=' + shotCount);
tracePrint ('number of contained CameraMove nodes=' + movesCount);
tracePrint ('totalDuration=' + totalDuration + ' seconds for all shots and moves');
// compute interpolators
var k = 0; // index for latest key, keyValuePosition, keyValueOrientation
for (i = 0; i < shotCount; i++) // shots index
{
if (i==0) // initial entries
{
key[0] = 0.0; // no previous move
keyValuePosition[0] = shots[i].initialPosition;
keyValueOrientation[0] = shots[i].initialOrientation;
}
else // new shot repositions, reorients camera as clean break from preceding shot/move
{
key[k+1] = key[k]; // start from end from previous move
keyValuePosition[k+1] = shots[i].initialPosition;
keyValueOrientation[k+1] = shots[i].initialOrientation;
k++;
}
tracePrint (shots[i].description);
tracePrint ('shots[i].moves.length=' + shots[i].moves.length);
for (j = 0; j < shots[i].moves.length; j++) // moves index
{
var durationFloat = shots[i].moves[j].duration; // implicit type conversion from SFTime
// durationFloat = new SFFloat (shots[i].moves[j].duration); // explicit type conversion from SFTime
// tracePrint ('durationFloat=' + durationFloat);
key[k+1] = key[k] + (durationFloat / totalDuration);
keyValuePosition[k+1] = shots[i].moves[j].goalPosition;
if (!animated)
{
keyValueOrientation[k+1] = shots[i].moves[j].goalOrientation;
}
else
{
// using constructor SFRotation (SFVec3f fromVector, SFVec3f toVector)
// see X3D ECMAScript binding Table 7.18 — SFRotation instance creation functions
// test if difference vector is zero, if so maintain previous rotation
var shotVector = ViewpointNode.position.subtract(shots[i].moves[j].goalAimPoint).normalize();
if (shotVector.length() >= 0)
{
// default view direction is along -Z axis
shots[i].moves[j].goalOrientation = new SFRotation (new SFVec3f (0, 0, 1), shotVector);
keyValueOrientation[k+1] = shots[i].moves[j].goalOrientation;
}
else // note (k > 0)
{
keyValueOrientation[k+1] = keyValueOrientation[k]; // no change
}
tracePrint ('shots[' + i + '].moves[' + j + '].goalAimPoint=' + shots[i].moves[j].goalAimPoint.toString());
tracePrint (' ViewpointNode.position=' + ViewpointNode.position.toString());
tracePrint (' shotVector delta=' + ViewpointNode.position.subtract(shots[i].moves[j].goalAimPoint).toString());
tracePrint (' shotVector normalize=' + ViewpointNode.position.subtract(shots[i].moves[j].goalAimPoint).normalize().toString());
tracePrint (' goalOrientation=' + shots[i].moves[j].goalOrientation.toString());
tracePrint (' keyValueOrientation[k+1]=' + keyValueOrientation[k+1].toString());
}
k++; // update index to match latest key, keyValuePosition, keyValueOrientation
// check animated parameter: set true if any of moves are tracking moves
if (!animated) animated = shots[i].moves[j].tracking; // once true, remains true
// tracePrint ('shots[' + i + '].moves[' + j + '].tracking=' + shots[i].moves[j].tracking + ', animated=' + animated);
// intermediate trace
tracePrint (' key=' + key);
tracePrint (' keyValuePosition=' + keyValuePosition);
tracePrint ('keyValueOrientation=' + keyValueOrientation);
tracePrint ('- ' + shots[i].moves[j].description);
}
}
tracePrint (' key=' + key);
tracePrint (' keyValuePosition=' + keyValuePosition);
tracePrint ('keyValueOrientation=' + keyValueOrientation);
if (key.length != keyValuePosition.length)
{
alwaysPrint ('warning: internal error during array construction, ' +
'key.length=' + key.length + ' must equal ' +
'keyValuePosition.length=' + keyValuePosition.length);
}
if (key.length != keyValueOrientation.length)
{
alwaysPrint ('warning: internal error during array construction, ' +
'key.length=' + key.length + ' must equal ' +
'keyValueOrientation.length=' + keyValueOrientation.length);
}
if (key.length != (shotCount + movesCount))
{
alwaysPrint ('warning: internal error during array construction, ' +
'key.length=' + key.length + ' must equal ' +
'(shotCount + movesCount)=' + (shotCount + movesCount));
}
tracePrint (' animated=' + animated);
// set node values
CameraPI.key = key;
CameraOI.key = key;
CameraPI.keyValue = keyValuePosition;
CameraOI.keyValue = keyValueOrientation;
if (!animated) // output results
{
tracePrint ('<PositionInterpolator DEF=\'CameraPositionInterpolator\' key=\'' + stripBrackets(CameraPI.key) + '\' keyValue=\'' + stripBrackets(CameraPI.keyValue) + '\'/>');
tracePrint ('<OrientationInterpolator DEF=\'CameraOrientationInterpolator\' key=\'' + stripBrackets(CameraOI.key) + '\' keyValue=\'' + stripBrackets(CameraOI.keyValue) + '\'/>');
}
tracePrint ('checkShots() complete');
}
function stripBrackets (fieldArray)
{
// some browsers add brackets to array output strings, this function strips them
outputString = '';
for (i = 0; i < fieldArray.length; i++)
{
outputString += fieldArray[i].toString();
if (i < fieldArray.length - 1) outputString += ' ';
}
return outputString;
}
function set_fraction (eventValue, timestamp) // input event received for inputOnly field
{
// traceEnabled = false; // for testing purposes
// if Camera is being animated, immediately recompute interpolator settings
if (animated) checkShots (true);
// trace progress on console with reduced output frequency
if (frameCount == 0)
{
alwaysPrint ('Animation loop commencing, timestamp=' + timestamp);
startTime = timestamp;
priorTraceTime = timestamp;
alwaysPrint ('shotClock=' + (timestamp - startTime) + ' seconds, frameCount=' + frameCount + ', fraction=' + eventValue + ', position=' + ViewpointNode.position.toString() + ', orientation=' + ViewpointNode.orientation.toString());
if (animated) // output results
{
// TODO how to report or speed up response? alwaysPrint (' aimPoint=' + aimPoint.toString());
tracePrint (' <PositionInterpolator DEF=\'CameraPositionInterpolator\' key=\'' + stripBrackets(CameraPI.key) + '\' keyValue=\'' + stripBrackets(CameraPI.keyValue) + '\'/>');
tracePrint (' <OrientationInterpolator DEF=\'CameraOrientationInterpolator\' key=\'' + stripBrackets(CameraOI.key) + '\' keyValue=\'' + stripBrackets(CameraOI.keyValue) + '\'/>');
}
}
else if ((timestamp - priorTraceTime) >= 1.0) // 1 second trace interval
{
alwaysPrint ('shotClock=' + (timestamp - startTime) + ' seconds, frameCount=' + frameCount + ', fraction=' + eventValue + ', position=' + ViewpointNode.position.toString() + ', orientation=' + ViewpointNode.orientation.toString());
priorTraceTime = timestamp;
if (animated) // output results
{
// TODO how to report or speed up response? alwaysPrint (' aimPoint=' + aimPoint.toString());
tracePrint (' <PositionInterpolator DEF=\'CameraPositionInterpolator\' key=\'' + stripBrackets(CameraPI.key) + '\' keyValue=\'' + stripBrackets(CameraPI.keyValue) + '\'/>');
alwaysPrint (' <OrientationInterpolator DEF=\'CameraOrientationInterpolator\' key=\'' + stripBrackets(CameraOI.key) + '\' keyValue=\'' + stripBrackets(CameraOI.keyValue) + '\'/>');
}
}
if (eventValue == 0)
{
// note that zero value is not necessarily sent first by TimeSensor, so otherwise ignored
frameCount++;
}
else if (eventValue == 1)
{
alwaysPrint ('shotClock=' + (timestamp - startTime) + ', frameCount=' + frameCount + ', fraction=' + eventValue + ', position=' + ViewpointNode.position.toString() + ', orientation=' + ViewpointNode.orientation.toString());
if (animated) // output results
{
// TODO how to report or speed up response? alwaysPrint (' aimPoint=' + aimPoint.toString());
}
alwaysPrint ('Animation loop complete.');
// do not unbind the Viewpoint and NavigationInfo nodes, let that be controlled externally
}
else
{
frameCount++;
}
}
function set_bind (eventValue) // input event received for inputOnly field
{
// need to ensure CameraShot nodes are properly initialized
if (initialized == false)
{
checkShots (true);
initialized = true;
}
if (eventValue)
{
tracePrint ('Camera has been bound');
}
else
{
tracePrint ('Camera has been unbound');
}
}
function set_description (eventValue) // input event received for inputOutput field
{
description = eventValue;
}
function set_position (eventValue) // input event received for inputOutput field
{
position = eventValue;
}
function set_orientation (eventValue) // input event received for inputOutput field
{
orientation = eventValue;
}
function set_fieldOfView (eventValue) // input event received for inputOutput field
{
fieldOfView = eventValue;
}
function set_nearClipPlane (eventValue) // input event received for inputOutput field
{
nearClipPlane = eventValue;
}
function set_farClipPlane (eventValue) // input event received for inputOutput field
{
farClipPlane = eventValue;
}
function set_shots (eventValue) // input event received for inputOutput field
{
shots = eventValue;
}
function set_filterColor (eventValue) // input event received for inputOutput field
{
filterColor = eventValue;
}
function set_filterTransparency (eventValue) // input event received for inputOutput field
{
filterTransparency = eventValue;
}
function set_upVector (eventValue) // input event received for inputOutput field
{
upVector = eventValue;
}
function set_fStop (eventValue) // input event received for inputOutput field
{
fStop = eventValue;
}
function set_focusDistance (eventValue) // input event received for inputOutput field
{
focusDistance = eventValue;
}
function set_offlineRender (eventValue) // input event received for inputOutput field
{
offlineRender = eventValue;
}
function set_key (eventValue) // input event received for inputOutput field
{
key = eventValue;
}
function set_keyValuePosition (eventValue) // input event received for inputOutput field
{
keyValuePosition = eventValue;
}
function set_keyValueOrientation (eventValue) // input event received for inputOutput field
{
keyValueOrientation = eventValue;
}
function set_animated (eventValue) // input event received for inputOutput field
{
animated = eventValue;
}
function tracePrint (outputValue)
{
if (traceEnabled) alwaysPrint (outputValue);
}
function alwaysPrint (outputValue)
{
// try to ensure outputValue is converted to string despite Browser.println idiosyncracies
var outputString = outputValue.toString(); // utility function according to spec
if (outputString == null) outputString = outputValue; // direct cast
if (description.length > 0)
Browser.println ('[Camera: ' + description + '] ' + outputString);
else
Browser.println ('[Camera] ' + outputString);
}
]]>
|
|
| 163 | </Script> |
| 164 | < ROUTE fromNode='CameraScript' fromField='position' toNode='CameraViewpoint' toField='position'/> |
| 165 | < ROUTE fromNode='CameraScript' fromField='orientation' toNode='CameraViewpoint' toField='orientation'/> |
| 166 | < ROUTE fromNode='CameraScript' fromField='isActive' toNode='CameraViewpoint' toField='set_bind'/> |
| 167 | < ROUTE fromNode='CameraScript' fromField='isActive' toNode='CameraNavInfo' toField='set_bind'/> |
| 168 | < ROUTE fromNode='CameraScript' fromField='isActive' toNode='CameraDirectionalLight' toField='on'/> |
| 169 | </ProtoBody> |
| 170 | </ProtoDeclare> |
| 171 | <!-- =============== CameraShot ============== --> |
| 172 | <ProtoDeclare name='CameraShot' appinfo='CameraShot collects a specific set of CameraMovement animations that make up an individual shot.'> |
| 173 | <ProtoInterface> |
| 174 |
<field name='description' type='SFString' accessType='inputOutput'
appinfo='Text description to be displayed for this CameraShot'/> |
| 175 |
<field name='enabled' type='SFBool' value='true' accessType='inputOutput'
appinfo='Whether this CameraShot can be activated'/> |
| 176 |
<field name='moves' type='MFNode' accessType='inputOutput'
appinfo='Set of CameraMovement nodes'> |
| 177 | <!-- initializing CameraMovement nodes are inserted here by scene author using ProtoInstance --> |
| 178 | </field> |
| 179 |
<field name='initialPosition' type='SFVec3f' value='0 0 10' accessType='inputOutput'
appinfo='Setup to reinitialize camera position for this shot'/> |
| 180 |
<field name='initialOrientation' type='SFRotation' value='0 0 1 0' accessType='inputOutput'
appinfo='Setup to reinitialize camera rotation for this shot'/> |
| 181 |
<field name='initialAimPoint' type='SFVec3f' value='0 0 0' accessType='inputOutput'
appinfo='Setup to reinitialize aimpoint (relative location for camera direction) for this shot'/> |
| 182 |
<field name='initialFieldOfView' type='SFFloat' value='0.7854' accessType='inputOutput'
appinfo='pi/4'/> |
| 183 |
<field name='initialFStop' type='SFFloat' value='5.6' accessType='inputOutput'
appinfo='Focal length divided effective aperture diameter indicating width of focal plane'/> |
| 184 |
<field name='initialFocusDistance' type='SFFloat' value='10' accessType='inputOutput'
appinfo='Distance to focal plane of sharpest focus'/> |
| 185 |
<field name='shotDuration' type='SFTime' accessType='outputOnly'
appinfo='Subtotal duration of contained CameraMovement move durations'/> |
| 186 |
<field name='isActive' type='SFBool' accessType='outputOnly'
appinfo='Mark start/stop with true/false output respectively useful to trigger external animations'/> |
| 187 |
<field name='traceEnabled' type='SFBool' value='false' accessType='initializeOnly'
appinfo='enable console output to trace script computations and prototype progress'/> |
| 188 | </ProtoInterface> |
| 189 | <ProtoBody> |
| 190 | <Script DEF='CameraShotScript' directOutput='true' mustEvaluate='true'> |
| 191 |
<field name='description' type='SFString' accessType='inputOutput'
appinfo='Text description to be displayed for this CameraShot'/> |
| 192 |
<field name='enabled' type='SFBool' accessType='inputOutput'
appinfo='Whether this CameraShot can be activated'/> |
| 193 |
<field name='moves' type='MFNode' accessType='inputOutput'
appinfo='Set of CameraMovement nodes'> |
| 194 | <!-- initialization nodes (if any) go here --> |
| 195 | </field> |
| 196 |
<field name='initialPosition' type='SFVec3f' accessType='inputOutput'
appinfo='Setup to reinitialize camera position for this shot'/> |
| 197 |
<field name='initialOrientation' type='SFRotation' accessType='inputOutput'
appinfo='Setup to reinitialize camera rotation for this shot'/> |
| 198 |
<field name='initialAimPoint' type='SFVec3f' accessType='inputOutput'
appinfo='Setup to reinitialize aimpoint (relative location for camera direction) for this shot'/> |
| 199 |
<field name='initialFieldOfView' type='SFFloat' accessType='inputOutput'
appinfo='pi/4'/> |
| 200 |
<field name='initialFStop' type='SFFloat' accessType='inputOutput'
appinfo='Focal length divided effective aperture diameter indicating width of focal plane'/> |
| 201 |
<field name='initialFocusDistance' type='SFFloat' accessType='inputOutput'
appinfo='Distance to focal plane of sharpest focus'/> |
| 202 |
<field name='shotDuration' type='SFTime' accessType='outputOnly'
appinfo='Subtotal duration of contained CameraMovement move durations'/> |
| 203 |
<field name='isActive' type='SFBool' accessType='outputOnly'
appinfo='Mark start/stop with true/false output respectively useful to trigger external animations'/> |
| 204 |
<field name='traceEnabled' type='SFBool' accessType='initializeOnly'
appinfo='enable console output to trace script computations and prototype progress'/> |
| 205 |
<field name='key' type='MFFloat' accessType='inputOutput'
appinfo='key array for interpolators'/> |
| 206 |
<field name='keyValuePosition' type='MFVec3f' accessType='inputOutput'
appinfo='keyValue array for PositionInterpolator'/> |
| 207 |
<field name='keyValueOrientation' type='MFRotation' accessType='inputOutput'
appinfo='keyValue array for OrientationInterpolator'/> |
| 208 | <IS> |
| 209 | <connect nodeField='description' protoField='description'/> |
| 210 | <connect nodeField='enabled' protoField='enabled'/> |
| 211 | <connect nodeField='moves' protoField='moves'/> |
| 212 | <connect nodeField='initialPosition' protoField='initialPosition'/> |
| 213 | <connect nodeField='initialOrientation' protoField='initialOrientation'/> |
| 214 | <connect nodeField='initialAimPoint' protoField='initialAimPoint'/> |
| 215 | <connect nodeField='initialFieldOfView' protoField='initialFieldOfView'/> |
| 216 | <connect nodeField='initialFStop' protoField='initialFStop'/> |
| 217 | <connect nodeField='initialFocusDistance' protoField='initialFocusDistance'/> |
| 218 | <connect nodeField='shotDuration' protoField='shotDuration'/> |
| 219 | <connect nodeField='isActive' protoField='isActive'/> |
| 220 | <connect nodeField='traceEnabled' protoField='traceEnabled'/> |
| 221 | </IS> |
<![CDATA[
ecmascript:
function initialize () // CameraShotScript
{
// tracePrint ('initialize start...');
// compute shotDuration by summing durations from contained CameraMovement nodes
shotDuration = 0;
for (i = 0; i < moves.length; i++)
{
shotDuration = shotDuration + moves[i].duration;
}
alwaysPrint ('number of contained CameraMove nodes=' + moves.length + ', shotDuration=' + shotDuration + ' seconds');
// tracePrint ('... initialize() complete');
}
function set_description (eventValue) // input event received for inputOutput field
{
description = eventValue;
}
function set_enabled (eventValue) // input event received for inputOutput field
{
enabled = eventValue;
}
function set_moves (eventValue) // input event received for inputOutput field
{
moves = eventValue;
}
function set_initialPosition (eventValue) // input event received for inputOutput field
{
initialPosition = eventValue;
}
function set_initialOrientation (eventValue) // input event received for inputOutput field
{
initialOrientation = eventValue;
}
function set_initialAimPoint (eventValue) // input event received for inputOutput field
{
initialAimPoint = eventValue;
}
function set_initialFieldOfView (eventValue) // input event received for inputOutput field
{
initialFieldOfView = eventValue;
}
function set_initialFStop (eventValue) // input event received for inputOutput field
{
initialFStop = eventValue;
}
function set_initialFocusDistance (eventValue) // input event received for inputOutput field
{
initialFocusDistance = eventValue;
}
function set_key (eventValue) // input event received for inputOutput field
{
key = eventValue;
}
function set_keyValuePosition (eventValue) // input event received for inputOutput field
{
keyValuePosition = eventValue;
}
function set_keyValueOrientation (eventValue) // input event received for inputOutput field
{
keyValueOrientation = eventValue;
}
// TODO consider method set_active for constructed Camera node BooleanSequencer to send isActive
function tracePrint (outputValue)
{
if (traceEnabled) alwaysPrint (outputValue);
}
function alwaysPrint (outputValue)
{
// try to ensure outputValue is converted to string despite browser idiosyncracies
var outputString = outputValue.toString(); // utility function according to spec
if (outputString == null) outputString = outputValue; // direct cast
if (description.length > 0)
Browser.println ('[CameraShot: ' + description + '] ' + outputString);
else
Browser.println ('[CameraShot] ' + outputString);
}
]]>
|
|
| 223 | </Script> |
| 224 | <!-- Add any ROUTEs here, going from Script to other nodes within ProtoBody --> |
| 225 | </ProtoBody> |
| 226 | </ProtoDeclare> |
| 227 | <!-- =============== CameraMovement ============== --> |
| 228 | <ProtoDeclare name='CameraMovement' appinfo='CameraMovement node defines a single camera movement animation including goalPosition, goalOrientation, goalAimPoint and goalFieldOfView.'> |
| 229 | <ProtoInterface> |
| 230 |
<field name='description' type='SFString' accessType='inputOutput'
appinfo='Text description to be displayed for this CameraMovement'/> |
| 231 |
<field name='enabled' type='SFBool' value='true' accessType='inputOutput'
appinfo='Whether this CameraMovement can be activated'/> |
| 232 |
<field name='duration' type='SFFloat' value='0' accessType='inputOutput'
appinfo='Duration in seconds for this move'/> |
| 233 |
<field name='goalPosition' type='SFVec3f' value='0 0 10' accessType='inputOutput'
appinfo='Goal camera position for this move'/> |
| 234 |
<field name='goalOrientation' type='SFRotation' value='0 0 1 0' accessType='inputOutput'
appinfo='Goal camera rotation for this move'/> |
| 235 |
<field name='tracking' type='SFBool' value='false' accessType='inputOutput'
appinfo='Whether or not camera direction is tracking towards the aimPoint'/> |
| 236 |
<field name='goalAimPoint' type='SFVec3f' value='0 0 0' accessType='inputOutput'
appinfo='Goal aimPoint for this move, ignored if tracking=false'/> |
| 237 |
<field name='goalFieldOfView' type='SFFloat' value='0.7854' accessType='inputOutput'
appinfo='Goal fieldOfView for this move'/> |
| 238 |
<field name='goalFStop' type='SFFloat' value='5.6' accessType='inputOutput'
appinfo='Focal length divided effective aperture diameter indicating width of focal plane'/> |
| 239 |
<field name='goalFocusDistance' type='SFFloat' value='10' accessType='inputOutput'
appinfo='Distance to focal plane of sharpest focus'/> |
| 240 |
<field name='isActive' type='SFBool' accessType='outputOnly'
appinfo='Mark start/stop with true/false output respectively useful to trigger external animations'/> |
| 241 |
<field name='traceEnabled' type='SFBool' value='false' accessType='initializeOnly'
appinfo='enable console output to trace script computations and prototype progress'/> |
| 242 | </ProtoInterface> |
| 243 | <ProtoBody> |
| 244 | <!-- First node determines node type of this prototype --> |
| 245 | <!-- Subsequent nodes do not render, but still must be a valid X3D subgraph --> |
| 246 | <!-- Script holds CameraMovement initialization values for query by parent CameraShot, and also permits changing values via events --> |
| 247 | <Script DEF='CameraMovementScript' directOutput='true' mustEvaluate='true'> |
| 248 |
<field name='description' type='SFString' accessType='inputOutput'
appinfo='Text description to be displayed for this CameraMovement'/> |
| 249 |
<field name='enabled' type='SFBool' accessType='inputOutput'
appinfo='Whether this CameraMovement can be activated'/> |
| 250 |
<field name='duration' type='SFFloat' accessType='inputOutput'
appinfo='Duration in seconds for this move'/> |
| 251 |
<field name='goalPosition' type='SFVec3f' accessType='inputOutput'
appinfo='Goal camera position for this move'/> |
| 252 |
<field name='goalOrientation' type='SFRotation' accessType='inputOutput'
appinfo='Goal camera rotation for this move'/> |
| 253 |
<field name='tracking' type='SFBool' accessType='inputOutput'
appinfo='Whether or not camera direction is tracking towards the aimPoint'/> |
| 254 |
<field name='goalAimPoint' type='SFVec3f' accessType='inputOutput'
appinfo='Goal aimPoint for this move, ignored if tracking=false'/> |
| 255 |
<field name='goalFieldOfView' type='SFFloat' accessType='inputOutput'
appinfo='Goal fieldOfView for this move'/> |
| 256 |
<field name='goalFStop' type='SFFloat' accessType='inputOutput'
appinfo='Focal length divided effective aperture diameter indicating width of focal plane'/> |
| 257 |
<field name='goalFocusDistance' type='SFFloat' accessType='inputOutput'
appinfo='Distance to focal plane of sharpest focus'/> |
| 258 |
<field name='isActive' type='SFBool' accessType='outputOnly'
appinfo='Mark start/stop with true/false output respectively useful to trigger external animations'/> |
| 259 |
<field name='traceEnabled' type='SFBool' accessType='initializeOnly'
appinfo='enable console output to trace script computations and prototype progress'/> |
| 260 | <IS> |
| 261 | <connect nodeField='description' protoField='description'/> |
| 262 | <connect nodeField='enabled' protoField='enabled'/> |
| 263 | <connect nodeField='duration' protoField='duration'/> |
| 264 | <connect nodeField='goalPosition' protoField='goalPosition'/> |
| 265 | <connect nodeField='goalOrientation' protoField='goalOrientation'/> |
| 266 | <connect nodeField='tracking' protoField='tracking'/> |
| 267 | <connect nodeField='goalAimPoint' protoField='goalAimPoint'/> |
| 268 | <connect nodeField='goalFieldOfView' protoField='goalFieldOfView'/> |
| 269 | <connect nodeField='goalFStop' protoField='goalFStop'/> |
| 270 | <connect nodeField='goalFocusDistance' protoField='goalFocusDistance'/> |
| 271 | <connect nodeField='isActive' protoField='isActive'/> |
| 272 | <connect nodeField='traceEnabled' protoField='traceEnabled'/> |
| 273 | </IS> |
<![CDATA[
ecmascript:
function initialize () // CameraMovementScript
{
// tracePrint ('initialize start...');
alwaysPrint ('initialize goalPosition=' + goalPosition.toString() + ', goalOrientation=' + goalOrientation.toString() +
', goalAimPoint=' + goalAimPoint.toString() // + ', tracking=' + tracking.toString()
);
if (duration < 0)
{
alwaysPrint ('error: negative duration=' + duration + ', reset to 0 and ignored');
duration = 0;
}
else if (duration == 0)
{
alwaysPrint ('warning: duration=0, nothing to do!');
}
tracePrint ('... initialize complete');
}
function set_goalAimPoint (eventValue) // input event received for inputOutput field
{
goalAimPoint_changed = eventValue;
tracePrint ('goalAimPoint=' + goalAimPoint.toString());
// updated goalOrientation tracking is handled by Camera recomputing the OrientationInterpolator
}
function set_description (eventValue) // input event received for inputOutput field
{
description = eventValue;
}
function set_enabled (eventValue) // input event received for inputOutput field
{
enabled = eventValue;
}
function set_duration (eventValue) // input event received for inputOutput field
{
duration = eventValue;
}
function set_goalPosition (eventValue) // input event received for inputOutput field
{
goalPosition = eventValue;
}
function set_goalOrientation (eventValue) // input event received for inputOutput field
{
goalOrientation = eventValue;
}
function set_tracking (eventValue) // input event received for inputOutput field
{
tracking = eventValue;
}
function set_goalFieldOfView (eventValue) // input event received for inputOutput field
{
goalFieldOfView = eventValue;
}
function set_goalFStop (eventValue) // input event received for inputOutput field
{
goalFStop = eventValue;
}
function set_goalFocusDistance (eventValue) // input event received for inputOutput field
{
goalFocusDistance = eventValue;
}
// TODO consider method set_active for constructed Camera node BooleanSequencer to send isActive
function tracePrint (outputValue)
{
if (traceEnabled) alwaysPrint (outputValue);
}
function alwaysPrint (outputValue)
{
// try to ensure outputValue is converted to string despite browser idiosyncracies
var outputString = outputValue.toString(); // utility function according to spec
if (outputString == null) outputString = outputValue; // direct cast
if (description.length > 0)
Browser.println ('[CameraMovement: ' + description + '] ' + outputString);
else
Browser.println ('[CameraMovement] ' + outputString);
}
]]>
|
|
| 275 | </Script> |
| 276 | <!-- Add any ROUTEs here, going from Script to other nodes within ProtoBody --> |
| 277 | </ProtoBody> |
| 278 | </ProtoDeclare> |
| 279 | <!-- =============== OfflineRender ============== --> |
| 280 | <ProtoDeclare name='OfflineRender' appinfo='OfflineRender defines a parameters for offline rendering of Camera animation output to a movie file (or possibly a still shot).'> |
| 281 | <ProtoInterface> |
| 282 |
<field name='description' type='SFString' accessType='inputOutput'
appinfo='Text description to be displayed for this OfflineRender'/> |
| 283 |
<field name='enabled' type='SFBool' value='true' accessType='inputOutput'
appinfo='Whether this OfflineRender can be activated'/> |
| 284 |
<field name='frameRate' type='SFFloat' value='30' accessType='inputOutput'
appinfo='Frames per second recorded for this rendering'/> |
| 285 |
<field name='frameSize' type='SFVec2f' value='640 480' accessType='inputOutput'
appinfo='Size of frame in number of pixels width and height'/> |
| 286 |
<field name='pixelAspectRatio' type='SFFloat' value='1.33' accessType='inputOutput'
appinfo='Relative dimensions of pixel height/width typically 1.33 or 1'/> |
| 287 |
<field name='set_startTime' type='SFTime' accessType='inputOnly'
appinfo='Begin render operation'/> |
| 288 |
<field name='progress' type='SFFloat' accessType='outputOnly'
appinfo='Progress performing render operation (0..1)'/> |
| 289 |
<field name='renderCompleteTime' type='SFTime' accessType='outputOnly'
appinfo='Render operation complete'/> |
| 290 |
<field name='movieFormat' type='MFString' value='"mpeg"' accessType='initializeOnly'
appinfo='Format of rendered output movie (mpeg mp4 etc.), use first supported format'/> |
| 291 |
<field name='imageFormat' type='MFString' value='"png"' accessType='initializeOnly'
appinfo='Format of rendered output images (png jpeg gif tiff etc.) use first supported format'/> |
| 292 |
<field name='traceEnabled' type='SFBool' value='false' accessType='initializeOnly'
appinfo='enable console output to trace script computations and prototype progress'/> |
| 293 | <!-- TODO non-photorealistic rendering (NPR) parameters --> |
| 294 | </ProtoInterface> |
| 295 | <ProtoBody> |
| 296 | <!-- First node determines node type of this prototype --> |
| 297 | <!-- Subsequent nodes do not render, but still must be a valid X3D subgraph --> |
| 298 | <Script DEF='OfflineRenderScript' mustEvaluate='true'> |
| 299 |
<field name='description' type='SFString' accessType='inputOutput'
appinfo='Text description to be displayed for this OfflineRender'/> |
| 300 |
<field name='enabled' type='SFBool' accessType='inputOutput'
appinfo='Whether this OfflineRender can be activated'/> |
| 301 |
<field name='frameRate' type='SFFloat' accessType='inputOutput'
appinfo='Frames per second recorded for this rendering'/> |
| 302 |
<field name='frameSize' type='SFVec2f' accessType='inputOutput'
appinfo='Size of frame in number of pixels width and height'/> |
| 303 |
<field name='pixelAspectRatio' type='SFFloat' accessType='inputOutput'
appinfo='Relative dimensions of pixel height/width typically 1.33 or 1'/> |
| 304 |
<field name='set_startTime' type='SFTime' accessType='inputOnly'
appinfo='Begin render operation'/> |
| 305 |
<field name='progress' type='SFFloat' accessType='outputOnly'
appinfo='Progress performing render operation (0..1)'/> |
| 306 |
<field name='renderCompleteTime' type='SFTime' accessType='outputOnly'
appinfo='Render operation complete'/> |
| 307 |
<field name='movieFormat' type='MFString' accessType='initializeOnly'
appinfo='Format of rendered output movie (mpeg mp4 etc.)'/> |
| 308 |
<field name='imageFormat' type='MFString' accessType='initializeOnly'
appinfo='Format of rendered output images (png jpeg gif tiff etc.)'/> |
| 309 |
<field name='traceEnabled' type='SFBool' accessType='initializeOnly'
appinfo='enable console output to trace script computations and prototype progress'/> |
| 310 | <IS> |
| 311 | <connect nodeField='description' protoField='description'/> |
| 312 | <connect nodeField='enabled' protoField='enabled'/> |
| 313 | <connect nodeField='frameRate' protoField='frameRate'/> |
| 314 | <connect nodeField='frameSize' protoField='frameSize'/> |
| 315 | <connect nodeField='pixelAspectRatio' protoField='pixelAspectRatio'/> |
| 316 | <connect nodeField='set_startTime' protoField='set_startTime'/> |
| 317 | <connect nodeField='progress' protoField='progress'/> |
| 318 | <connect nodeField='renderCompleteTime' protoField='renderCompleteTime'/> |
| 319 | <connect nodeField='movieFormat' protoField='movieFormat'/> |
| 320 | <connect nodeField='imageFormat' protoField='imageFormat'/> |
| 321 | <connect nodeField='traceEnabled' protoField='traceEnabled'/> |
| 322 | </IS> |
<![CDATA[
ecmascript:
function initialize () // OfflineRenderScript
{
// tracePrint ('initialize start...');
tracePrint ('... initialize complete');
}
function set_description (eventValue) // input event received for inputOutput field
{
description = eventValue;
}
function set_enabled (eventValue) // input event received for inputOutput field
{
enabled = eventValue;
}
function set_frameRate (eventValue) // input event received for inputOutput field
{
frameRate = eventValue;
}
function set_frameSize (eventValue) // input event received for inputOutput field
{
frameSize = eventValue;
}
function set_pixelAspectRatio (eventValue) // input event received for inputOutput field
{
pixelAspectRatio = eventValue;
}
function set_startTime (eventValue) // input event received for inputOnly field
{
// do something with input eventValue;
}
function tracePrint (outputValue)
{
if (traceEnabled) alwaysPrint (outputValue);
}
function alwaysPrint (outputValue)
{
// try to ensure outputValue is converted to string despite browser idiosyncracies
var outputString = outputValue.toString(); // utility function according to spec
if (outputString == null) outputString = outputValue; // direct cast
if (description.length > 0)
Browser.println ('[OfflineRender: ' + description + '] ' + outputString);
else
Browser.println ('[OfflineRender] ' + outputString);
}
]]>
|
|
| 324 | </Script> |
| 325 | <!-- Add any ROUTEs here, going from Script to other nodes within ProtoBody --> |
| 326 | </ProtoBody> |
| 327 | </ProtoDeclare> |
| 328 | <!-- =============== Launch Prototype Example ============== --> |
| 329 | <Background skyColor='0.282353 0.380392 0.470588'/> |
| 330 | <Anchor description='launch CameraExample scene' url=' "CameraExamples.x3d" "https://www.web3d.org/x3d/content/examples/Basic/development/CameraExamples.x3d" "CameraExamples.wrl" "https://www.web3d.org/x3d/content/examples/Basic/development/CameraExamples.wrl" '> |
| 331 | <Transform> |
| 332 | <Shape> |
| 333 | <Text string='"CameraPrototypes.x3d" "defines multiple prototype nodes" "" "Click on this text to see" "CameraExamples.x3d scene"'> |
| 334 | <FontStyle justify='"MIDDLE" "MIDDLE"'/> |
| 335 | </Text> |
| 336 | <Appearance> |
| 337 | <Material diffuseColor='1 1 0.2'/> |
| 338 | </Appearance> |
| 339 | </Shape> |
| 340 | </Transform> |
| 341 | </Anchor> |
| 342 | </Scene> |
| 343 | </X3D> |
Event Graph ROUTE Table entries with 7 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.
|
CameraMovementScript
Script |
No direct ROUTE connection found for events to/from this node. This Script has no direct access to other nodes. |
|
CameraScript
Script position SFVec3f |
CameraViewpoint
Viewpoint position SFVec3f |
|
|
CameraScript
Script orientation SFRotation |
CameraViewpoint
Viewpoint orientation SFRotation |
|
|
CameraScript
Script isActive SFBool |
CameraViewpoint
Viewpoint set_bind SFBool |
|
|
CameraScript
Script isActive SFBool |
CameraNavInfo
NavigationInfo set_bind SFBool |
|
|
CameraScript
Script isActive SFBool |
CameraDirectionalLight
DirectionalLight on SFBool |
|
CameraShotScript
Script |
No direct ROUTE connection found for events to/from this node. Contains MFNode field with direct access to another node. This Script has no direct access to other nodes. |
|
OfflineRenderScript
Script |
No direct ROUTE connection found for events to/from this node. This Script has no direct access to other nodes. |
| line 330
Anchor |
description='launch CameraExample scene' User-interaction hint for this node. |
<!--
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)
<ProtoDeclare name='ProtoName'>
<field
name='fieldName'/> </ProtoDeclare>
-->
<!--
For additional help information about X3D scenes, please see X3D Tooltips, X3D Resources, and X3D Scene Authoring Hints.
-->