ball_v2_1_00.x3d source
<?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 (f) {

// fraction の変化量を得る。
var df = f - oldF;
if ( df < 0 ) df++;
oldF = f;

// 赤球の新しい位置をセットする。
posBall = moveVec.multiply(df).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>