[ VRMLaboR Home | Script | Prototype | Advanced ]

VRMLScriptの言語仕様

 VRMLScriptとは、VRMLのためのJavaScriptのサブセットである。JavaScript をま ねて、VRMLに必要なものだけ残したものと考えてよい。ビルドインオブジェクトとし て(中に構築されたデータ型として)VRMLデータタイプをサポートしている。

ここでは、かいつまんでVRMLScriptの言語仕様について説明しよう。

VRMLScriptがJavaを使うより良い点として次のことがあげられる。

  • URLを分割することなく、VRMLファイル内にスクリプトソースとして含めることが できる。
  • すべてのVRML97データ型が直接内部に構築されてサポートされている。
  • JavaScriptのMath(数値計算)、String(文字列)オブジェクトをサポートしてい る。
  • スカラデータ(SFTime, SFInt32, SFFloat, SFBool)は参照するだけで、直接型変換し てくれる。
オブジェクト

 オブジェクト(object)とは、ここではVRMLのためのデータ型である。 オブジェクト言語でいうところの「オブジェクト」のことである。
 VRMLのデータは、プロパティ(properties)と、メソッド(methods)のふたつを持っ ている。(両方そろってないものもある。)
プロパティとは値のことである。たとえば、SFVec3f 型のオブジェクトは、x,y,zの 3つのプロパティを持つ。

たとえば、field SFVec3f vec 0 0 0 と定義すれば、
    

	x = vec.x;
	y = vec.y;
	z = vec.z;

というふうに、x,y,zの値を参照することができる。また、

	x = vec[0];
	y = vec[1];
	z = vec[2];

と言う書き方も可能である。

  メソッドとは関数のことである。たとえばMathオブジェクトには、sin(),cos()など のメソッドを持っていて、Math.sin(r)というふうに参照できる。

変数

VRMLScriptの中の変数はオブジェクトのインスタンスである。
変数にはローカル(local)変数グローバル(grobal)変数がある。スクリプトノード のフィールド、イベントアウトで定義された変数は、すべてグローバル変数である。 つまり、VRMLscriptの中にいくつfunctionがあっても、それを飛び超えて変数の値は 保存されているのだ。
一方、ローカル変数の定義は簡単で、あるfunction の中で初めて出てくる名前が、 もうローカル変数である。
変数の定義はいらない。変数の型は、その変数に代入している値の型で決まってしま う。

ステートメント

命令文はC/C++やJavaScriptと同様である。
if, else, for, while, return, break, continueなどが使える。
演算子としては、=, +, -, *, /, ++, --, ==など、これも同様なので、ここでは説明しない。

VRMLScript では、JavaScript同様、newという構成子(constructor)が使える。
たとえば、SFVec3f 型のvec に対して、

vec = new SFVec3f (1, 0, 0);

というふうに使う。

コメント文は、前に//を入れるとよい。

イベントイン

 スクリプトノードに定義された、イベントイン(eventIn)フィールドは、同じ名前 のfunctionに渡される。


   Script {
	eventIn SFBool start
	url "vrmlscript:
		function start (value, timestamp) { ..... }"
   }

実際の値はvalueの中にはいる。

イベントアウト

イベントアウト(eventOut)は、スクリプトノードのフィールドに定義されたグローバ ル変数であるが、値を入れられるとイベントを出力する。


  Script {
	eventIn SFBool start
	eventOut SFBool out
	url "vrmlscript:
	function start (value, ts)
	{
		out = value;
	}"
  }

out がvalueにアサインされて、イベントを出力する。

ファンクションコール

 VRMLScriptでも、ファンクションコール(関数呼び出し)的なことはできるのだが 、C/C++やJavaのような自由度はない。
まず、引数引き渡しをしないようなので、すべてグローバル変数に定義しておく必要 がある。
呼び出される関数は、呼び出されるより前に定義されていないければならない。


   url "vrmlscript:
	function call( ) { ....... }
	function func(value, ts)
	{
		........
		call( );
   }"

call()という関数がfuncの中で呼び出されている。
後処理をいくつかのイベントインの後に必ずする、といった場合に使用すれば便利で ある。

Mathオブジェクト

 VRMLScriptではJavaScript同様、Mathオブジェクトが使える。これは数値計算に便 利である。

良く使うプロパティ(値)は、

Math.PI = 3.141592...(円周率)

良く使うメソッド(関数)は、

sin(), cos(), tan(), sqrt(), pow(), random(), abs()

あたりだろうか?
Math.sin(1.0) というふうに使う。