sheep.wrl source
#VRML V2.0 utf8

# 視点
Viewpoint {
position 0 30 75
orientation -1 0 0 0.45
description "vp0"
}
Viewpoint {
position 0 50 40
orientation -1 0 0 1.0
description "vp1"
}
Viewpoint {
position 0 25 20
orientation -1 0 0 1.0
description "vp2"
}

# ナビゲーション情報
NavigationInfo {
type "EXAMINE"
headlight FALSE
}

# 太陽光
DirectionalLight {
direction -1 -1 -1
ambientIntensity 0.8
}

# 背景
Background {
skyAngle [
1.4 1.57 1.58
]
skyColor [
0.3 0.3 1.0
0.4 0.4 1.0
0.6 0.6 1.0
0.2 0.8 0.2
]
}

# 地面
Transform {
translation 0 -0.05 0
children [
Shape {
appearance Appearance {
material Material {
diffuseColor 0.2 0.8 0.2
}
texture ImageTexture {
url "green.png"
}
}
geometry Box {
size 100 0.1 100
}
}
DEF ThS TouchSensor {}
]
}

# 羊が追加される場所
DEF Sheeps-Gp Group {}


DEF AddSheep-Sc Script {
eventIn SFVec3f set_hitPoint
eventIn SFTime touchTime
eventIn MFNode set_sheeps
field SFNode SheepsGp USE Sheeps-Gp # 羊達のグループ
field MFString sheepUrl "proto_sheep.wrl" # 羊のプロトタイプとインスタンス
field SFVec3f hitPoint 0 0 0 # カーソルが地面に触れた位置
directOutput TRUE
url "javascript:

function set_hitPoint (vec) {

hitPoint = vec;

}

function touchTime () {

Browser.createVrmlFromURL( sheepUrl, SheepsGp, 'addChildren' );

}

function set_sheeps (sp) {

// (1)
var id = sp.length - 1;
var packet = new MFFloat();

packet[0] = id;
packet[1] = hitPoint.x;
packet[2] = 0;
packet[3] = hitPoint.z;

sp[id].packet_in = packet;

// (2)
for ( var i = 0; i < id; i++ ) {

Browser.addRoute( sp[i], 'packet_out', sp[id], 'packet_in' );
Browser.addRoute( sp[id], 'packet_out', sp[i], 'packet_in' );

}

}

"
# (1) 最後に追加された羊に対して、IDナンバーと地面をクリックした位置を与える。
# IDナンバーは最初の羊が 0 であり、以降羊が追加されるごとに 1 づつ増える。
# (2) 追加された羊が2匹目以降( id > 0 )ならば、既にいる羊たちとデータ交換を行うための ROUTE を増やす。
}

ROUTE ThS.hitPoint_changed TO AddSheep-Sc.set_hitPoint
ROUTE ThS.touchTime TO AddSheep-Sc.touchTime
ROUTE Sheeps-Gp.children TO AddSheep-Sc.set_sheeps