# アバタ仕様

1. 世界のオーサーのみがアバタのカスタマイズが出来る。
2. ユーザが自分の好きなアバタを置くことは許さない。
WORLDをworldのwrlファイルが置いてあるディレクトリのURLとする。
WORLD/avtimgというディレクトリに

    avatar1.bmp

    avatar2.bmp

    ...

    imglist.txt

というふうにしてアバタのイメージファイルを置く。avatar1, avatar2はアバタの名前で８字以内。bmpにしたのはコンテンツがプラットフォームに依存しないようにするため。bmpファイルのサイズは任意で色数も任意。imglist.txtには.bmpファイルの一覧一行づつが入っている。
3. WORLD/avtwrlというディレクトリに

    avatar1.wrl

    avatar2.wrl

    ...

    wrllist.txt

というふうにしてアバタのモデルファイルを置く。avatar1, avatar2はアバタの名前でイメージファイルの名前と対応している必要がある。wrllist.txtには.wrlファイルの一覧が一行づつ入っている。なおwrllist.txtの中のアバタの順番はimglist.txtの中のアバタの順番と一致ししている必要がある。
4. ブラウザはワールド読み込み時にアバタのデータの置いてあるディレクトリのimglist.txt, wrllist.txtファイルを確認する。そしてbitmapのディレクトリの中身を取りにいく。
5. アバタ変更メニュー(MultiUser-Select Avatar)はimglist.txt, wrllist.txtに１つ以上のアバタが入っていて、かつwrllist.txt, imglist.txtの設定が正しく行われていると有効になる。アバタ変更メニューが選択されるとその時点でavatimgディレクトリの中のすべてのイメージファイルを表示して選択させる。選択されたイメージファイルの名前をnewavt.bmpとすると、newavt.wrlを自分のアバタのURLとしてchangeURLメッセージをサーバに送信する。

6. アバタの色づけをサポートしたい場合には次のような手順を踏む。
6-1. アバタの色づけはWORLD/avtroom.wrlで行う。この部屋の中で適当な方法で色づけを行い、結果をレジストリに保存する。このために下記のAPIが提供されている。
これに関係するAPIは次の通りである。

- void Vscp.setAvtroomAvatarColor(String colorString);
  色付け部屋の中で新しい色づけが決まった後、エンコードした文字列をレジストリに保存するメソッド。
- String Vscp.getAvtroomAvatarColor(void);
  色づけ部屋で表示するアバタの現在の色をレジストリから取得するメソッド。
- String Vscp.getAvtroomAvatarURL(void);
  色づけ部屋で色を変えたいアバタのURLを取得するメソッド。
- void Vscp.goFromAvtroomToOriginalWorld(void);
  アバタ色変え部屋から元の世界に戻る。

6-2. アバタの色づけ終了後"OK"ボタンなどの操作で前の世界に戻る。
6-3. WORLD/avtwrlの下のアバタモデルはSony_BindSharedNode{}のtransformNodeに指定されている必要がある。そしてscriptNodeに指定されているScriptノードはeventIn SFString sonyAvatarAttributeを受け取れる必要がある。このeventInに対応してアバタの色づけを行う。ただし送られてくる文字列はレジストリに書き込んだ文字列の先頭に"sleep:0 "あるいは"sleep:1 "を加えたものになっている。この付加された文字列はアバタがスリープ状態である("sleep:1 ")かそうでない("sleep:0 ")かを表している。もしアバタのアクションがスリープ状態を表す姿勢もサポートしているならばsonyAvatarAttributeに対応する処理の中でスリープ姿勢に変更したり、普通の姿勢に戻すことが出来る。
6-5. 'Multiuser-Edit Avatar'メニューのenable/disableの制御はWorldInfo{}で行うようにする。具体的には：

WorldInfo { info [ "SonyAvatarRoom: TRUE"] }

という記述があればメニューが有効になる。上記のTRUEの代わりにFALSEが指定されているか、SonyAvatarRoomというタグがWorldInfo{}に指定されていない場合にはメニューは無効になる。このタグを含んだWorldInfoノードを複数書いた場合には最初にあらわれた物が有効になる。メニューが有効で選択した場合にそのファイルがない場合にはNetscapeに表示されることがある。

7. アバタのアクションをサポートしたい場合には次のような手順を踏む。
7-1. アバタがeventIn SFString sonyAvatarPostureを受信できる。このeventInに対応する処理の中で実際のアバタのアクションを行う。引数の文字列はアクションの種類を表す。hello, smile, wow, byeはブラウザの標準UIから送信できる。
7-2. アバタのアクションパネルはブラウザに組み込まれている。このボタンを押すことで上述の標準アクション名を送ることが出来る。将来のブラウザはアバタごとにカスタムアクションを定義することが出来るようになる。
7-3. アバタのアクションはどんな方法で行っても良い。Textノードを使ってきた文字列をただ表示するだけでも良いだろう。

8. アバタのスムーズな移動をサポートしたい場合には次のような手順で行う。
8-1. アバタがeventIn MFVec3f sonyAvatarVectorを受信できる。このイベントの値は２つのSFVec3fからなり、最初の要素がアバタの現在位置、２番目の要素がアバタの移動するべき位置である。
8-2. sounyAvatarVectorの処理ルーチンの中でPositionInterpolatorやTimeSensor等を駆使すると、なめらかに平行移動するアバタを作ることが出来る。さらにこの移動の最中に適宜ポーズを変えることで歩くアバタを作る。