* VRML Studies *

VRML 勉強中

VRML のちょっとしたテクニック,アイデアや作品等。
(動作確認:blaxxun Contact 5.1Cortona VRML Client 3.1Cosmo Player 2.1.1

レインボーテキスト
逆変形
カクカクしてない円柱
カクカクしてない円
角数可変 Dipyramid
テクスチャ On/Off
画像から作る地形
文字表示の色々
鏡像
DropSensor テスト
インラインのテクスチャやサウンドデータ


レインボーテキスト

虹色に流れるテキストです。5通り程作ってみました。

  1. PROTO 内で定義した TimeSensor ノードを順次スタートさせる。

    VRML ソース(4KB)

    虹色変化には,ColorInterpolator ではなく,PositionInterpolator を使っています。

  2. createVrmlFromString() メソッドで文字を順次作る。

    VRML ソース(3KB)

  3. 文字列のテクスチャを貼ったオブジェクトの color フィールドをコントロールする。

    VRML(4KB) ソース(2KB)

    (注:Cosmo Player では,color フィールドをアニメートすると,メモリーを使い尽くして行くことが度々あります。)

以下,上記「3.」では, Cosmo Player でメモリー関係の不具合が起こることがあるので,他の方法を考えてみます。

  1. 上記「1.」と同じ方法。

    VRML(6KB) ソース(5KB)

    ちなみに,1つの文字列テクスチャ画像を texCoord フィールドで一文字ずつに分割して使っています。

  2. 文字を透明で抜き,後側に虹色の PixelTexture を貼ったプレートを置く。

    VRML(4KB) ソース(2KB)

    (スクリプトによる PixelTexture 作成は,けけんけんさんの「VRML実験室:計算によるテクスチャー作成」を参考にしました。)

逆変形

変形後,逆転して元に戻すためのアイデアです。

TimeSensor ノードの fraction_changed は 0.0 から 1.0 に変化します。普通はそれを CoordinateInterpolator ノードに set_fraction すると変形が行われます。

もし fraction_changed が 1.0 から 0.0 に変化するようにしたらどうなるでしょう? そう,変形したのが元に戻ってきます。

VRML ソース(3KB)

(クリックする度「変形/元に戻る」を繰り返します。)


カクカクしてない円柱

円柱を Cylinder ノードで作るとカクカクです。Cosmo Player だと 16角柱ですね。

VRML ソース(1KB)

レンダリング負荷を減らすために仕方がないとはいえ,滑らかな円柱が欲しいこともあります。そこで,角数が多い角柱をスクリプトで作ってみます。求めた値を Extrusion ノードの crossSection フィールドに set してできあがりです。一応 64角柱にし,creaseAngle に 2π/64ラジアンを繰り上げた値を入れてます。

VRML ソース(1KB)

三角柱,五角柱等々色々作ってみましょう(^^)


カクカクしてない円

上記の「カクカクしてない円柱」を発展させ,今度は円を作ってみます。

先ずは,Cylinder ノードで作った円です。Cosmo Player で16角形です。

VRML ソース(1KB)

「カクカクしてない円柱」では Extrusion ノードを使いましたが,ここでは IndexedFaceSet ノードで作ってみます。Extrusion ノードで行ったときと異なり,coordIndex をスクリプトで作る必要があります。

VRML ソース(1KB)

これは 256角形です(^^;


角数可変 Dipyramid

Juno's World」のJunoさんに影響されて多面体を作ってみました。

多面体とは言っても,2つの角錐を張り合わせただけですが…
…では芸がないので,底面の角数は可変☆
上記の「カクカクしてない円」をアレンジしたものです。

VRML ソース(4KB)


テクスチャ On/Off

テクスチャの On/Off,または貼り替えの方法を考えてみます。(箱をクリックするとテクスチャが On/Off します。)

  1. 先ずは,単純に,クリックする度 ImageTexture ノードの url フィールドを書き換えるようにしてみます。

    VRML ソース(1KB)

    これでも可能なのですが,Cosmo Player には Cache がないので,テクスチャを貼る度に URL を辿ってテクスチャを再読み込みしてしまいますね。

  2. そこで,テクスチャ付きとそうでない箱を2つ作っておいて,Switch ノードで切り替えてみます。

    VRML ソース(1KB)

    貼る対象が単純なときはこれでも良いですね。

  3. しかし,貼る対象が沢山あったり複雑な形状である場合,また数種類のテクスチャを貼り替えるようなとき,「2」の方法ではソースが長くなってしまいます。そこで,あらかじめテクスチャを読み込ませた ImageTexture ノードとテクスチャ無しの ImageTexture ノードとを切り替えるようにしてみます。

    VRML ソース(1KB)

    これで随分ソースが短くなりそうです。

  4. 「1」と「3」を組み合わせると,「開いたときにはテクスチャの読み込み無し→テクスチャを読み込んで貼る→テクスチャ無し→既に読み込んだテクスチャを貼る」といったこともできます。

    VRML ソース(1KB)

☆このテクニックは Inline ノードにも使えますね。


画像から作る地形

ElevationGrid ノードは地形を作るときに便利ですが,その height フィールドに入れる値は画像から得ることもできます。以下にその方法を記します。

  1. グレースケールの画像を用意します。ここでは 21x21 ピクセルの画像にしました。画像の明るい部分が山,暗い部分が谷となります。

    地形データ画像 (小さいので4倍に拡大表示しています。)

    注意: (横ピクセル数-1) x (縦ピクセル数-1) x 2 が完成時のポリゴン数になります。21x21 の場合で 800 ポリゴンです。

  2. 画像を PGM (Portable Graymap) 形式で保存します。PGM のエンコード形式には Binary と Ascii がありますが, Ascii で保存します。(私は PGM 出力には "IrfanView32" を使っています。)

  3. 保存したPGMファイルをテキストエディタで開きます。内容は,PGM Ascii を示す "P2",横ピクセル数,縦ピクセル数,最大値を示す "255",及びピクセル毎の値となっています。

  4. ピクセル毎の値を全て ElevationGrid の height フィールドに記入します。xDimension フィールドと zDimension フィールドのそれぞれに元の画像の横幅と高さを記入します。

    VRML ソース(3KB)

  5. テクスチャを貼り,滑らかにするための creaseAngle を設定して出来上がりです。

    VRML(8KB) ソース(4KB)

    おまけで空と水域も加えました。

文字表示の色々

VRML での文字を表示する方法を色々試してみました。

  1. VRML 2.0 では Text ノードで日本語を表示できます。
    ファイルを UTF-8 形式の文字コードで作り,また,VRMLブラウザが対応していることが条件です。日本語の場合は language フィールドに "ja" を設定します。

    UTF-8 で保存できないテキストエディタであれば,普通に保存した後,文字コード変換ソフトを使います。
    文字コード変換ソフトには,Windows であれば,「Charset Converter」はどうでしょう。

    VRML ソース(1KB)(string フィールドに "こんにちは" を UTF-8 で入れてます。)

    Cortona VRML Client と WorldView で可能なのを Windows 98 で確認しています。
    Cortona + Windows 95 では不可という情報をいただきました。
    Cosmo Player 2 の場合,Windows NT 4.0 では正しく表示されるそうです。Windows 2000 でも多分大丈夫なのでしょう。
    Cosmo Player 2+Windows 95/98 では不可です。Cosmo Player 2+Mac でも不可能らしいです。
    blaxxun Contact は未対応です。


  2. モデリングソフトでテキストを3Dデータにすることもできます。

    LaFonte」という 3Dテキスト専用のシェアウェアがあるので,試しに使ってみました。

    VRML(gzip圧縮 7KB)

  3. テクスチャ画像を貼ることで行うこともできます。少々ギザギザしますが,これもいい感じです。

    VRML(3KB) ソース(1KB)

  4. ElevationGrid ノードを使うのもなかなか面白いです。

    作成方法は上記「画像から作る地形」とほぼ同じです。テキストエディタ等で文字をタイプし,それをキャプチャした画像から作ります。

    こんにちは

    上の画像から作ってみます。「画像から作る地形」ではグレースケールの画像を使ったのですが,今回は白黒二値の画像なので,PGM でなく PBM (Portable Bitmap) 形式に出力して height フィールドの値を得ます。(PBM のエンコード形式には Binary と Ascii がありますが, Ascii で保存します。PBM のフォーマットは,PBM Ascii を示す "P1",横ピクセル数,縦ピクセル数,及びピクセル毎の値となっています。ピクセル毎の値は "0" が白,"1" が黒を表します。)

    VRML ソース(3KB)

    ElevationGrid ですが,黒い板を置くことで文字だけ浮かび上がるようにしてあります。

  5. こういう懐かしい手段もあったりします。(Mac版 Cosmo Player 不可。でも,ソースは見てください(^^;)

    VRML ソース(1KB)

鏡像

鏡に映したオブジェの作例です。

IndexedFaceSet や Extrusion ノードで作った形状は,数行のスクリプトで鏡像の座標を求めることができます。左右対称ならx座標の正負の符号を反転すれば良い訳です。鏡像の方は ccw フィールドを FALSE に設定します。

VRML ソース(2KB)

この例では rotation も左右対称になるようにしています。


DropSensor テスト

VRML プラグイン "Cortona VRML client" では "DropSensor" ノードが拡張されています。 このノードの使い勝手をテストしてみました。("Cortona VRML client" をインストールしてる方のみどうぞ。)


インラインのテクスチャやサウンドデータ

テクスチャやサウンドデータは,外部ファイルにするのが一般的ですが,同一ファイルに埋め込むこともできます。

PNG 画像の例 : VRML ソース(6KB)

画像等データは base64 形式に変換したものを使い,url フィールドには "data:MIMEタイプ;base64,変換されたデータ" と記入します。

base64 変換は,専用のソフトを使うのも便利ですが,以下に手軽な方法を記します。メールソフトの base64 変換機能を使います。

  1. メール(本文や宛先等は全て未記入)に変換したいファイルを添付する。
  2. そのメールを保存する。
  3. 保存したメールファイルをテキストエディタで開く。
  4. 暗号になっている部分をコピーする。

Home Music VRML Pictures Tools Cooking Monologue BBS Links About Myself