clock_0_00.x3d source
<?xml version="1.0" encoding="UTF-8"?>
<X3D>
<Scene>
<Viewpoint position='0 0 5' description='initial'/>
<NavigationInfo
type='
"EXAMINE"'
/>
<Transform rotation='1 0 0 1.5708'>
<Shape>
<Appearance>
<Material diffuseColor='1 1 1'/>
</Appearance>
<Cylinder radius='1.25' height='0.2'/>
</Shape>
<Shape>
<Appearance>
<Material/>
</Appearance>
<Cylinder radius='0.1' height='0.3'/>
</Shape>
</Transform>
<Transform DEF='DialPlate-Tr' translation='0 0 0.11'>
</Transform>
<Switch>
<Transform DEF='Scale1-Tf' translation='0 1.15 0'>
<Shape>
<Appearance>
<Material diffuseColor='0.5 0 0'/>
</Appearance>
<Box size='0.05 0.08 0.02'/>
</Shape>
</Transform>
<Transform DEF='Scale2-Tf' translation='0 1.15 0'>
<Shape>
<Appearance>
<Material diffuseColor='0 0 0'/>
</Appearance>
<Box size='0.02 0.05 0.02'/>
</Shape>
</Transform>
</Switch>
<Script DEF='Plate-Sc' directOutput='TRUE'>
<field accessType='initializeOnly' type='SFNode' name='DialPlate'>
<Transform USE='DialPlate-Tr'/>
</field>
<field accessType='initializeOnly' type='SFNode' name='DialFS'>
<FontStyle size='0.3'
justify='
"MIDDLE"'
/>
</field>
<field accessType='initializeOnly' type='SFNode' name='DialAp'>
<Appearance>
<Material diffuseColor='0 0 1'/>
</Appearance>
</field>
<field accessType='initializeOnly' type='SFNode' name='Scale1'>
<Transform USE='Scale1-Tf'/>
</field>
<field accessType='initializeOnly' type='SFNode' name='Scale2'>
<Transform USE='Scale2-Tf'/>
</field>
<![CDATA[ecmascript:
function initialize () {

var dial = new MFNode ();
var r = 1;

// 1 から 12 の文字をセットする。
for (var i=1; i<=12; i++) {

var Sp = new SFNode ( 'Shape { geometry Text {} }' );
Sp.appearance = DialAp;
Sp.geometry.fontStyle = DialFS;
Sp.geometry.string[0] = i;

var ang = 2 * Math.PI * i / 12;
var x = r * Math.sin ( ang );
var y = r * Math.cos ( ang ) - 0.1;

var Tf = new SFNode ( 'Transform {}' );
Tf.translation = new SFVec3f ( x, y, 0 );
Tf.children[0] = Sp;

dial[dial.length] = Tf;

}

// 60個の目盛りを付ける。
for (var i=0; i<60; i++) {

var ang = 2 * Math.PI * i / 60;

var Tf = new SFNode ( 'Transform {}' );
Tf.rotation = new SFRotation ( 0, 0, 1, ang );

// 5つ置きに大きな目盛りにする。
Tf.children[0] = ( i % 5 == 0 )? Scale1 : Scale2;

dial[dial.length] = Tf;

}

// 文字盤に数字と目盛りをセットする。
DialPlate.children = dial;

}
]]>
</Script>

<Transform DEF='SecondHand-Tf'>
<Transform translation='0 0.4 0.12'>
<Shape>
<Appearance>
<Material diffuseColor='0 0 0'/>
</Appearance>
<Cylinder radius='0.01' height='1.4'/>
</Shape>
</Transform>
</Transform>
<Transform DEF='MinuteHand-Tf'>
<Transform translation='0 0.47 0.12'>
<Shape>
<Appearance DEF='Hand-Ap'>
<Material diffuseColor='1 0 0'/>
</Appearance>
<Cylinder radius='0.02' height='1'/>
</Shape>
</Transform>
</Transform>
<Transform DEF='HourHand-Tf'>
<Transform translation='0 0.3 0.12'>
<Shape>
<Appearance USE='Hand-Ap'/>
<Cylinder radius='0.02' height='0.8'/>
</Shape>
</Transform>
</Transform>
<TimeSensor DEF='TiS' loop='TRUE'/>
<Script DEF='Time-Sc'>
<field accessType='inputOnly' type='SFFloat' name='set_fraction'/>
<field accessType='outputOnly' type='SFRotation' name='rotation_sec'/>
<field accessType='outputOnly' type='SFRotation' name='rotation_min'/>
<field accessType='outputOnly' type='SFRotation' name='rotation_hor'/>
<field accessType='initializeOnly' type='SFRotation' name='rotinit' value='0 0 -1 0'/>
<field accessType='initializeOnly' type='SFFloat' name='oldS' value='0'/>
<![CDATA[ecmascript:
function initialize () {

// 針の回転軸を初期化する。
rotation_sec = rotinit;
rotation_min = rotinit;
rotation_hor = rotinit;

}
function set_fraction () {

// 現在時刻を得る。
var d = new Date();
var s = d.getSeconds();
var m = d.getMinutes();
var h = d.getHours();

// 秒の変化がないならば、負荷軽減のためにこの関数を終える。
if (s == oldS) return;
oldS = s;

// 3本の針の回転角をセットする。
rotation_sec.angle = 2 * Math.PI * s / 60;
rotation_min.angle = 2 * Math.PI * ( m / 60 + s / 3600);
rotation_hor.angle = 2 * Math.PI * ( h / 12 + m / 720);

}
]]>
</Script>
<ROUTE fromNode='TiS' fromField='fraction_changed' toNode='Time-Sc' toField='set_fraction'/>
<ROUTE fromNode='Time-Sc' fromField='rotation_sec' toNode='SecondHand-Tf' toField='rotation'/>
<ROUTE fromNode='Time-Sc' fromField='rotation_min' toNode='MinuteHand-Tf' toField='rotation'/>
<ROUTE fromNode='Time-Sc' fromField='rotation_hor' toNode='HourHand-Tf' toField='rotation'/>
</Scene>
</X3D>