環境マッピング ( environment mapping ) は金属やガラスなどの物体に鏡の如く遠景が映り込んでいる様子を表現するためのテクスチャーの使い方の一種です。
最新のビデオゲームやPCゲームは言うに及ばず携帯電話の3Dでもこれに対応していますが、標準の VRML2.0 では対応されていません。
blaxxun Contact 3D や Cortona VRML Client は環境マッピングを行うためのノードを独自に追加して対応していますが、そのノードを使ったVRML作品はそのブラウザー専用となり Cosmo Player など他のブラウザーでは見ることができません。
プロトタイプ EnvironmentIndexedFaceSet は 主立ったVRML2.0対応ブラウザーに対して隔たりなく環境マッピングを実現します。
2006.8.3
- PROTO EnvironmentIndexedFaceSet を 1.4 にバージョンアップしました。( Octaga Player 2.0 に対応)
- 動作環境に動作確認がとれた VRML ブラウザーを追加しました。
updated 2006.8.2 first released 2002.5.6
Download
標準のVRML2.0で環境マッピングを表現する為のプロトタイプです。
フリーソフトウェア
- 特定のVRMLブラウザーに依存しません。
JavaScript ( VRMLScript ) に十分対応しているVRML2.0ブラウザーならば、このプロトタイプを使うことができます。
- ハードウエアのグラフィック機能を使っていません。
旧型のグラフィックチップでも問題なく使えます。 但し、3Dに対応していないグラフィックチップで使用した場合テクスチャーが荒く表示されます。
ソフトウェアによる実現のため処理が遅めです。 環境マッピングを施すポリゴン数は程々に押さえてください。
ポリゴン数が多いと初期化にも時間がとられます。
- 既存のVRML作品に少々手を加えるだけで対応できます。
このプロトタイプのフィールドは一部を除き IndexedFaceSet ノードと共通です。
Windows PCにインストールされた以下の
VRMLブラウザーで動作を確認しました。
- Cosmo Player 2.1
- Cortona VRML Client 3.1 / 4.1 / 4.2 / 5.0 / 5.1
- blaxxun Contact 5.1 / 5.3
- BS Contact VRML 6.1 / 6.2 / 7.0
- Octaga Player 2.0
- Pivoron Player 1.0
- GLView 4.4
VRMLブラウザーにより動作速度が異なります。 blaxxun Contact と BS Contact VRML が高速です。
GLView 4.4 はグラフィックチップに関わらずテクスチャーが荒く表示されます。
Corotna VRML Client 5.0 Beta release 128 ではこのプロトタイプは動作しませんが、
Beta 2 では動作することを確認しました。
- IndexedFaceSetノードが使われているVRML作品と、遠景の画像ファイルを用意してください。
EnvironmentIndexedFaceSet プロトタイプ(ファイル名 eifs.wrl)をそのVRML作品と同じフォルダに置いてください。
- VRML作品の2行目以降の出来るだけ上の位置に下記の EXTERNPROTO を追加してください。
- 使わないフィールドは削除していただいて結構です。 何のことか分からない場合はこのまま使ってください。
- eifs.wrl をこのVRML作品とは異なるフォルダに置く場合、一番下の行を変更しパスを指定してください。
- 環境マッピングを行う IndexedFaceSet ノードに texCoord と texCoordIndex フィールドが使われているならば、それを削除してください。
- 環境マッピングを行う IndexedFaceSet ノードを 以下のように書き換えてください。
変更前 |
geometry IndexedFaceSet |
変更後 |
geometry DEF EIFS EnvironmentIndexedFaceSet |
- DEF の後の定義名(この場合EIFS )は任意に名付けていただいて結構です。
- 複数の IndexedFaceSet に環境マッピングを施す場合は、それぞれ別の名前で定義してください。
- DEF による定義は必ず必要です。 既に定義されている場合はそのままそれを使っていただいて構いません。
- EnvironmentIndexedFaceSet の外観(Appearance)に 遠景の画像ファイルをテクスチャーとして書き足してください。
画像ファイル名が
foo.jpg である場合の例
Shape {
appearance Appearance {
texture ImageTexture { url "foo.jpg" }
}
geometry DEF EIFS EnvironmentIndexedFaceSet {
・・・・・
}
}
- VRMLの最終行に ProximitySensor ノードと、 ROUTE文を書き足してください。
ProximitySensor は1個でかまいませんが、ROUTE文は EnvironmentIndexedFaceSet 1個につき2行必要です。
EnvironmentIndexedFaceSet を EIFSで定義している場合の例
DEF PrS ProximitySensor { size 1000 1000 1000 }
ROUTE PrS.position_changed TO EIFS.set_position
ROUTE PrS.orientation_changed TO EIFS.set_orientation
2個の EnvironmentIndexedFaceSet を使っている場合の例
DEF PrS ProximitySensor { size 1000 1000 1000 }
ROUTE PrS.position_changed TO EIFS1.set_position
ROUTE PrS.orientation_changed TO EIFS1.set_orientation
ROUTE PrS.position_changed TO EIFS2.set_position
ROUTE PrS.orientation_changed TO EIFS2.set_orientation
- ProximitySensor のDEF定義名は任意で結構です。
- ProximitySensor の size は任意で結構ですが十分大きくしてください。
- ROUTE の TO の後の定義名は各 EnvironmentIndexedFaceSet で定義した名前に合わせて変えてください。
- ProximitySensor の size が小さい場合、または ROUTE が無い場合、マッピングが変化しません。
EnvironmentIndexedFaceSet が Transformノードの子ノードである場合の使い方
プロトタイプ名
EnvironmentIndexedFaceSet
フィールド
ピンク色の行のフィールドはこのプロトタイプオリジナルです。
白色の行のフィールドは IndexedFaceSet ノードとほぼ同じ仕様です。
入出力タイプ |
フィールド型 |
フィールド名 |
初期値 |
eventIn |
SFVec3f |
set_position |
|
eventIn |
SFRotation |
set_orientation |
|
exposedField |
MFString |
mode |
"NORMAL" |
exposedField |
SFBool |
realTime |
TRUE |
exposedField |
SFTime |
mappingInterval |
1 |
exposedField |
SFNode |
coord |
NULL |
field |
MFInt32 |
coordIndex |
[] |
field |
SFFloat |
creaseAngle |
0 |
field |
SFBool |
ccw |
TRUE |
field |
SFBool |
convex |
TRUE |
field |
SFBool |
solid |
TRUE |
exposedField |
SFNode |
color |
NULL |
field |
MFInt32 |
colorIndex |
[] |
field |
SFBool |
colorPerVertex |
TRUE |
eventIn |
MFInt32 |
set_colorIndex |
|
exposedField |
SFNode |
normal |
NULL |
field |
MFInt32 |
normalIndex |
[] |
field |
SFBool |
normalPerVertex |
TRUE |
eventIn |
MFInt32 |
set_normalIndex |
|
exposedField |
SFVec3f |
translation |
0 0 0 |
exposedField |
SFRotation |
rotation |
0 0 1 0 |
exposedField |
SFVec3f |
scale |
1 1 1 |
exposedField |
SFRotation |
scaleOrientation |
0 0 1 0 |
exposedField |
SFVec3f |
center |
0 0 0 |
texCoord, texCoordIndex, set_texCoordIndex, set_coordIndex
フィールドはありません。
set_position
- アバターの視点の位置( ProximitySensor の position_changed )をルートしてください。
set_orientation
- アバターの視線の向き( ProximitySensor の orientation_changed )をルートしてください。
mode
"NORMAL" | "CAMERASPACEREFLECTIONVECTOR"
- 環境マッピングのタイプを設定します。
"CAMERASPACEREFLECTIONVECTOR"
ならば blaxxun Contact 3D 専用ノードの
texCoord TextureCoordGen { mode "CAMERASPACEREFLECTIONVECTOR" }
と同様のマッピングを行います。
"CAMERASPACEREFLECTIONVECTOR"
の方が初期値 "NORMAL"
よりも若干高速です。
realTime
TRUE | FALSE
- テクスチャーコード計算の頻度を設定します。
FALSE
ならば計算頻度をTRUE
の半分にして、画質を犠牲にしつつ全体の処理を速くします。
mappingInterval
- 廃止されました。 Version 1.1 以上では機能しません。
solid
TRUE | FALSE
TRUE
に設定すると裏面の描画とテクスチャーコード計算が行わなわれない為、処理が速くなります。
color
- 普通の IndexedFaceSet でも同様ですが、color フィールドを使う場合、VRMLブラウザーにより表示内容が異なる場合があります。
- Cosmo Player, Cortona VRML Client, Pivoron Player の場合
テクスチャーがカラーならば、そのままテクスチャーで使われている色で表示され colorフィールドは無視されます。
テクスチャーがモノクロならば、colorフィールドの色がテクスチャーの白黒階調に合わせてブレンドされます。
- balxxun Contact 3D, GLView の場合
テクスチャーがカラーかモノクロかに関わらず、colorフィールドの色がテクスチャーにブレンドされます。
normal, normalIndex, normalPerVertex, set_normalIndex
- normal 関係のフィールドはマッピングに影響しません。
translation, rotation, scale, scaleOrientation, center
- Transformノードの子ノードである場合、Transformノードのフィールドと同じ値を指定もしくはルートしてください。
詳しい使い方はTransformノードの子ノードである場合を参照してください。
これらのフィールドは Version 1.2 で追加されました。
creaseAngle
によるマッピングと処理速度の違いを確認できます。
初期値の指定
Transformノードのフィールドに初期値を設定している場合、子ノードのEnvironmentIndexedFaceSetにも同じ値を指定してください。
(例)
Transform {
translation 2 5 10
rotation 0 1 0 3.141
children [
Shape {
geometry DEF EIFS EnvironmentIndexedFaceSet {
translation 2 5 10
rotation 0 1 0 3.141
coord Coordinate {・・・}
coordIndex ・・・・・・・
}
}
]
}
ROUTE制御
Transformノードをルート制御している場合、子ノードのEnvironmentIndexedFaceSetにも同じ制御を行ってください。
(例)
DEF Tf Transform {
children [
Shape {
geometry DEF EIFS EnvironmentIndexedFaceSet {
coord Coordinate {・・・}
coordIndex ・・・・・・・
}
}
]
}
DEF TiS TimeSensor {・・・}
DEF PI PositionInterpolator {・・・}
ROUTE TiS.fraction_changed TO PI.set_fraction
ROUTE PI.value_changed TO Tf.translation
ROUTE PI.value_changed TO EIFS.translation
 |
下に並んでいる球をクリックすると星が5秒間アニメーションします。
● 星が平行移動します。
● 星がY軸を中心に回転します。
● 星が縮小拡大します。
● 星がZ軸を中心に傾き(?)ます。
● + ●の組み合わせ以外は同時に実行できます。
■をドラッグすると、半透明の紫色の球が移動します。
その球の中心が拡大縮小、回転の中心となります。
紫色の球は初期状態では星の内側に隠れています。
|
Star Animation |
(7kB + PROTO 4kB + texture 4kB) |
複数のTransformノードが入れ子になっている場合
多関節など Transform ノードが複数の入れ子になっている場合、子ノードのEnvironmentIndexedFaceSetには各Transformノードのフィールド値を加算もしくは掛け算した合計を入れてください。(centerフィールドは除く)
(例)
Transform {
translation 0 5 0
rotation 0 1 0 1.571
scale 2 2 1
center 0 5 0
children [
Transform {
translation 0 0 10
rotation 1 0 0 1.571
scale 2 0.5 0.5
center 0 8 0
children [
Shape {
geometry DEF EIFS EnvironmentIndexedFaceSet {
translation 0 5 10
rotation 0.5773 0.5773 -0.5774 2.0946
scale 4 1 0.5
center 0 8 0
coord Coordinate {・・・}
coordIndex ・・・・・・・
}
}
]
}
]
}
- translation は足し算
rotationは掛け算(順番に注意)
scaleは因数(x,y,z)それぞれを掛け算
centerは1つ親のTransformと同じ値でいいかと思います。
scaleOrientationは・・・うーん、どうすりゃいいんだろ。
- rotation どうしの掛け算はGoGoGoさん制作のツール Rotation Multiplier で求めることができます。
- ROUTE制御する場合はスクリプトで計算してEnvironmentIndexedFaceSetに入れる値を求める必要があります。
 |
黄色の球を始点とした多関節のアームです。
繋がった各パーツをドラッグすると、球の部分を関節にして回転します。
一番下の黄色いパーツをドラッグするとアーム全体が平行移動します。
(殆ど検証をしてませんので、もしかしたらそれっぽく見えているだけかもしれません・・・。)
|
Arm with joints |
(8kB + PROTO 4kB + texture 14kB) |
- CoordinateInterpolator などによるモーフィングアニメはマッピングに影響しませんので行わないようにしてください。
- 円錐など向きが異なる多数の面が1個の頂点を共有している場合、正しく表示されない可能性があります。
- このプロトタイプは営利非営利に関わらず断りなくご自由に使用していただいて構いません。
- このプロトタイプは外部ファイルとして配布されていますが、作品内にPROTOとして組み込んでいただいても構いません。
- このプロトタイプはご自由に改造していただいて構いません。 また、改造されたプロトタイプとそれを使用した作品を公開していただいても構いません。
- このプロトタイプを使用、改造することにより如何なる損害が生じても、制作者(けけんけん)は責任を追いかねます。
- このプロトタイプは今後のバージョンアップに従い、予告無く仕様が変更される場合もあります。
- このプロトタイプはhttp://www.ceres.dti.ne.jp/~kekenken/main/download/environ/eifs.wrlに設置しています。
EXTERNPROTO の url をこの場所に設定していただいても構いませんが、今後予告無く削除もしくは移動する場合があります。
- EnvironmentIndexedFaceSetプロトタイプの著作権は けけんけん が有します。
- EnvironmentIndexedFaceSetプロトタイプを使った作品の著作権は、このプロトタイプが作品内に組み込まれた場合を含めて、その作品の著作者が有します。