複数図形の回転と傾斜


#VRML V1.0 ascii

DEF BackgroundImage Info{ string "star.gif" }

SpotLight {
	on		TRUE
	intensity	1
	color		1 1 1
	location	0 2 0
	direction	0 -1 0
	dropOffRate	0
	cutOffAngle	0
}

PerspectiveCamera {
	position	0 0 4
	orientation	0 0 0 0
	focalDistance	4
#	heightAngle	0
}     

Separator {
	SpinGroup {
		rotation 1 0 0 .03
		local FALSE

		SpinGroup {
			rotation 1 0 1 .04
			local TRUE

			Translation { translation 0.0 0.0 2.0 }
			DEF cube1 Group {
				Texture2 { filename "gon_ani.gif" } 
				Scale { scaleFactor 0.5 0.5 0.5 }
				Cube { }
			}
		}
	}
}

Separator {
	SpinGroup {
		rotation 1 0 0 .03
		local FALSE

		SpinGroup {
			rotation 1 0 1 .04
			local TRUE

			Translation { translation 0.0 0.0 -2.0 }
			USE cube1
		}
	}
}

SpinGroup {
	rotation -1 0 0 .02
	local TRUE

	Texture2Transform { scaleFactor  4 4 } 
	Texture2 { filename "wood.gif" } 
	Sphere { radius  1 }
}

Material {
	diffuseColor   1 0.1 0.1
	emissiveColor  0.5 0 0
	shininess      0.7
}

Separator {
	SpinGroup {
		rotation -1 0 0 .02
		local TRUE

		Translation { translation 1.5 0.0 0.0 }
		Rotation { rotation 1 1 0 3.14 }
		DEF cone1 Cone {
			parts ALL
			bottomRadius  0.5
			height 1
		}
	}
}

Separator {
	SpinGroup {
		rotation -1 0 0 .02
		local TRUE

		Translation { translation -1.5 0.0 0.0 }
		Rotation { rotation 1 -1 0 3.14 	}
		USE cone1
	}
}

このサンプルでは際立って新しいことはしてませんが、いくつか新しいnodeを使用していますので、その説明をします。

SpotLight { }
SpotLight nodeはその名の通りスポットライトです。他に何の説明も要らないとおもいます。但し、SpotLightはライトの位置によっては画面が真っ暗けになったりするので、気をつけましょう! 指定できるパラメータは以下の通り。

on TRUE <-- TRUEでライトオン、FALSEでライトオフ。
intensity 1 <-- 光の量。0から1までの間で指定する。
color 1 1 1 <-- 光の色。RGB方式で指定する。
location 0 2 0 <-- ライトの位置。x、y、z、のそれぞれの座標を指定。
direction 0 -1 0 <-- 光の方向。-1 0 0で手前から奥に向かって照らす指定。
dropOffRate 0 <-- 光の減衰率。光点からどれくらい離れると どれくらい光りが弱くなるかの設定。
cutOffAngle 0 <-- ライトが照らす範囲をラジアン角度(57.2958度)で指定する。
PerspectiveCamera { }
PerspectiveCamera nodeはwrlファイルが読み込まれた時点での視点を指定するnodeです。オブジェクトを下から見上げたように見せたいとか、斜に見せたいとかいうときに使います。カメラを動かしてその視点からVRMLの世界を見るということですね。 使えるパラメータは以下の通り。
position 0 0 4 <-- カメラの位置。x、y、zの座標で指定する。
orientation 0 0 0 0 <-- カメラの角度。x、y、zのどれかに1または-1を指定する。4桁目はラジアン角度。4桁目が0なら何も指定しないのと同じ。
focalDistance 4 <-- 焦点距離をメートルで指定する。カメラからどれくらいの距離にピントを合わせるかの指定。
heightAngle 0 <-- 垂直方向の可視角度をラジアン角度で指定する。狭くするとカメラがオブジェクトに接近し、大きくすると離れる。カメラの位置を指定するのと同じ機能。
ちなみに、PerspectiveCameraを指定して、positionを省略すると0、0、1のポジションにカメラが置かれる。

Scale { }
Scale nodeはオブジェクトのx、y、zそれぞれの方向への伸縮を定義できるnodeです。前のサンプルで説明したTransform nodeのscaleFactorの機能だけを切り出したnodeです。オブジェクトの変形させたいが、傾けたり、ひしゃげたりはさせなくてよいというときに使います。指定できるパラメータは、

scaleFactor 0.5 0.5 0.5
だけです。x、y、zはそれぞれの方向への伸縮を変更しのときを"1"として指定します。変更なしだからと言って、0を指定すると、その方向の厚みがなくなってしまうので気を付けましょう。

Material { }
Material nodeはオブジェクトの質感とか色味とかを指定するnodeです。指定できるパラメータは以下の通り。

diffuseColor1 0.1 0.1 <-- オブジェクトの地の色。
emissiveColor0.5 0 0 <-- オブジェクトの光の当たっていない部分の色。光が当たっている部分がdiffuseColorの色ならば、光の当たっていない部分に行くに従ってこの色に変わって行く。
ambientColor0 0 0 <-- 周囲の色からの反射を指定するらしい。はっきり言って、このパラメータは良くわかりません。
specularColor0 0 0 <-- 鏡のように光りを反射するときの色。オブジェクトの一番テカッている部分の色。通常この部分は白に指定するものらしいです。
shininess0.7 <-- どれくらいテカテカにするかの指定。0から1の間の数値を指定。
transparency0 <-- オブジェクトの透明度の指定。0から1の間の数値を指定。
実際に私が使用しているのは、diffuseColorとemissiveColorの二つくらいです。他のパラメータも使用して、もっと自分がイメージする質感に近づけようとしたことは何度もあるのですが、困ったことが一つあります。Material nodeの解釈がこれまたbrowserによって異なるということなのです。私の場合Netscape + LIVE3Dベータ2を使用してますが、この環境で自分の思い通りの色を作っても、他のbrowserで見るととんでもない色味になっているというわけです。そんな訳で無難な道を選んでしまうわけです。

Rotation { }
Rotation nodeが単独で使用されるのはこのサンプルが始めてだと思うので、説明しておきます。このnodeはオブジェクト(実は座標軸)を傾ける機能を持っています。以下のパラメータで傾きを指定します。

rotation 1 1 0 3.14
最初の3つ数字はx、y、z、それぞれの軸を現します。ここに0以外を指定するとその軸に対して右回りに傾けることを意味します。そして、どれくらい傾けるかを指定するのが最後の数字です。この4つ目の数字は角度を表すのですが、その表しかたが一筋縄ではいきません。ラジアンという角度の単位を使って現すのです。1ラジアンが57.2958度です。従って、動かしたい角度を57.2958で割った数字を書けばいいのです。たとえば、x軸を中心に90度傾けたければ、"1 0 0 1.57"と指定すればいいのです。
また、"-1"をx、y、zのところに指定するとそれぞれの軸に向かって左まわりの回転になります。
ここで、二つ注意すべきことがあります。一つはRotation nodeを使うと本当は図形ではなく、座標が傾くということです。つまり、"1 0 0 1.57"とした場合、x軸を中心としてz軸とy軸が90度、時計周りに傾くということです。したがって、ここでTranslation nodeを使ってオブジェクトをy軸方向(上下)に移動をさせようとすると、本来のz軸方向(前後)に動いてしまうということです。Rotation nodeを続けて使用するのはできる限り避けましょう。
もう一つは、Rotation nodeを使うと0、0、0の座標を支点にオブジェクトが回転します。つまり、Rotation nodeより前にTranslation nodeで図形を移動させておくと、そのオブジェクトは0、0、0を中心に指定した角度だけ傾くということです。中心を0、0、0に合わせられない図形を傾けるときには、先にRotation nodeで傾けてから、Translaiton nodeで距離を調節しましょう。結構複雑です。

DEF.....USE
DEFでnodeやGroupに名前を付けて、USEで再利用することをInstacing(インスタンスィング)と呼びます。同一図形を何度も書くのを裂け、データ量を減らし、既にクライアントにダウンロードされているnodeやGroupを再利用することによりデータ転送時間を減らすことができます。従って、DEFが先に指定されている必要があります。このサンプルでは、

DEF cone1 Cone { parts ALL bottomRadius 0.5 height 1 }
cone1という名前で、底面の半径が0.5m、高さが1m、すべての面が塗られた円錐を定義しています。その下で、"USE cone1"と指定してまったく同じ円錐をCone nodeを使わずに指定しています。
この他のnodeにもインスタンスィングは使用可能です。例えば、テクスチャを何種類か貼り付ける場合には、DEF Tex1 Texture2 { filename "ファイル名"} などと指定しておいて、USE Tex1と指定すれば、既にダウンロードされたテクスチャファイルを再利用するので、かなりの転送時間削減になります。
この後のサンプルでもDEF.....USEは何度か使用しています。その使い方も多少は参考になるかと思います。

このページの解説はここまでです。


戻る 次のサンプルへ メインページ