掲載日時: 2007-09-20 08:00

Second Life 新世界的ものづくりのススメ--その26:テクスチャアニメーション応用3

テクスチャアニメーションの応用第3回として、いよいよ第20回で紹介したバイクのタイヤで使われるスクリプトを解説する。このスクリプトでは、単にタイヤのテクスチャが回転するだけでなく、オブジェクトの移動速度に応じて回転が変化する。

著者 : 大槻透世二(サイバーアドベンチャー)

URL : https://japan.zdnet.com/article/20356067/

(前回よりつづく)

結局俺とさくらは須藤さんにセカンドライフのヒントを受けたばかりではなく、美味しい昼食までご馳走になったのだ。

「夜は予約がなかなか取れないのよ」

何もかもを知っていたさくらは嬉しそうに笑い、俺と肩を並べてオフィスへと戻る道を歩いていた。 こんな心も晴れるような真っ青な空の下、俺はさくらと2人で秘密(と言ってもプロジェクトだけど)を共有している。
それだけでも心躍ること出来事だか、俺は先ほどの須藤さんとの会話を反芻し、興奮が沸きあがっていた。

結局、どうすれば人に来てもらえるのかは、どんなターゲットに来て欲しいか。先ずはターゲット像を絞りあげることだ。
その中でどういうビジネスモデルを作り、売り上げにつなげていくか。という問いになる。

……続きは、ブログ『「Second Love Story」〜あの頃の僕たちに〜』へ。

前回の復習

 前回は、テクスチャアニメーションの応用第2回として、火の作成方法と「まばたき」の仕組みを解説した。ここでは、「SMOOTH」モードの有無によって、テクスチャを「スムーズに動かす」のか、「パッパッと切り替える」のかを決定できる、というテクスチャアニメーションの奥深さを知ることができた。

 さて今回は、テクスチャアニメーションの応用第3回として、第20回で紹介したバイクのタイヤで使用されるスクリプトをいよいよ解説する。今回のスクリプトは、タイヤを単に回転させるだけでなく、「速度に応じたタイヤの回転」を可能とする。そのため、習得後には「速度に応じた○○」を作ることができ、乗り物類に全てに応用できる。ここでは第23回で学習した変数や定数などが参考となるので、忘れた場合は復習してみよう。

速度に応じたタイヤの回転

 まず、「速度に応じたタイヤの回転」を可能にするスクリプトのソースコード(LSLを使って記述された内容)全体を見てみよう。

速度に応じたタイヤの回転用スクリプト

 ここでも、第20回で少しだけ触れた「default { }」と「state_entry( )」が登場している。「default { }」は「ステート」、「state_entry( )」は「イベント」をそれぞれ表していた。

 今回は、「default { }」内で使われている「state_entry( )」、そして、今回新しく出てきた「timer( )」というイベントについて解説しよう。ステートについてはまた別の機会に譲ることにする。

イベントとは?

 イベントとは、日本語で言うと「出来事」だ。そこから、イベントは、「何らかの出来事が起こった時に、こういうことをしなさい」という命令をプログラムで設定する役割を担う。今回のスクリプトでは、イベントとして、「state_entry( )」(下図1)と「timer( )」(下図2)の2つがある。1つずつ見てみよう。

速度に応じたタイヤの回転用スクリプト

1. state_entry( )

 「state_entry( )」は、ステートエントリーイベントと呼ばれる。このイベントは、あらゆるプログラムに入っており、1番最初に実行される。今回は、記述が下図のようになっていることから、『「state_entry( )」内の「llSetTimerEvent(0.20)」を実行しなさい』という命令を出している。

「state_entry( )」

 LSL Portalによれば、「llSetTimerEvent( )」の定義は下図のようになる。「( )」に入るデータは、「float」(小数)というデータ型を持った「sec」となり、秒数を示す。そして、この値に応じて、次項で説明するタイマーイベントを実行する。

「llSetTimerEvent( )」

 今回は「sec」が0.2なので、「llSetTimerEvent( )」はタイマーイベントを0.2秒ごとに実行することになる。考え方としては、下図のようになる。

イベントの関係

2. timer( )

 「timer( )」はタイマーイベントと呼ばれる。タイマーイベントのブロック内はどのようになっているだろうか?0.2秒毎に何をしているのだろうか?今回、タイマーイベントは下図のようになっている。

「timer( )」

 それでは順番に見ていこう。下図で示した最初の行では、「vel」という関数が自分(ユーザー)によって定義されている。

「vel」

 「vel」は、データ型が「vector」(ベクター)であるから、「(x,y,z)」のような形式で3つのデータを持つことができる。そして、「vel」に「llGetVel( )」の値を代入することが、「=」で指定されている。

 「=」は、第23回でも出てきたが、そもそも「=」とは何かをここで少し説明しておこう。実は、「=」は、数学の「イコール」とは異なる意味を持つ。「=」は、代入演算子といい、「=」の右側(右辺)の結果を「=」の左側(左辺)に代入する(割り当てる)。プログラム言語の決まり事というのは、数学の決まり事とは違うから混乱してしまう。だが、これは決まり事として覚えるしかない。代入演算子については、最後にもう少し詳しく見てみよう。

 「llGetVel( )」は、LSL Portalで定義を見ると、ベクター型のデータを返す関数となっている。

「llGetVel( )」

 「llGetVel( )」を「vector vel = llGetVel();」というスクリプトで使い、その代入先を指定すると、次のことが実行される。

  1. 「llGetVel( )」が、Linden Labのサーバへ問い合わせをする
  2. その結果としてベクター型(x, y, z)データ、例えば、「(2, 4, 6)」のような値が返ってくる
  3. 返ってきた値「(2, 4, 6)」を「vel」に代入する

注意:上記の「(2, 4, 6)」はあくまでも例である。実際には、その時点や状態に応じた具体的な数値が返ってくる。

データの流れ

 理解できただろうか。この関数は、サーバからデータを取ってくる「召使い」みたいなものだ。サーバに問い合わせることで、その時点や状態に応じたデータについて「数値はこれこれですよ」と返してくれる。

 では、「llGetVel( )」がサーバに問い合わせているのは何か?それは、「速度ベクトル」の値だ。速度ベクトルとは、3次元空間上では必須である「向き」のデータをもった速度の値である。つまり、今回のスクリプトが埋め込まれたオブジェクトの移動について、速度ベクトルが問い合わされている。

 以上のことから、「vector vel = llGetVel();」は、「llGetVel( )」をサーバに速度ベクトルの値を問い合わせ、得られた具体的な値を「vel」に代入することを示している。

 2行目は、下図のようになっている。ここでは、「speed」という関数がユーザーによって定義されている。

「speed」

 「speed」は、データ型が「float」で、「llVecMag(vel)」の値が代入される。「llVecMag( )」は、LSL Portalで定義を見ると、「( )」内のベクター型データを小数型の数値(絶対値)に置き換えて返す関数となっている(絶対値とはマイナスやプラスの関係ない値であり、「|-1|= 1」となる)。

「llVecMag(vel)」

 「llVecMag(vel)」は、ユーザーが定義した関数(ユーザー定義関数)である「vel」を「( )」内に持っている。このことから、「vel」として得られた速度ベクトルを小数型の数値(絶対値)に置き換えることを示している。

 ここまでの2行をまとめると、下図ようになる(図中の数字は例であり、実際には、その時点や状態に応じた具体的な数値が返ってくる)。

データの流れ 「llGetVel( )」で得られた「(2, 4, 6)」という速度ベクトル値は、「llVecMag(vel)」によって「1.2」という小数型の数値に置き換えられている。

 そして、3行目では、テクスチャアニメーションを定義している。テクスチャアニメーションのスピードを決定する「rate」に「speed*0.5」が指定されている。これにより、オブジェクトの移動速度が増大すると、ユーザー定義関数「speed」の値が増大し、テクスチャが速く回転するようになる。

「llSetTextureAnim( )」

 以上のように、「timer ( )イベントを0.2秒ごとに繰り返す」ことは、「0.2秒ごとに速度ベクトルを計測し、テクスチャのスピードに反映させる」ことを意味している。

イベントの関係

 ポイントは、次の2点だ。

  1. 速度ベクトルを問い合わせる「llGetVel( )」
  2. 速度ベクトルを数値(絶対値)で返す「llVecMag」

代入演算子

 ここで、先ほど少し説明した代入演算子には、他にどのようなものがあるか見てみよう。今度は日本語版LSL Wikiの「演算子」の説明を見てみよう。下図の赤枠部分が該当する。

演算子

 代入の考え方を適用すると「x = x + 1」という式も成り立つ。ただし、通常の考えでは混乱する。「うん?左辺がxで、右辺がx +1だと式が成立しない!」となる。しかし、この「=」はイコールではなく、代入なのだ。むしろ「x ← x + 1」というイメージだ。「今までのxにx + 1を代入しなさい」、つまり、「xの値を1増やしなさい」ということだ。

 この「x = x + 1」という式は、もっと簡単に書いて「x += 1」と表すことができる。「 += 」は上図赤枠の代入演算子でもある。

 さて、ユーザー定義関数や代入演算子など盛りだくさんだったが、テクスチャアニメーションの応用が終了した。次はいよいよ、「パーティクル」(粒子)に移ろう。これは楽しくなりそうだ。それでは、次回もお楽しみに

大槻透世二氏
大槻透世二サイバーアドベンチャー(株)
代表取締役社長/CEO

デジタルハリウッド大学院
次世代インターフェース研究室 研究員
Second Life研究室 研究員/プロデューサー
Linden社推薦 Second Lifeセミナー講師

東北大学心理学専攻卒業。1年間のLA留学を経て、ソリッドレイ研究所でバーチャルリアリティのシステムインテグレーション、立体映像システム構築、HMDシステム構築などを経験。IT系コンサルティング会社を経て、デジタルハリウッド大学大学院コンテンツマネジメント修士課程修了(MCA)。その後、Linden Lab本社にてSecond Lifeカリキュラムのトレーニングを受ける。現在デジタルハリウッドにて「Second Life」セミナーを開催。また、バーチャルリアリティ、メタバース関連のシステム開発/プロデュースを行うサイバーアドベンチャー(株)を設立し、そのCEO職に就いている。

ZDNET Japanは、Ziff Davisからのライセンスに基づき株式会社4Xが運営しています。
ZDNET Japan is operated by 4X Corp under license from Ziff Davis.

Copyright © 2026 4X Corp, Inc. All rights reserved. No reproduction or republication without written permission.