<?xml version="1.0" encoding="UTF-8"?>
<X3D>
<Scene>
<Viewpoint/>
<NavigationInfo
type='
"EXAMINE"'
/>
<!-- red ball -->
<Transform DEF='Ball-Tf'>
<Shape>
<Appearance>
<Material diffuseColor='1 0 0'/>
</Appearance>
<Sphere radius='0.2'/>
</Shape>
</Transform>
<!-- blue field -->
<Transform>
<Shape>
<Appearance>
<Material diffuseColor='0 0 1' transparency='0.6'/>
</Appearance>
<Box size='5 5 0.05'/>
</Shape>
</Transform>
<TimeSensor DEF='TiS' loop='TRUE'/>
<Script DEF='Sc'>
<field accessType='inputOnly' type='SFFloat' name='set_fraction'/>
<field accessType='outputOnly' type='SFVec3f' name='posBall'/>
<field accessType='initializeOnly' type='SFVec3f' name='moveVec' value='0 0 0'/>
<field accessType='initializeOnly' type='SFFloat' name='oldF' value='0'/>
<![CDATA[ecmascript:
function initialize () {
// 赤球の進行方向をセットする。
moveVec.x = Math.random() * 2 - 1;
moveVec.y = Math.random() * 2 - 1;
moveVec.z = 0;
// 赤球のスピードを 1 にセットする。
moveVec = moveVec.normalize();
// 赤球の位置をセットする。
posBall.x = Math.random() * 2 - 1;
posBall.y = Math.random() * 2 - 1;
posBall.z = 0;
}
function set_fraction () {
// フレームレートの逆数を得る。
var fps = Browser.getCurrentFrameRate();
var spf = ( fps > 0 ) ? 1 / fps : 0;
// 赤球の新しい位置をセットする。
posBall = moveVec.multiply(spf).add(posBall);
// もし赤球が青箱の外に出るならば、進行方向を変えて箱の内側に移す。
if ( posBall.x > 2.3 || posBall.x < -2.3 ) {
moveVec.x = -moveVec.x;
posBall.x = Math.max( -2.3, Math.min( 2.3 , posBall.x ));
}
if ( posBall.y > 2.3 || posBall.y < -2.3 ) {
moveVec.y = -moveVec.y;
posBall.y = Math.max( -2.3, Math.min( 2.3 , posBall.y ));
}
}
]]>
</Script>
<ROUTE fromNode='TiS' fromField='fraction_changed' toNode='Sc' toField='set_fraction'/>
<ROUTE fromNode='Sc' fromField='posBall' toNode='Ball-Tf' toField='translation'/>
</Scene>
</X3D>