VRML with JavaScript Tutorial

戻る はじめに

オブジェクトについて

VRML の Script ノードで扱える JavaScript は、以下のオブジェクトが独自に追加されています。 
Browser オブジェクト
VRMLブラウザーとの情報のやりとりや、VRMLデータの追加や置換などの機能があります。
Browser オブジェクト


フィールドオブジェクト
VRMLのフィールド値をスクリプトで扱う為のオブジェクトです。
SFColor オブジェクト
SFImage オブジェクト
SFNode オブジェクト
SFRotation オブジェクト
SFVec2f オブジェクト
SFVec3f オブジェクト
MF型オブジェクト


VrmlMatrix オブジェクト
4×4行列を扱うためのオブジェクトです。
VrmlMatrix オブジェクト
オブジェクト と メソッド と プロパティ
オブジェクトを言い表すのは難しいのですが、 「ある目的のために数種類の命令(メソッド)を受け付け、数種類のデータ(プロパティ)を維持するモノ」  といったところでしょうか。

例えば foo オブジェクトの baa メソッドを機能させるには、ピリオド ( . ) を挟んで foo.baa() と記述します。 () の中には引数が入るタイプのメソッドもあります。  メソッドには実行結果として「帰り値」を返すタイプと、何も値を返さないタイプがあります。

foo オブジェクトの buu プロパティを読み書きする場合は foo.buu と記述します。  () はいりません。

メソッドの帰り値やプロパティがオブジェクトであり、そのオブジェクトがメソッドもしくはプロパティを持っているとしたら、
foo.baa().iroiro().arekore のように続けて記述することもできます。
以下の表中の帰り値の型引数の型の説明にある MFNodeMFString などは、その型のオブジェクトであることを示します。

Browser オブジェクト

VRMLブラウザーとの情報のやりとりや、VRMLデータの追加や置換などの機能があります。
このオブジェクトは new 演算子で生成する必要はありません。
また、このオブジェクトはプロパティを持ちません。

メソッド
帰り値の型 メソッド 引数の型 機能
文字列 getName()
VRMLブラウザーの名前を返します。
文字列 getVersion()
VRMLブラウザーのバージョンを返します。
数値 getCurrentSpeed()
ビューアの移動速度を返します。(*1)
数値 getCurrentFrameRate()
フレームレイト(1秒間に表示を更新した回数)を返します。 (*2)
文字列 getWorldURL()
表示中のURLを返します。
なし replaceWorld( nodes ) nodes : MFNode 現在表示中のVRMLを nodes に置き換えます。
MFNode createVrmlFromString( vrmlSyntax ) vrmlSyntax : 文字列 VRMLのコードが記述された文字列 vrmlSyntax からVRMLノードを生成します。(*3)
なし createVrmlFromURL( url, node, event ) url : MFString
node : SFNode
event : 文字列
url で示されたVRMLファイルからVRMLノード ( MFNode ) を生成します。 生成されたノードは node の event にイベントされます。(*4)
なし addRoute( fromNode, fromEventOut, toNode, toEventIn ) fromNode : SFNode
fromEventOut : 文字列
toNode : SFNode
toEventIn : 文字列
新しく ROUTE を追加します。
なし deleteRoute( fromNode, fromEventOut, toNode, toEventIn ) fromNode : SFNode
fromEventOut : 文字列
toNode : SFNode
toEventIn : 文字列
既存の ROUTE を削除します。
なし loadURL( url, parameter ) url : MFString
parameter : MFString
url で示されたファイル(VRMLとは限らない)をロードします。 parameter は「キーワード = 値」で示し、ロード先のターゲットなどを指定します。
なし setDescription( description ) description : 文字列 description を Webブラウザーのステータスバーに表示します。

(*1) CosmoCortona の場合、ビューアの進行方向に関わらず正数を返しますが、Contact 5.1 / 6.1 の場合、後退すると負数を返します。  GLView 4.4 の場合、NavigationInfo ノードの speed フィールドの値を返します。
(*2) Cosmo の場合、実行環境によっては最大値が 200、それ以上の場合は Infinity を返します。  Cortona の場合、表示開始直後の約1秒間は 0.0 を返します。
(*3) 参照:ノードの生成 - 文字列からノード生成
(*4) 参照:ノードの生成 - 文字列以外からノード生成

フィールドオブジェクト

SFColor オブジェクト

色を表すオブジェクトです。
新規生成
生成 引数の型 説明
new SFColor( r, g, b ) r, g, b : 数値 各引数は 0.0 以上 1.0 以下の実数であり、RGBの各要素の強さです。
new SFColor()
new SFColor( 0.0, 0.0, 0.0 ) と同じです。

プロパティ
プロパティ 説明
数値 r 色の赤成分の強さです。
数値 g 色の緑成分の強さです。
数値 b 色の青成分の強さです。
例えば変数 cSFColor オブジェクトが入っている場合、c[0], c[1], c[2] でも各プロパティにアクセスできます。

メソッド
帰り値の型 メソッド 引数の型 機能
なし setHSV( h, s, v ) h, s, v : 数値 色相(hue) 彩度(saturation) 明度(value) で表された色をこのオブジェクトにセットします。 各引数は 0 以上 1 以下の実数です。
配列[3] getHSV()
この色オブジェクトをHSVで返します。 帰り値は3つの要素を持つ配列オブジェクトであり、それぞれに数値が入ります。 (*1)
文字列 toString()
r, g, b の値をUTF-8形式の文字列で返します。

(*1) a = c.getHSV(); とした場合、a[0],a[1],a[2] を読むと H,S,V の値を得ることができます。  a.constructor の値を見てみると、CosmoCortona ならば a は Array オブジェクトだと分かりますが、Contact の場合は不明です。  Contact の場合は a.length で要素数を調べることができないなど、一般的な Array オブジェクトとは違うようです。

SFImage オブジェクト

ピクセルテクスチャーの画像オブジェクトです。
新規生成
生成 引数の型 説明
new SFImage( x, y, comp, array ) x, y, comp : 数値
array : MFInt32
x, y は 1 以上の整数であり、画像の横と縦のピクセル数です。
comp は 1 から 4 の整数であり、1 ピクセル辺りのデータ量です。
array は x × y 個の要素を持つ MFInt32 オブジェクトであり、ピクセルごとの色(と透明度)が入ります。

プロパティ
プロパティ 説明
数値 x 画像の横のピクセル数です。
数値 y 画像の縦のピクセル数です。
数値 comp 1 ピクセル辺りのデータ量(byte)です。
comp=1 : モノクロ256段階
comp=2 : モノクロ256段階 + 透明度256段階
comp=3 : フルカラー1677万色
comp=4 : フルカラー1677万色 + 透明度256段階
MFInt32 array ピクセルごとの色(と透明度)データです。
Cosmo の場合、各プロパティを正しく読み込むことができません。  書き込みは array プロパティに対してのみ行えます。
Cortona ならば、例えば変数 iSFImage オブジェクトが入っている場合、 i[0], i[1], i[2], i[3] でも各プロパティにアクセスできます。  但し読み込みのみ可能であり書き換えはできません。
Contactの場合、各プロパティは読み込みのみ機能します。  例えば変数 iSFImage オブジェクトが入っている場合、i[0], i[1], i[2], i[3]・・・ は array プロパティの各要素へのアクセスとなります。  (読み込みのみ)

メソッド
帰り値の型 メソッド 引数の型 機能
文字列 toString()
x, y, comp, array の値をUTF-8形式の文字列で返します。

SFNode オブジェクト

VRMLのノードを表すオブジェクトです。
新規生成
生成 引数の型 説明
new SFNode( vrmlstring ) vrmlstring : 文字列 vrmlstring はVRMLのコードが記述された文字列です。
よく似た機能を持っている Browser.createVrmlFromString( vrmlSyntax )MFNode オブジェクトを生成します。
参照:ノードの生成 - 文字列からの生成

プロパティ
プロパティ 説明
フィールドによる フィールド名 オブジェクト(ノード)が持つフィールドです。
例えば変数 nSFNode オブジェクトが入っている場合、n.fieldName で、そのノードのフィールドにアクセスできます。
どの様なプロパティ(フィールド)を持つかは、そのノード次第です。
プロパティ(フィールド)により、とアクセスの種類 ( 読込のみ、書込のみ、読み書き共に不可、読み書き共に可 ) が異なります。

メソッド
帰り値の型 メソッド 引数の型 機能
文字列 toString()
このオブジェクトのノード名をUTF-8形式の文字列で返します。

SFRotation オブジェクト

2つのベクトルと回転値の関係 任意の3次元ベクトルを軸とした回転を表すオブジェクトです。
formVector から toVector への回転を表す回転軸はその2つのベクトルと直交します。  右手を握って親指だけを立てると、親指は回転軸、親指以外の指は回転の向きに見立てることができます。  回転角は formVector と toVector のなす角であり、弧度法(ラジアン単位)で表されます。
新規生成
生成 引数の型 説明
new SFRotation( x, y, z, angle ) x, y, z, angle : 数値 各引数は実数であり、回転軸のxyz成分と回転角度です。
new SFRotation( axis, angle ) axis : SFVec3f
angle : 数値
axis は回転軸であり、angle は回転角度です。
new SFRotation( fromVector, toVector ) fromVector : SFVec3f
toVector : SFVec3f
fromVector から toVector への回転を表すオブジェクトが生成されます。
new SFRotation()
new SFRotation( 0.0, 1.0, 0.0, 0.0 ) と同じです。 (*1)

(*1) VRMLブラウザーにより、生成されるオブジェクトの回転軸が異なります。  Cortona仕様と同じくy軸を中心とした回転 ( 0, 1, 0, 0 ) が生成されますが、 Cosmo Contact では Transform ノードの rotation フィールドなどの初期値と同じくz軸を中心とした回転 ( 0, 0, 1, 0 ) が生成されます。

プロパティ
プロパティ 説明
数値 x 回転軸の x 成分です。
数値 y 回転軸の y 成分です。
数値 z 回転軸の z 成分です。
数値 angle ラジアン単位の回転角度です。
例えば変数 rSFRotation オブジェクトが入っている場合、r[0], r[1], r[2], r[3] でも各プロパティにアクセスできます。

メソッド
帰り値の型 メソッド 引数の型 機能
SFVec3f getAxis()
このオブジェクトの回転軸を返します。
SFRotation inverse()
このオブジェクトの逆回転を返します。(*1)
SFRotation multiply( rot ) rot : SFRotation このオブジェクトに rot を掛けた回転オブジェクトを返します。(*2)
SFVec3f multVec( vec ) vec : SFVec3f このオブジェクトで vec を回転させた後のベクトルを返します。
なし setAxis( vec ) vec : SFVec3f このオブジェクトに回転軸 vec をセットします。
SFRotation slerp( dest, t ) dest : SFRotation
t : 数値
このオブジェクトと dest との間の補間値を返します。 t は 0 以上 1 以下の実数であり、t = 0 ならばこのオブジェクト、t = 1 ならば dest を返します。(*3)
文字列 toString()
x, y, z, angle の値をUTF-8形式の文字列で返します。

(*1) Cosmo Cortona は angle の符号が反転した値を返しますが、 Contact では回転軸が符号反転し単位ベクトル化した値を返します。
(*2) VRMLブラウザーにより結果が異なりますので注意してください。  Cortonar.multiply( rot )Cosmo Contact での rot.multiply( r ) に相当します。  検証用VRML ソース クリックすると回転アニメを開始しますが、Cortona とそれ以外のブラウザーとでは、アニメの内容が異なります。  VRMLブラウザーごとの結果比較
(*3) 仕様では 0 <= t <= 1 となっていますが、何れのVRMLブラウザーにおいても、 t が 0 未満 もしくは 1 以上の場合でも適切な値を返します。

SFVec2f オブジェクト

2次元ベクトルを表すオブジェクトです。
新規生成
生成 引数の型 説明
new SFVec2f( x, y ) x, y : 数値 各引数は実数であり、ベクトルの xy 成分です。
new SFVec2f()
new SFVec2f( 0.0, 0.0 ) と同じです。

プロパティ
プロパティ 説明
数値 x 2次元ベクトルの x 成分です。
数値 y 2次元ベクトルの y 成分です。
例えば変数 vSFVec2f オブジェクトが入っている場合、v[0], v[1] でも各プロパティにアクセスできます。

メソッド
帰り値の型 メソッド 引数の型 機能
SFVec2f add( vec ) vec : SFVec2f このオブジェクトに vec を加算したベクトルを返します。
SFVec2f divide( n ) n : 数値 このオブジェクトの xy 成分を n で割ったベクトルを返します。
数値 dot( vec ) vec : SFVec2f このオブジェクトと vec との内積を返します。
数値 length()
このオブジェクトのベクトルの長さを返します。
SFVec2f multiply( n ) n : 数値 このオブジェクトの xy 成分を n 倍したベクトルを返します。
SFVec2f normalize()
このオブジェクトの単位ベクトルを返します。
SFVec2f subtract( vec ) vec : SFVec2f このオブジェクトから vec を減算したベクトルを返します。
文字列 toString()
x, y, z の値をUTF-8形式の文字列で返します。

Cosmo には negate() (符号反転)メソッドがあります。

SFVec3f オブジェクト

3次元ベクトルを表すオブジェクトです。
新規生成
生成 引数の型 説明
new SFVec3f( x, y, z ) x, y, z : 数値 各引数は実数であり、ベクトルの xyz 成分です。
new SFVec3f()
new SFVec3f( 0.0, 0.0, 0.0 ) と同じです。

プロパティ
プロパティ 説明
数値 x 3次元ベクトルの x 成分です。
数値 y 3次元ベクトルの y 成分です。
数値 z 3次元ベクトルの z 成分です。
例えば変数 vSFVec3f オブジェクトが入っている場合、v[0], v[1], v[2] でも各プロパティにアクセスできます。

メソッド
帰り値の型 メソッド 引数の型 機能
SFVec3f add( vec ) vec : SFVec3f このオブジェクトに vec を加算したベクトルを返します。
SFVec3f cross( vec ) vec : SFVec3f このオブジェクトと vec との外積を返します。
SFVec3f divide( n ) n : 数値 このオブジェクトの xyz 成分を n で割ったベクトルを返します。
数値 dot( vec ) vec : SFVec3f このオブジェクトと vec との内積を返します。
数値 length()
このオブジェクトのベクトルの長さを返します。
SFVec3f multiply( n ) n : 数値 このオブジェクトの xyz 成分を n 倍したベクトルを返します。
SFVec3f negate()
このオブジェクトの xyz 成分の符号を反転させたベクトルを返します。
SFVec3f normalize()
このオブジェクトを正規化した単位ベクトルを返します。
SFVec3f subtract( vec ) vec : SFVec3f このオブジェクトから vec を減算したベクトルを返します。
文字列 toString()
x, y, z の値をUTF-8形式の文字列で返します。

MF型オブジェクト

MF ( Multiple-valued Field ) 型フィールドをスクリプトで扱う為に、以下のオブジェクトが用意されています。
MFColor, MFFloat, MFInt32, MFNode, MFRotation, MFString, MFTime, MFVec2f, MFVec3f
これらは同種の SF ( Single-valued Field ) 型フィールドオブジェクトを要素に持つ配列です。  MF型オブジェクトは Array オブジェクトとは違い、各要素には そのSF型フィールドオブジェクトしか入りません。

以下は MFColor オブジェクトの例です。
新規生成
生成 引数の型 説明
new MFColor( c1, c2, ..... ) c1, c2, ..... : SFColor 各引数は生成するオブジェクトの SF型フィールドオブジェクトです。
new MFColor()
要素数 ( length ) は 0 となります。
MFFloat, MFInt32, MFTime オブジェクトを生成する場合、引数の型は数値です。
MFString オブジェクトを生成する場合、引数の型は文字列です。

プロパティ
プロパティ 説明
数値 length このオブジェクトの配列要素数です。
例えば変数 mcMFColor オブジェクトが入っている場合、mc[0], mc[1], ..... で各要素 ( SFColor オブジェクト) にアクセスできます。

メソッド
帰り値の型 メソッド 引数の型 機能
文字列 toString()
このオブジェクトの全要素をUTF-8形式の文字列で返します。
MF型オブジェクトの使用例
例 1) MFColor オブジェクトが入っている変数 mc から、最初の要素の緑成分の強さを変数 green に入れる場合
green = mc[0].g; もしくは green = mc[0][1];
例 2) MFVec3f オブジェクトが入っている変数 mvec の全要素を単位ベクトル化する場合
for ( i=0; i<mvec.length; i++ ) mvec[i] = mvec[i].normalize();

 もしくは

i=0; while (i<mvec.length) { mvec[i] = mvec[i].normalize(); i++; }

MFVec3f オブジェクトが入っている変数 mv の要素のx成分に 1 を加える際、 mv[i].x++; もしくは mv[i][0]++; という書き方をすると Contact ではエラーとなります。  この不具合を回避するには mv[i].x += 1; もしくは mv[i][0] += 1; という書き方をしてください。
エラーが出る例 ソース  この例は黄色の球をクリックすると右に移動します。  CosmoCortona は何ら問題はありませんが、 Contact では球をクリックするとエラーが表示されます。 

VrmlMatrix オブジェクト

4×4行列を扱うためのオブジェクトです。
新規生成
生成 引数の型 説明
new VrmlMatrix( f11, f12, f13, f14,
f21, f22, f23, f24,
f31, f32, f33, f34,
f41, f42, f43, f44 )
f11, f12, ..... f44 : 数値 各引数は実数であり、行列を構成するための成分です。
new VrmlMatrix()
単位行列を生成します。

Contact では引数を指定して新規生成できません。 引数を指定せず単位行列を生成してください。

このオブジェクトはプロパティを持ちません。

cortona ならば、例えば変数 vmVrmlMatrix オブジェクトが入っている場合、 vm[0][0], vm[0][1], .... ,vm[3][3] で各成分にアクセスできます。
CosmoContact は各成分に直接アクセスすることはできません。

メソッド
帰り値の型 メソッド 引数の型 機能
なし setTransform( translation, rotation, scale, scaleOrientation, center ) translation : SFVec3f
rotation : SFRotation
scale : SFVec3f
scaleOrientation : SFRotation
center : SFVec3f
Transform ノード関係のフィールド値をこのオブジェクトにセットします。  引数の数は 0 から 5 であり、引数がない場合は単位行列がセットされます。  無指定の引数は Transform ノードの初期値と同じ値がセットされます。
setTransform( translation, rotation, scale, scaleOrientation )
setTransform( translation, rotation, scale )
setTransform( translation, rotation )
setTransform( translation )
setTransform()
なし getTransform( translation, rotation, scale ) translation : SFVec3f
rotation : SFRotation
scale : SFVec3f
引数で指定したオブジェクトに、この行列オブジェクトを分解した値を返します。  引数が無い場合や null オブジェクトである場合、その値は返しません。  行列内の「投影」や「せん断」の情報は無視されます。(*1)
VrmlMatrix inverse()
この行列オブジェクトの逆行列を返します。
VrmlMatrix transpose()
この行列オブジェクトの転置行列を返します。
VrmlMatrix multLeft( matrix ) matrix : VrmlMatrix この行列オブジェクトの左から行列 matrix を掛けた結果の行列を返します。
VrmlMatrix multRight( matrix ) matrix : VrmlMatrix この行列オブジェクトの右から行列 matrix を掛けた結果の行列を返します。
SFVec3f multVecMatrix( vec ) vec : SFVec3f 行ベクトル vec にこの行列オブジェクトを掛けた結果のベクトルを返します。
SFVec3f multMatrixVec( vec ) vec : SFVec3f この行列オブジェクトに列ベクトル vec を掛けた結果のベクトルを返します。(*2)
文字列 toString()
このオブジェクトの全成分をUTF-8形式の文字列で返します。

(*1) CosmoCortona の場合は、getTransform() メソッドを使う前に引数の宣言を行う必要があります。
例えば、vm.getTransform( tr, ro, sc ); の各引数が未定義ならば tr = new SFVec3f(); ro = new SFRotation(); sc = new SFVec3f(); を事前に記述してください。
(*2) Cosmo Cortona の結果と Contact の結果が異なります。  Cosmo Cortona がオブジェクトに列ベクトル vec = ( x, y, z, 1 ) を掛けているのに対し、Contact( 1, x, y, z ) を掛けている様です。

このページのトップへもどる | 前へ 変数について | 次へ コンソールへの出力