Adsense

2007年7月25日水曜日

llSetText の文字の位置

今日はちょっとした小ネタをご紹介しますね。

LSL(Linden Scripting Language) を勉強しはじめたとき、まず最初にやってみたのが llSetText でした。

このとき、つまづいたのは

a) 日本語の扱いかた
b) 改行の仕方
c) 浮遊する文字の位置調整

でした。
日本語については多くの方がブログでかかれていますが、

llSetText("日本語表示します~",<0.0,0.0,0.0>, 1);

みたいなことはできません。スクリプト内では Text として日本語を直接入力することができないからです。コメントさえ日本語で入力することは今のバージョンではできません。
(このあたりの日本語・多言語対応などをきちんとしてから「日本語対応」をメディアにはうたってほしいですね、、、、と、これは違う話題(笑))

a) の日本語の扱いかたは Base64 を使って llBase64ToString でスクリプト実行時に日本語表示させるか、llEscapeURL を使う方法などがあります。わたしはもっぱら Base64 を使います。これについては以前のエントリ「SLでやれることはSLで」が参考になると思います。

b) については、、、、たまにものすごーく長い浮遊するテキストをみることがありますが、改行コードをいれることで、長いメッセージを改行させることができます。

なので、たとえば、
llSetText("Hello, Text Message can be changed line\n
using new line escape code.\n
Please refer .... \n
http://wiki.secondlife.com/wiki/String#Caveats",
<0.0,0.0,0.0>,1);
こんな感じで、\n (バックスラッシュ n) を入れることで、テキストを改行させることができます。
allSetText1
 
このあたりについては、wiki.secondlife.com の LSL String を参照してみてください。
で、c) のフローティングテキストとオブジェクトの位置関係ですが、たとえば、オブジェクトの「上」にテキストを表示するのではなく、中心付近に表示したい場合など、、、、llSetText の引数にはそんな位置を指定する数値はないので、、、、どうやってやるのかなぁ、、、と試行錯誤していました。
立方体を例にするとわかりやすいのですが、オブジェクトの位置をあらわすベクトルデータの X, Y, Z東西南北上下に対応しています。
このフローティングテキストの位置は、上下、、、の数値のみが影響しそうですが、オブジェクトを作成したときの X, Y, Z というポジションは、その位置のみならず、オブジェクトのサイズ指定のときなども使いますよね。あれって、、、オブジェクトを回転させて、サイズを変更するときでも、そのときの位置(Position) の X,Y,Z ではなく、オブジェクトを作成したときの X, Y, Z の方向と数値をそのまま使っていることに気づくと思います。
下は回転させる前
(Editモードで CTRL + SHIFT でサイズ変更モードになります)
allSetText2
こちらは回転させた後。オブジェクトサイズ変更のマーク Y の緑が上下になっています。
allSetText3
さて、何がいいたいかというと、フローティングテキストの位置は、オブジェクトを作成したときのオブジェクトが持っている Z 方向(上下方向)の影響を強く受けている、ということなんです。
つまり、看板のようなオブジェクトをつくって、Z方向のサイズを大きくすると、それにしたがってフローティングテキストも上にあがります。
 allSetText4
でも、この看板を90度、東西南北どちらかの方向に回転させて、Z ではなく、X, Y のサイズ変更を行うと、、、、以下のようになるんですよ。
allSetText5
なので、、、、オブジェクトを回転させて、限りなく Z 方向のサイズをゼロに近づけると、この場合オブジェクトの中心付近にフローティングテキストが表示されます。
allSetText6
ただし、この方法でも、まったくフローティングテキストが動かないわけではありません。上の例では緑のY方向のサイズを変更すると、それにあわせてテキストも上下しますが、かならずオブジェクトの上に表示されるのではなく、あるサイズ(30cmくらいかな)を超えると、オブジェクトに重なった位置にテキストが表示され、その後、ほぼ真ん中あたりにポイントされるようになります。
llSetText ひとつとっても、、、こんなこと、、、あるんですよ。
って、、、、ニッチすぎる話題でしたね(笑