ちょっとだけ解説





[VRML] [JavaScript] [Java]
[VRMLの謎]
[もどる]


VRML(Virtual Reality Modeling Language)

VRMLはWWW上で三次元の仮想現実空間を作成するための言語です。
1.0と2.0があって、2.0ではアニメーション等のさまざまな機能拡張が行われているらし
いです。さらにVRML97という仕様もあるのですが、2.0との関係は把握していません。
VRMLで記述されたデータを表示するためには、VRML専用のブラウザをプラグインとして
Webブラウザに組み込んでおく必要があります。VRMLブラウザには幾つか種類があり、同
じVRMLの記述でも、ブラウザによって見え方が異なる場合があります。
主なVRMLブラウザとしては、以下のものがあります。

・Live3D (Netscape)
VRML1.0用のブラウザです。
Netscape Navigatorの3.0の頃に付属していたようですが、今はサポートされてないみた
いです。
Live3Dでは初期状態では、テクスチャを貼り付けた部分についてはシェーディングがか
かっていません。マウスの右ボタンを押すと出てくるコマンドで、切り替えができます。

・Cosmo Player 2.1 (Silicon Graphics)
VRML2.0用のブラウザです。1.0の表示も可能です(※1)。
Netscape Communicator 4に付属していると、どっかに書いてあるのを見たことがありま
すが、付いていなかったらSGIのホームページからダウンロードして組み込むことになり
ます。
Live3Dでできた、スムース・シェーディングとフラット・シェーディングの切り替え、ワ
イヤ・フレームの表示等ができないようです。
データによっては、Go、Slide等の直線的な動きの増分が小さく、かなり移動が遅く感じ
られることがあります。このような場合は、右下のPreferencesのWorldのNavigation
Speedで調整して下さい。

・MS VRML 2.0 Viewer (Microsoft)
VRML2.0用のブラウザです。1.0の表示も可能です(※1)。
InternetExplorerを使用している場合は、これを組み込む必要があります。
シェーディングの切り替えや、ワイヤ・フレームの表示もでき、個人的な感想としては、
こちらの方が機能的にはCosmo Playerより使い勝手がいいです。ただ、グラフィック的に
は粗い印象があります。
また、VRML1.0を表示すると、ポリゴンの裏面は常に表示されないようです。そのため、
当ページのデータで、一部表示が欠ける場合があります。

・Community Place Browser (Sony)
VRML2.0用のブラウザです。1.0は表示できません。
プラグインとしてだけでなく、単独のアプリケーションとしても使用できます。
Community Placeという、共有仮想空間利用のための製品群の一つです。
ちょっと使ってみた限りでは、バーチャルタウンの類いの仮想空間のナビゲーション用に
特化しているみたいで、「自分が動く」コマンドだけで、「対象物」を動かすコマンドは
ないようです。従って、当ホームページにあるようなVRMLを見るには向いていません。

※1 少なくともどちらか(どっちか忘れた)は、実は1.0の記述を2.0に変換してから表示
 してます。


VRMLの謎

市販の本を参考にしながら作っているのですが、いろいろやっていると、時々よくわから
ない問題にぶち当たることがあります。仕様をまじめに調べないで作ってるのが悪いとい
えばそうなのですが、それにしてもブラウザによって表示が違ったりとか、製作者として
はいろいろ困ったことになります。そういった時の試行錯誤の経緯をいくつか。

・VRML1.0+Live3Dの色の謎
VRMLに手を染めた当初は、Live3Dしか持っていなかったこともあって、VRML1.0で書いて
Live3Dで表示していました。ところが物体の色がどうも思うように出せないのです。
VRMLでは物体の色の指定にはいくつものパラメータがありますが、その物本来の色は
  diffuseColor 1.0 1.0 1.0
と指定します。三つの数値がそれぞれRGB(Red、Green、Blue)を表し、0が最小(暗い)で1
が最大です。ところが、三つの値をすべて同じにして、白〜灰色〜黒といった場合や、1
と0だけ使って単純に、赤、緑、青とかいった色を出す場合は確かに意図したのに近い色
になるのですが、例えば肌色とかちょっと凝った(?)色を使おうとするとうまくいきませ
ん。「人」のモデルを作ろうとして、顔だけテクスチャを貼り付けて、のどや手等の他の
部分はテクスチャの地の色をVRML上で指定して、なんてことをやると、顔と他の部分の色
が全然違うなんてことになるわけです。いろいろやってると、どうもRGBの値を相対値と
して扱っているように思えるのです。
結局、最終的に編み出したのは「使いたい色の無地のテクスチャを貼り付ける」という方
法です。ダサいですねえ。少し後で分かったのですが、Cosmo PlayerとMS VRML Viewerで
は、意図通りの色で表示できます。とすると、これはLive3Dの仕様なのでしょうか。

・テクスチャマッピングの謎(その一)
上で「人」のモデルで顔にテクスチャを貼り付ける、という話を書きましたが、実はその
際、色以前に別の問題に直面しました。貼り付けて見たらテクスチャが90度回転している
ではありませんか。よく見るとさらに反転もしているようですが。で、例によっていろい
試すと、ポリゴン(IndexdFaceSetノードで定義した形状)の場合、どうも縦長、即ち高さ
が幅より大きい時に回転・反転して貼り付く「らしい」ということがわかりました。これ
はLive3DだけでなくCosmo Player、MS VRML Viewerでも同じみたいです。
で、そういうもんかとあきらめて、VRML2.0を始めた時もそのつもりで作っていたわけで
すが、作ったデータを、ふとCommunity Place Browserで表示したら、あーらびっくり、
顔が天地逆さまになっているではありませんか。Community Place BrowserはVRML1.0を読
めないので、今までは試さなかったのです。でも、ここまで来ると面倒見切れないので、
Community Place Browserはとりあえず無視することにしました(^^;)。

・テクスチャマッピングの謎(その二)
当ページの「浴衣」では、一つの物体にテクスチャの一部だけを貼り付けるということを
をしています。これはVRML1.0では、Texture2Transformノードのtranslationフィールド
とscaleFactorフィールドを使用すればできます。しかし私が買った本にはあまり詳しく
書いてなかったのでLive3Dで表示しながら試してみたところ、テクスチャ画像の幅をiw、
高さをih、貼り付けたい部分の始点(左下原点)をpx、py、幅、高さをpw、phとした時、
  translation px/iw py/ih
  scaleFactor pw/iw ph/ih
と指定すれば、その部分がCubeに貼り付くことがわかりました。
し・か・し、長方形に作ったポリゴンで同じように指定してみたら、うまくいかないでは
ありませんか。正面から見たらCubeの場合と同じ形なのに。今一つ納得のいかないまま、
試行錯誤の末見つけたのが以下の式です。
  translation px/iw py/ih
  scaleFactor pw/iw (ph/ih)*(ow/oh)
owとohはテクスチャを貼り付ける物体の幅、高さです。
そもそもテクスチャをただ貼り付けるだけの時でもCubeの場合とは仕様が違っていたので、
部分的に貼り付ける場合も違うのは当然でしょうが、それにしてもややこしい。これと上
記の90度回転の問題があったために、「浴衣」では極力ポリゴンの使用を控えました。
と・こ・ろ・が、これだけの試行錯誤の末、電卓片手に苦労して作ったのに、Cosmo
PleyerやMS VRML Viewerで表示してみたらテクスチャがガタガタでした。
で、見つけたのは以下の式。
 Cube:
  translation px/pw py/ph
  scaleFactor pw/iw ph/ih
 ポリゴン:
  translation px/pw (py/ph)/(ow/oh)
  scaleFactor pw/iw (ph/ih)*(ow/oh)
書き方を変えて、scaleFactorの値をsx、syとすれば、
  translation (px/iw)/sx (py/ih)/sy
  scaleFactor sx sy
ちなみに、VRML1.0をVRML2.0に変換して試してみたところ、Community Place Browserで
はLive3Dと同じ表示になりました。
VRMLの仕様に依存するのか、ブラウザの仕様に依存するのか、よくわからないですね(調
べてない^^;)。


JavaScript

JavaScriptはHTML内に直接記述できるスクリプト言語で、Netscape社が開発したものです。
オブジェクト指向だそうで、文法はCに似ています。


Java

JavaはSun MicroSystems社が開発したオブジェクト指向言語で、かなりC++をベースにし
ているようです。
Javaはコンパイラ型言語で、Sunの配布しているJDK(Java Developers Kit)等でコンパイ
ルして得られた中間コードのバイナリ・モジュールを、HTML内からアプレットとして起動
する形になります。
当ページにあるのは、JDK1.1.7を使用して開発したものですが、Netscape4、IE4が対応し
ているようです。

もどる