2007年04月20日
ポーズボール(スクリプト初級第十四回)
引き続いてアニメーションのスクリプトです。
前回は単にタッチするとアニメーションするだけのスクリプトでしたが、これではいまひとつ実用性がありません。
アニメーションが最もよく利用されているのはポーズボールでしょう。
SLで遊んだ人なら誰もが一度は見たことがあると思います。
しばしば木陰とかベッドの上に置いてある、赤と青のボール。
あれですw
クラブのフロアや、バーのストゥールなんかにも置いてあるところがあります。
これらのボールは、アバターが座ったときに特定のアニメーションを実行するものです。
前回は単にタッチするとアニメーションするだけのスクリプトでしたが、これではいまひとつ実用性がありません。
アニメーションが最もよく利用されているのはポーズボールでしょう。
SLで遊んだ人なら誰もが一度は見たことがあると思います。
しばしば木陰とかベッドの上に置いてある、赤と青のボール。
あれですw
クラブのフロアや、バーのストゥールなんかにも置いてあるところがあります。
これらのボールは、アバターが座ったときに特定のアニメーションを実行するものです。
座ったときのイベント
スクリプトの構成はすぐに予想がつくかと思います。
前回のスクリプトは「タッチしたとき」にアニメーションさせましたが、今回は「座ったときに」アニメーションさせるだけの違いですね。
ですので、「座ったとき」のイベントさえわかれば簡単に作れそうに思えます。
では「座ったとき」のイベントは・・・。
実は、これが存在しないのです。
SLの中で何かに座るというのはよくある行動なので、イベントとして存在していてもいいと思うのですが、ありません。
代わりに、「オブジェクトの状態が変化したとき」というイベントを使うことになります。
「オブジェクトの状態が変化したとき」のイベントはその名もchangedイベントと言います。
changed(integer change){
// 処理
}
引数changeには、オブジェクトの何が変化したのか、そのパラメータが入ってきます。
例えば「オブジェクトのコンテンツの中身が変わった」とか「色が変わった」「大きさが変わった」「テクスチャが変わった」「オブジェクトのリンクが変わった」「オーナーが変わった」などです。
とにかくオブジェクトのいろいろな変化を捉えるイベントですので、用途は広いです。
しかし、このイベントと「座ったかどうか」がどのように結びつくのでしょうか。
changedイベントのパラメータには、「オブジェクトに座ったかどうか」そのものはありません。
実はアバターがオブジェクトに座るという行為は、一種のリンクとして処理されます。
「座る」ことによってオブジェクトとアバターがリンクされると考えてください。
すると、changedイベントの中で「オブジェクトのリンクが変わった」ことを捉えることができますので、これを利用して「座ったとき」を検出します。
まずオブジェクトのリンクが変わった時を捉えるには以下のように書きます。
changed(integer change){
if (change & CHANGED_LINK) { // リンクが変わったかどうか
// リンクが変わったときの処理
} else {
// リンク以外が変わったとき(リンクが変わっていないとき)
}
}
CHANGED_LINKというのは「リンクの変化」を示す定数です。
例えばこの値の変わりにCHANGED_OWNERを使うと、「オーナーが変わったかどうか」を調べられますし、
CHANGED_INVENTORYを使うと、「オブジェクトのコンテンツの中身が変わったかどうか」を調べられます。
changed(integer change){
if (change & CHANGED_OWNER) { // オーナーが変わったかどうか
// オーナーが変わったときの処理
} else {
// オーナー以外が変わったとき(オーナーが変わっていないとき)
}
}
changed(integer change){
if (change & CHANGED_INVENTORY) { // コンテンツが変わったかどうか
// コンテンツに変化があったときの処理
// 多くの場合、何かがコンテンツに追加されたのを検出するのに使う
} else {
// コンテンツ以外が変わったとき(コンテンツが変わっていないとき)
}
}
CHANGED_LINK、CHANGED_OWNER、CHANGED_INVENTORYの3つは比較的使う機会が多い定数かと思います。
この書き方はお決まりと言ってもいいでしょう。
さて、changedイベントとCHANGED_LINKを使って、オブジェクトのリンクに変化があったことは検出できますが、リンクの変化と言っても単純ではありません。
今回検出しようとしている「アバターが座った/立った」も含まれますし、純粋にオブジェクトのリンクに新たなprimが追加された、外された場合もありえます。
「座ったのかどうか」を調べるには、もう一工夫が必要です。
そのためにllAvatarOnSitTarget()関数を使います。
key llAvatarOnSitTarget()
この関数はオブジェクトの上に座っているアバターのUUIDを返します。
誰も座っていない場合はNULL_KEYが返ってきます。
これを利用すれば、以下のようにして「座ったかどうか」の判定が可能です。
(1)誰も座ってないときに
オブジェクトのリンクが変化し
座っている人がいたら・・・「誰かが座ったのだとわかる」
座っている人がいなければ・・・「純粋にprimのリンクが変わった」
(2)誰かが座っているときに
オブジェクトのリンクが変化し
座っている人がいたら・・・「純粋にprimのリンクが変わった」
座っている人がいなければ・・・「座っていた人が立ったとわかる」
この判定方法もお決まりのパターンになりますので丸暗記しておくと楽です。
key siton = NULL_KEY; // 現在座っている人のUUIDを管理する変数
:
中略
:
changed(integer change){
if (change & CHANGED_LINK) { // リンクが変わった
key av = llAvatarOnSitTarget(); // 現在座っている人のUUIDを調査
if (siton != NULL_KEY) { // 今まで座っている人が居た場合
if (av == NULL_KEY) { // 今は座っている人がいない
// つまり「座っている人が立った」ときの処理
siton = NULL_KEY; // 現在座っている人のUUIDを更新(誰も座ってない)
}
} else { // 今まで座っている人はいなかった場合
if (av != NULL_KEY) { // 今は座っている人がいる
// つまり「誰かが新たに座った」ときの処理
siton = av; // 現在座っている人のUUIDを更新
}
}
}
}
key型変数sitonは「現在座っている人のUUID」を管理するための変数です。
誰も座っていないときにはこの変数の値をNULL_KEYにしておきます。
ポーズボールスクリプト
ではポーズボールスクリプトを作ってみましょう。
椅子などに組み込んでも構いません。
ただし椅子に組み込む際に注意すべき点は、ポーズによっては座る位置が大きくずれたりしますので、llSitTarget()関数を使ってアバターの座る位置を調整しなければならない点です。
誰かが座ったとき、llRequestPermissions()関数でアニメーションのパーミッション要求を行います。
パーミッションが許可されると、アニメーション対象者の実行中のアニメーションを調べて、まずはそれらを全て停止します。
なぜかと言うと、座ったときにはデフォルトで「座るポーズ」のアニメーションが実行されるためです。
また、AO(アニメーションオーバーライド)のアタッチメントを付けている人などは、座ったときにデフォルト以外のアニメーションを実行する可能性があります。
もしもこのスクリプトで実行したいアニメーションの優先順位が低いと、デフォルトの座るポーズのほうが優先され、意図した通りのポーズで座ってくれません。
そのため、まず最初に実行中のアニメーションを全て停止しているのです。
今回のスクリプトでは、同じオブジェクトに同時に何人もの人が座ることは考えられませんので、アニメーション対象を細かく管理する必要はありません。
従って、「立ったとき」には余計なことを考えずにllStopAnimation()関数でアニメーションを停止しています。
ボールの透明化
これでポーズに関しては意図した通りに動きますが、スクリプトをボールに組み込んだ場合、座ったあともボールが表示されているのは少々見苦しいところです。
椅子などに組み込んだ場合にはこのままで構いませんが、座ったときにオブジェクトを透明化する処理を考えて見ましょう。
単純にボールを消すだけなら難しくはありません。
ボールの透明度を変更し、完全な透明にしてしまえばOKです。
透明度を変更する関数はllSetAlpha()と言います。
llSetAlpha(float alpha, integer face)
float alpha
透明度を指定する引数です。
0.0を指定すると完全透明、1.0を指定すると完全不透明になります。
integer face
透明度を変化させたいオブジェクトの面を指定します。
オブジェクト全体を対象とする場合はALL_SIDESという値を指定します。
これを先ほどのスクリプトに組み込んでみます。
これで座ったときにボールは消え、立つと再び見えるようになります。
今回のポイント
・「座ったとき」のイベント:
key siton = NULL_KEY; // 現在座っている人のUUIDを管理する変数
:
中略
:
changed(integer change){
if (change & CHANGED_LINK) { // リンクが変わった
key av = llAvatarOnSitTarget(); // 現在座っている人のUUIDを調査
if (siton != NULL_KEY) { // 今まで座っている人が居た場合
if (av == NULL_KEY) { // 今は座っている人がいない
// つまり「座っている人が立った」ときの処理
siton = NULL_KEY; // 現在座っている人のUUIDを更新(誰も座ってない)
}
} else { // 今まで座っている人はいなかった場合
if (av != NULL_KEY) { // 今は座っている人がいる
// つまり「誰かが新たに座った」ときの処理
siton = av; // 現在座っている人のUUIDを更新
}
}
}
}
・「オーナーが変わったとき」のイベント:
changed(integer change){
if (change & CHANGED_OWNER) { // オーナーが変わったかどうか
// オーナーが変わったときの処理
} else {
// オーナー以外が変わったとき(オーナーが変わっていないとき)
}
}
・「コンテンツが変わったとき」のイベント:
changed(integer change){
if (change & CHANGED_INVENTORY) { // コンテンツが変わったかどうか
// コンテンツに変化があったときの処理
// 多くの場合、何かがコンテンツに追加されたのを検出するのに使う
} else {
// コンテンツ以外が変わったとき(コンテンツが変わっていないとき)
}
}
・オブジェクトの透明度変更:
llSetAlpha(float alpha, integer face)
※オブジェクトが複数のprimで構成されている場合は、
llSetLinkAlpha(integer linknumber, float alpha, integer face)
を使います。
linknumberに「LINK_SET」を指定すると全primの透明度を変更できます。
llSetLinkAlpha(LINK_SET, 0.0, ALL_SIDES); // 全primを完全透明にする
llSetLinkAlpha(LINK_SET, 1.0, ALL_SIDES); // 全primを完全不透明にする
今回のスクリプトはアニメーションを使う際に最も汎用的なものになります。
使用するアニメーションによってあらゆる場所で使えることでしょう。
例えば寝そべるアニメーションを使えばベッドに組み込めます。
キーを打つアニメーションと使えばパソコンデスクが作れます。
面白いアニメーションを作り、いろいろと応用してみて下さい。
さて・・・。
来週はまた新たなスクリプトに取り組みたいと思いますが、今のところ何を作るか決めていません(^^;
prim間の通信を行う方法について説明する予定ではあります。
「アレを作る方法を教えてくれ」などありましたらご提案下さい。
スクリプトの難易度を考えた上で、順次取り上げていきたいと思います。
ではまた来週~。
スクリプトの構成はすぐに予想がつくかと思います。
前回のスクリプトは「タッチしたとき」にアニメーションさせましたが、今回は「座ったときに」アニメーションさせるだけの違いですね。
ですので、「座ったとき」のイベントさえわかれば簡単に作れそうに思えます。
では「座ったとき」のイベントは・・・。
実は、これが存在しないのです。
SLの中で何かに座るというのはよくある行動なので、イベントとして存在していてもいいと思うのですが、ありません。
代わりに、「オブジェクトの状態が変化したとき」というイベントを使うことになります。
「オブジェクトの状態が変化したとき」のイベントはその名もchangedイベントと言います。
changed(integer change){
// 処理
}
引数changeには、オブジェクトの何が変化したのか、そのパラメータが入ってきます。
例えば「オブジェクトのコンテンツの中身が変わった」とか「色が変わった」「大きさが変わった」「テクスチャが変わった」「オブジェクトのリンクが変わった」「オーナーが変わった」などです。
とにかくオブジェクトのいろいろな変化を捉えるイベントですので、用途は広いです。
しかし、このイベントと「座ったかどうか」がどのように結びつくのでしょうか。
changedイベントのパラメータには、「オブジェクトに座ったかどうか」そのものはありません。
実はアバターがオブジェクトに座るという行為は、一種のリンクとして処理されます。
「座る」ことによってオブジェクトとアバターがリンクされると考えてください。
すると、changedイベントの中で「オブジェクトのリンクが変わった」ことを捉えることができますので、これを利用して「座ったとき」を検出します。
まずオブジェクトのリンクが変わった時を捉えるには以下のように書きます。
changed(integer change){
if (change & CHANGED_LINK) { // リンクが変わったかどうか
// リンクが変わったときの処理
} else {
// リンク以外が変わったとき(リンクが変わっていないとき)
}
}
CHANGED_LINKというのは「リンクの変化」を示す定数です。
例えばこの値の変わりにCHANGED_OWNERを使うと、「オーナーが変わったかどうか」を調べられますし、
CHANGED_INVENTORYを使うと、「オブジェクトのコンテンツの中身が変わったかどうか」を調べられます。
changed(integer change){
if (change & CHANGED_OWNER) { // オーナーが変わったかどうか
// オーナーが変わったときの処理
} else {
// オーナー以外が変わったとき(オーナーが変わっていないとき)
}
}
changed(integer change){
if (change & CHANGED_INVENTORY) { // コンテンツが変わったかどうか
// コンテンツに変化があったときの処理
// 多くの場合、何かがコンテンツに追加されたのを検出するのに使う
} else {
// コンテンツ以外が変わったとき(コンテンツが変わっていないとき)
}
}
CHANGED_LINK、CHANGED_OWNER、CHANGED_INVENTORYの3つは比較的使う機会が多い定数かと思います。
この書き方はお決まりと言ってもいいでしょう。
さて、changedイベントとCHANGED_LINKを使って、オブジェクトのリンクに変化があったことは検出できますが、リンクの変化と言っても単純ではありません。
今回検出しようとしている「アバターが座った/立った」も含まれますし、純粋にオブジェクトのリンクに新たなprimが追加された、外された場合もありえます。
「座ったのかどうか」を調べるには、もう一工夫が必要です。
そのためにllAvatarOnSitTarget()関数を使います。
key llAvatarOnSitTarget()
この関数はオブジェクトの上に座っているアバターのUUIDを返します。
誰も座っていない場合はNULL_KEYが返ってきます。
これを利用すれば、以下のようにして「座ったかどうか」の判定が可能です。
(1)誰も座ってないときに
オブジェクトのリンクが変化し
座っている人がいたら・・・「誰かが座ったのだとわかる」
座っている人がいなければ・・・「純粋にprimのリンクが変わった」
(2)誰かが座っているときに
オブジェクトのリンクが変化し
座っている人がいたら・・・「純粋にprimのリンクが変わった」
座っている人がいなければ・・・「座っていた人が立ったとわかる」
この判定方法もお決まりのパターンになりますので丸暗記しておくと楽です。
key siton = NULL_KEY; // 現在座っている人のUUIDを管理する変数
:
中略
:
changed(integer change){
if (change & CHANGED_LINK) { // リンクが変わった
key av = llAvatarOnSitTarget(); // 現在座っている人のUUIDを調査
if (siton != NULL_KEY) { // 今まで座っている人が居た場合
if (av == NULL_KEY) { // 今は座っている人がいない
// つまり「座っている人が立った」ときの処理
siton = NULL_KEY; // 現在座っている人のUUIDを更新(誰も座ってない)
}
} else { // 今まで座っている人はいなかった場合
if (av != NULL_KEY) { // 今は座っている人がいる
// つまり「誰かが新たに座った」ときの処理
siton = av; // 現在座っている人のUUIDを更新
}
}
}
}
key型変数sitonは「現在座っている人のUUID」を管理するための変数です。
誰も座っていないときにはこの変数の値をNULL_KEYにしておきます。
ポーズボールスクリプト
ではポーズボールスクリプトを作ってみましょう。
椅子などに組み込んでも構いません。
ただし椅子に組み込む際に注意すべき点は、ポーズによっては座る位置が大きくずれたりしますので、llSitTarget()関数を使ってアバターの座る位置を調整しなければならない点です。
string animation_name="sexy_sit"; // 実行するアニメーション
key siton = NULL_KEY; // 現在座っている人のUUIDを管理する変数
vector sit_pos = <0.0, -0.3, 0.4>; // 座る位置
vector sit_rot = <0.0, 0.0, 270.0>; // 座る角度
default {
state_entry(){
llSitTarget(sit_pos, llEuler2Rot(sit_rot * DEG_TO_RAD));
}
changed(integer change){
if (change & CHANGED_LINK) {
key av = llAvatarOnSitTarget();
if (siton != NULL_KEY) {
if (av == NULL_KEY) { // 座ってた人が立った
llStopAnimation(animation_name);
siton = NULL_KEY;
}
} else {
if (av != NULL_KEY) { // 誰か座った
siton = av;
llRequestPermissions(siton, PERMISSION_TRIGGER_ANIMATION);
}
}
}
}
run_time_permissions(integer perm) {
key perm_key = llGetPermissionsKey();
if (perm_key == siton) {
if (perm & PERMISSION_TRIGGER_ANIMATION){
list anms = llGetAnimationList(siton);
integer i;
for (i = 0; i < llGetListLength(anms); i++){
llStopAnimation(llList2Key(anms, i));
}
llStartAnimation(animation_name);
}
}
}
}
誰かが座ったとき、llRequestPermissions()関数でアニメーションのパーミッション要求を行います。
パーミッションが許可されると、アニメーション対象者の実行中のアニメーションを調べて、まずはそれらを全て停止します。
なぜかと言うと、座ったときにはデフォルトで「座るポーズ」のアニメーションが実行されるためです。
また、AO(アニメーションオーバーライド)のアタッチメントを付けている人などは、座ったときにデフォルト以外のアニメーションを実行する可能性があります。
もしもこのスクリプトで実行したいアニメーションの優先順位が低いと、デフォルトの座るポーズのほうが優先され、意図した通りのポーズで座ってくれません。
そのため、まず最初に実行中のアニメーションを全て停止しているのです。
今回のスクリプトでは、同じオブジェクトに同時に何人もの人が座ることは考えられませんので、アニメーション対象を細かく管理する必要はありません。
従って、「立ったとき」には余計なことを考えずにllStopAnimation()関数でアニメーションを停止しています。
ボールの透明化
これでポーズに関しては意図した通りに動きますが、スクリプトをボールに組み込んだ場合、座ったあともボールが表示されているのは少々見苦しいところです。
椅子などに組み込んだ場合にはこのままで構いませんが、座ったときにオブジェクトを透明化する処理を考えて見ましょう。
単純にボールを消すだけなら難しくはありません。
ボールの透明度を変更し、完全な透明にしてしまえばOKです。
透明度を変更する関数はllSetAlpha()と言います。
llSetAlpha(float alpha, integer face)
float alpha
透明度を指定する引数です。
0.0を指定すると完全透明、1.0を指定すると完全不透明になります。
integer face
透明度を変化させたいオブジェクトの面を指定します。
オブジェクト全体を対象とする場合はALL_SIDESという値を指定します。
これを先ほどのスクリプトに組み込んでみます。
string animation_name="sexy_sit"; // 実行するアニメーション
key siton = NULL_KEY; // 現在座っている人のUUIDを管理する変数
vector sit_pos = <0.0, -0.3, 0.4>; // 座る位置
vector sit_rot = <0.0, 0.0, 270.0>; // 座る角度
default {
state_entry(){
llSitTarget(sit_pos, llEuler2Rot(sit_rot * DEG_TO_RAD));
}
changed(integer change){
if (change & CHANGED_LINK) {
key av = llAvatarOnSitTarget();
if (siton != NULL_KEY) {
if (av == NULL_KEY) { // 座ってた人が立った
llStopAnimation(animation_name);
llSetAlpha(1.0, ALL_SIDES);
siton = NULL_KEY;
}
} else {
if (av != NULL_KEY) { // 誰か座った
siton = av;
llSetAlpha(0.0, ALL_SIDES);
llRequestPermissions(siton, PERMISSION_TRIGGER_ANIMATION);
}
}
}
}
run_time_permissions(integer perm) {
key perm_key = llGetPermissionsKey();
if (perm_key == siton) {
if (perm & PERMISSION_TRIGGER_ANIMATION){
list anms = llGetAnimationList(siton);
integer i;
for (i = 0; i < llGetListLength(anms); i++){
llStopAnimation(llList2Key(anms, i));
}
llStartAnimation(animation_name);
}
}
}
}
これで座ったときにボールは消え、立つと再び見えるようになります。
今回のポイント
・「座ったとき」のイベント:
key siton = NULL_KEY; // 現在座っている人のUUIDを管理する変数
:
中略
:
changed(integer change){
if (change & CHANGED_LINK) { // リンクが変わった
key av = llAvatarOnSitTarget(); // 現在座っている人のUUIDを調査
if (siton != NULL_KEY) { // 今まで座っている人が居た場合
if (av == NULL_KEY) { // 今は座っている人がいない
// つまり「座っている人が立った」ときの処理
siton = NULL_KEY; // 現在座っている人のUUIDを更新(誰も座ってない)
}
} else { // 今まで座っている人はいなかった場合
if (av != NULL_KEY) { // 今は座っている人がいる
// つまり「誰かが新たに座った」ときの処理
siton = av; // 現在座っている人のUUIDを更新
}
}
}
}
・「オーナーが変わったとき」のイベント:
changed(integer change){
if (change & CHANGED_OWNER) { // オーナーが変わったかどうか
// オーナーが変わったときの処理
} else {
// オーナー以外が変わったとき(オーナーが変わっていないとき)
}
}
・「コンテンツが変わったとき」のイベント:
changed(integer change){
if (change & CHANGED_INVENTORY) { // コンテンツが変わったかどうか
// コンテンツに変化があったときの処理
// 多くの場合、何かがコンテンツに追加されたのを検出するのに使う
} else {
// コンテンツ以外が変わったとき(コンテンツが変わっていないとき)
}
}
・オブジェクトの透明度変更:
llSetAlpha(float alpha, integer face)
※オブジェクトが複数のprimで構成されている場合は、
llSetLinkAlpha(integer linknumber, float alpha, integer face)
を使います。
linknumberに「LINK_SET」を指定すると全primの透明度を変更できます。
llSetLinkAlpha(LINK_SET, 0.0, ALL_SIDES); // 全primを完全透明にする
llSetLinkAlpha(LINK_SET, 1.0, ALL_SIDES); // 全primを完全不透明にする
今回のスクリプトはアニメーションを使う際に最も汎用的なものになります。
使用するアニメーションによってあらゆる場所で使えることでしょう。
例えば寝そべるアニメーションを使えばベッドに組み込めます。
キーを打つアニメーションと使えばパソコンデスクが作れます。
面白いアニメーションを作り、いろいろと応用してみて下さい。
さて・・・。
来週はまた新たなスクリプトに取り組みたいと思いますが、今のところ何を作るか決めていません(^^;
prim間の通信を行う方法について説明する予定ではあります。
「アレを作る方法を教えてくれ」などありましたらご提案下さい。
スクリプトの難易度を考えた上で、順次取り上げていきたいと思います。
ではまた来週~。
衝突判定(スクリプト初級第二十三回)
カメラ制御(スクリプト初級第二十二回)
デモ商品を作ろう(スクリプト初級第二十一回)
センサーを使おう(スクリプト初級第二十回)
ステートのこと(スクリプト初級第十九回)
rez!(スクリプト初級第十八回)
カメラ制御(スクリプト初級第二十二回)
デモ商品を作ろう(スクリプト初級第二十一回)
センサーを使おう(スクリプト初級第二十回)
ステートのこと(スクリプト初級第十九回)
rez!(スクリプト初級第十八回)
Posted by Miz at 16:24│Comments(25)
│初級スクリプト
この記事へのトラックバック
★iPhoneタイプやモトローラタイプの携帯アイテムを販売しているショップを発見しました。 hoorenbeek JT World VI/110/30/23 ★椅子をいただいてしまいました。スクリプトの書き方も教えていただ...
[セカンドライフ]【伊藤浩一のW-ZERO3応援団/Advanced】at 2007年08月05日 10:39
この記事へのコメント
スクリプトをコピペでうまくいきました^^。
Posted by もに at 2007年05月08日 07:38
>もにさん
なんだか検証していただいちゃってるみたいで恐縮です(^^;
私のほうでもちゃんと見直さないと駄目ですねぇ。
なんだか検証していただいちゃってるみたいで恐縮です(^^;
私のほうでもちゃんと見直さないと駄目ですねぇ。
Posted by Miz at 2007年05月08日 10:13
スクリプト勉強したら色々面白いことが出来そうなので、熟読してます^^。
乗り物の作り方を教えて欲しいです。
普通に飛ぶより早く飛ぶことできるんですか?。
乗り物の作り方を教えて欲しいです。
普通に飛ぶより早く飛ぶことできるんですか?。
Posted by もに at 2007年05月08日 23:15
>もにさん
乗り物ですか。
確かに普通のflyより早く飛ぶことももちろん可能ですが、ラグや立ち入り禁止領域、スクリプト禁止領域などがあるので、常時使うのは難しいかもしれません。
そのうち乗り物講座はやろうかな~とは思っては居ますが(^^;
すぐには厳しいと思うので、気長にお待ち下さいませ。
乗り物ですか。
確かに普通のflyより早く飛ぶことももちろん可能ですが、ラグや立ち入り禁止領域、スクリプト禁止領域などがあるので、常時使うのは難しいかもしれません。
そのうち乗り物講座はやろうかな~とは思っては居ますが(^^;
すぐには厳しいと思うので、気長にお待ち下さいませ。
Posted by Miz at 2007年05月09日 16:41
ちょうど家作りも終盤にさしかかり、イスにポーズを組み込もうと思って検索して来ました。
大変分かりやすく助かりました。ありがとうございました^^
大変分かりやすく助かりました。ありがとうございました^^
Posted by kuroobi Sandell at 2007年06月12日 20:13
>kuroobi Sandellさん
ポーズボールあたりはフリーのものも出回っているので、わざわざ自分で作らなくても済ませられますが、やはり自分で作ってみるとアニメーションの仕組み等が理解できます。
そうすると次には応用したスクリプトが書けますから、興味があるようでしたらぜひ応用にもチャレンジしてみて下さい。
ポーズボールあたりはフリーのものも出回っているので、わざわざ自分で作らなくても済ませられますが、やはり自分で作ってみるとアニメーションの仕組み等が理解できます。
そうすると次には応用したスクリプトが書けますから、興味があるようでしたらぜひ応用にもチャレンジしてみて下さい。
Posted by Miz at 2007年06月14日 14:09
初めまして。まだ始めたばかりですが丁寧な解説助かります。
まだまだ、ひよっこのくせにアニメーションを連動させてみたいと考えました
例えば、一つ目のポーズボールでやっていたアニメーションを隣のポーズボールに誰かが来たら連動して違うアニメーションをするなどです。
ボケのアニメーションをしていて突っ込みのポーズボールに誰か来たら、相手は突っ込みアニメーションで自分はどつかれるアニメーションに変化などは可能でしょうか?
センサーを使うのか、オーナーなどのチェックをする部分を増やしたりするのか?または違うやり方があるねか?初級者スクリプトとはいかないかもしれませんが教えて頂けると嬉しいです。
ヒントなどでも、構いませんのでお返事宜しくお願いします。
まだまだ、ひよっこのくせにアニメーションを連動させてみたいと考えました
例えば、一つ目のポーズボールでやっていたアニメーションを隣のポーズボールに誰かが来たら連動して違うアニメーションをするなどです。
ボケのアニメーションをしていて突っ込みのポーズボールに誰か来たら、相手は突っ込みアニメーションで自分はどつかれるアニメーションに変化などは可能でしょうか?
センサーを使うのか、オーナーなどのチェックをする部分を増やしたりするのか?または違うやり方があるねか?初級者スクリプトとはいかないかもしれませんが教えて頂けると嬉しいです。
ヒントなどでも、構いませんのでお返事宜しくお願いします。
Posted by 遮那 at 2007年07月21日 22:26
>遮那さん
こんにちは。
アニメーションの同期は、リンクメッセージもしくはリッスンを利用して行います。
ポーズボールは座ったタイミングで無条件にアニメーションを実行しますが、そうではなく、link_messageイベントやlistenイベントのタイミングでアニメーションを実行するようにしてやるだけです。
もちろん、各ボールで異なるアニメーションを実行させることも可能ですので、ボケ・ツッコミも実現できます。
と、まずはヒントのレベルですが、難しいようでしたら別途解説を検討しますね。
こんにちは。
アニメーションの同期は、リンクメッセージもしくはリッスンを利用して行います。
ポーズボールは座ったタイミングで無条件にアニメーションを実行しますが、そうではなく、link_messageイベントやlistenイベントのタイミングでアニメーションを実行するようにしてやるだけです。
もちろん、各ボールで異なるアニメーションを実行させることも可能ですので、ボケ・ツッコミも実現できます。
と、まずはヒントのレベルですが、難しいようでしたら別途解説を検討しますね。
Posted by Miz at 2007年07月24日 12:34
回答ありがとうございます。
まだ見ただけでは、すぐに理解できていませんが改良ポイントがわかったので後はがんばって実験繰り返してみます。
お時間があれば別途解説があると助かります。
ありがとうございました。
まだ見ただけでは、すぐに理解できていませんが改良ポイントがわかったので後はがんばって実験繰り返してみます。
お時間があれば別途解説があると助かります。
ありがとうございました。
Posted by 遮那 at 2007年07月25日 07:21
こんにちは、はじめまして。
とても解りやすくて参考にさせて頂いております。
看板を作る回でありましたが、フローティングテキストをポーズボールに
組み込み、さらに座ったときにテキストが消えるようにすることも可能ですか?また、文字の色はどのように変更するのでしょうか?
解らないことばかりですが、こちらを拝見させて頂いた事で、クリエイトする楽しみを知ることが出来ました。本当にどうもありがとうございます。
暑い日が続いておりますが、お身体をご自愛下さいね。
それでは、お手数をおかけ致しますがお時間のある時にお教え下さると嬉しいです。
とても解りやすくて参考にさせて頂いております。
看板を作る回でありましたが、フローティングテキストをポーズボールに
組み込み、さらに座ったときにテキストが消えるようにすることも可能ですか?また、文字の色はどのように変更するのでしょうか?
解らないことばかりですが、こちらを拝見させて頂いた事で、クリエイトする楽しみを知ることが出来ました。本当にどうもありがとうございます。
暑い日が続いておりますが、お身体をご自愛下さいね。
それでは、お手数をおかけ致しますがお時間のある時にお教え下さると嬉しいです。
Posted by hiroe at 2007年08月19日 03:50
>hiroeさん
フローティングテキストを消すには、
llSetText("", <0,0,0>, 1.0);
色を変えるには
llSetText("color", <1,0,0>, 1.0);・・・赤
llSetText("color", <0,1,0>, 1.0);・・・緑
llSetText("color", <0,0,1>, 1.0);・・・青
のように2番目の引数で指定します。
ポーズボールに組み込むのであれば、この記事のサンプルコードの、llSetAlpha関数と並べてllSetText関数を使えばOKです。
フローティングテキストを消すには、
llSetText("", <0,0,0>, 1.0);
色を変えるには
llSetText("color", <1,0,0>, 1.0);・・・赤
llSetText("color", <0,1,0>, 1.0);・・・緑
llSetText("color", <0,0,1>, 1.0);・・・青
のように2番目の引数で指定します。
ポーズボールに組み込むのであれば、この記事のサンプルコードの、llSetAlpha関数と並べてllSetText関数を使えばOKです。
Posted by Miz
at 2007年08月20日 20:15

早々にご回答下さり、誠にありがとうございます^^それでは早速やってみます。これからもどうぞ宜しくお願い致します^^
Posted by hiroe at 2007年08月20日 20:37
こんにちは。
第一回からはじめてやっとこの回まできました。
最近はいつもSandBoxでスクリプトと格闘中です^^
わかりやすい解説のおかげでなんとかここまでついてこれました。
コードを見ていて少し疑問に思ったことがあるのですが
if (change & CHANGED_LINK)
の中の&ですが、これは == と同じ意味なのでしょうか?
確か、run_time_permissionsの中にも同じ記述があったと
思うのですが、何か特別な比較演算子なのでしょうか?
とても基本的なことだったらすいません・・。
第一回からはじめてやっとこの回まできました。
最近はいつもSandBoxでスクリプトと格闘中です^^
わかりやすい解説のおかげでなんとかここまでついてこれました。
コードを見ていて少し疑問に思ったことがあるのですが
if (change & CHANGED_LINK)
の中の&ですが、これは == と同じ意味なのでしょうか?
確か、run_time_permissionsの中にも同じ記述があったと
思うのですが、何か特別な比較演算子なのでしょうか?
とても基本的なことだったらすいません・・。
Posted by joju at 2007年09月12日 22:55
>jojuさん
基本的、ではありますが、説明してないですね(^^;
ちょっと長くなりますが・・・。
&はビット演算のAND演算子です。
ビット演算というのは、2進数の計算です。
2進数とは0と1だけで構成された数値です。
表面からではわかりませんが、コンピュータはあらゆるデータを2進数で保持しています(0と1)。
例えば7という数値であれば、0111という2進数になります。
CHANGED_LINKという定数は、中身は32ですが、これを2進数であらわすと100000になります。
一方、changeですが、この変数の中身は、「変化したもの」によって変わってきます。
オーナーが変わった時には128、2進数にすると10000000です。
コンテンツが変わった時には1、これは2進数でも1です。
そしてリンクが変わった時は32、2進数で100000。
では、オーナーとコンテンツが両方とも変わった時には?
オーナー128、コンテンツ1で、足して129になります。
これを2進数にすると、10000001です。
オーナーとコンテンツとリンクが変わった時には?
128+1+32で161、2進数にすると10100001になります。
ですので、例えば、オーナーとコンテンツとリンクが変わった時、
if (change & CHANGED_LINK)
このif文は、
if (10100001 & 100000)
このようになっていることになります。
AND演算は、「両方ともTRUE(または1)の場合にTRUE(または1)、そうでなければFALSE(または0)」です。
詳しくは基礎知識編の「演算子」を参照してください。
10100001 & 100000
これがどうなるかというと、縦に書くと判りやすいのですが、
10100001
00100000
縦に見たとき、上下ともに1になってるところは1、そうでなければ0になります。
結果、答えは00100000になり、これは0ではないのでTRUEと見なされ、if文を通ります。
changeの値がいろいろ変わることを考えると、「& CHANGED_LINK」というのは、結局、右から6番目の桁が1かどうかを調べていることになります。
例えばオーナーとコンテンツが変わった時
128+1で129、2進数は10000001
10000001
00100000
上下ともに1の桁がないので結果は0、つまりFALSEとなり、if文は通りません。
という計算が&です。
2進数を知っていれば理解は容易いですが、そうでないと難しいので説明は省いておりました。
基本的、ではありますが、説明してないですね(^^;
ちょっと長くなりますが・・・。
&はビット演算のAND演算子です。
ビット演算というのは、2進数の計算です。
2進数とは0と1だけで構成された数値です。
表面からではわかりませんが、コンピュータはあらゆるデータを2進数で保持しています(0と1)。
例えば7という数値であれば、0111という2進数になります。
CHANGED_LINKという定数は、中身は32ですが、これを2進数であらわすと100000になります。
一方、changeですが、この変数の中身は、「変化したもの」によって変わってきます。
オーナーが変わった時には128、2進数にすると10000000です。
コンテンツが変わった時には1、これは2進数でも1です。
そしてリンクが変わった時は32、2進数で100000。
では、オーナーとコンテンツが両方とも変わった時には?
オーナー128、コンテンツ1で、足して129になります。
これを2進数にすると、10000001です。
オーナーとコンテンツとリンクが変わった時には?
128+1+32で161、2進数にすると10100001になります。
ですので、例えば、オーナーとコンテンツとリンクが変わった時、
if (change & CHANGED_LINK)
このif文は、
if (10100001 & 100000)
このようになっていることになります。
AND演算は、「両方ともTRUE(または1)の場合にTRUE(または1)、そうでなければFALSE(または0)」です。
詳しくは基礎知識編の「演算子」を参照してください。
10100001 & 100000
これがどうなるかというと、縦に書くと判りやすいのですが、
10100001
00100000
縦に見たとき、上下ともに1になってるところは1、そうでなければ0になります。
結果、答えは00100000になり、これは0ではないのでTRUEと見なされ、if文を通ります。
changeの値がいろいろ変わることを考えると、「& CHANGED_LINK」というのは、結局、右から6番目の桁が1かどうかを調べていることになります。
例えばオーナーとコンテンツが変わった時
128+1で129、2進数は10000001
10000001
00100000
上下ともに1の桁がないので結果は0、つまりFALSEとなり、if文は通りません。
という計算が&です。
2進数を知っていれば理解は容易いですが、そうでないと難しいので説明は省いておりました。
Posted by Miz
at 2007年09月13日 09:57

なるほどー。
たしかに、これなら複数の変更が同時に発生したとしても、
ひとつの引数と、ひとつの演算だけですんじゃいますね。
Run time permissionsにわたされる定数が
2の累乗になってるのはそういうわけだったんですね。
とても丁寧な解説のおかげで理解できました^^
ありがとうございます。
たしかに、これなら複数の変更が同時に発生したとしても、
ひとつの引数と、ひとつの演算だけですんじゃいますね。
Run time permissionsにわたされる定数が
2の累乗になってるのはそういうわけだったんですね。
とても丁寧な解説のおかげで理解できました^^
ありがとうございます。
Posted by joju at 2007年09月16日 13:08
コタツが恋しい季節になってきました。
みんなでコタツの周囲に正座して、粗茶をどうぞとふるまったのですが、
うまく飲んでくれる人がいません><。
正座のポーズで固まって、まったく動かない人や、
いきなり立ち上がってから飲み始める人などもいて、
とにかく動作が不安定です。
たぶん Japanesesit という、無料配布の正座アニメと、
抹茶を飲むためのアニメが、ぶつかり合っているのだと思います。
このような場合、どのように解決すればいいのでしょう?
ちなみに、和菓子を食べるアニメのほうは、再現されるのですが、
着座位置が上にずれてしまったりして、これも動作が不安定です。
みんなでコタツの周囲に正座して、粗茶をどうぞとふるまったのですが、
うまく飲んでくれる人がいません><。
正座のポーズで固まって、まったく動かない人や、
いきなり立ち上がってから飲み始める人などもいて、
とにかく動作が不安定です。
たぶん Japanesesit という、無料配布の正座アニメと、
抹茶を飲むためのアニメが、ぶつかり合っているのだと思います。
このような場合、どのように解決すればいいのでしょう?
ちなみに、和菓子を食べるアニメのほうは、再現されるのですが、
着座位置が上にずれてしまったりして、これも動作が不安定です。
Posted by Mayumi Charron at 2007年11月02日 13:23
>Mayumi Charronさん
こたつでお茶も良いですが、やっぱりミカンなども食べてみたいところですよねぇ。
アニメーションがうまく再生されない理由は、アニメーションの優先度の問題かと思われます。
例えば、正座アニメが優先度4で、お茶飲みアニメが優先度3だったりした場合、正座のほうが優先されてお茶飲みが再生されない、という事態になります。
和菓子のほうが再生されるにも関わらず位置がずれるというのは、優先度としては和菓子のほうが正座よりも高い(あるいは同等)にも関わらず、和菓子アニメの腰の高さと正座アニメの腰の高さが異なるためでしょう。
LSLを使って優先度を変えたり、アニメーションの再生位置(腰の高さ)を変えることは、残念ながらできません。
自前でアニメーションを用意してアップロードするのが最も最適な解決方法だとは思いますが・・・。
※他のアニメーションとの兼ね合いまで考えて作られているアニメーションはあまり多くありませんが(特にフリーのものはそうです)、製作者がわかるようなら相談してみてはいかがでしょうか。
こたつでお茶も良いですが、やっぱりミカンなども食べてみたいところですよねぇ。
アニメーションがうまく再生されない理由は、アニメーションの優先度の問題かと思われます。
例えば、正座アニメが優先度4で、お茶飲みアニメが優先度3だったりした場合、正座のほうが優先されてお茶飲みが再生されない、という事態になります。
和菓子のほうが再生されるにも関わらず位置がずれるというのは、優先度としては和菓子のほうが正座よりも高い(あるいは同等)にも関わらず、和菓子アニメの腰の高さと正座アニメの腰の高さが異なるためでしょう。
LSLを使って優先度を変えたり、アニメーションの再生位置(腰の高さ)を変えることは、残念ながらできません。
自前でアニメーションを用意してアップロードするのが最も最適な解決方法だとは思いますが・・・。
※他のアニメーションとの兼ね合いまで考えて作られているアニメーションはあまり多くありませんが(特にフリーのものはそうです)、製作者がわかるようなら相談してみてはいかがでしょうか。
Posted by Miz at 2007年11月05日 11:32
京都幕末などでも正座のアニメーションを探してみたのですが、
どうやら、同じような問題を抱えているように感じられました。
そこで、正座のアニメをいろいろ変更したり、試行錯誤しているうちに、
なんとか問題を解決出来たかなーっ、まだ少し動作が不安定で怪しいけど、
ほぼ実用になる段階まで、ようやくこぎつけました。
一般的なカフェで、普通の椅子に座って飲み物を飲んでいるときにも、
突然椅子から浮き上がることがあって、どこのカフェでも苦労しているようです。
ポーズボールなど、他のものを使って座ると浮くという話もあって、
あえて、1プリムの椅子にしているカフェもありますが、
完全解決には至っておらず、皆さんお困りの様子です。
そういう現状を目の当たりにして、私が作った正座ゴタツは、
運良く現象を抑えることが出来るようになって、ラッキーだと感じています。
そうそう、コタツミカンは、ポップコーンを食べるアニメを流用すれば、
それとなく食べているように見えますね。
どうやら、同じような問題を抱えているように感じられました。
そこで、正座のアニメをいろいろ変更したり、試行錯誤しているうちに、
なんとか問題を解決出来たかなーっ、まだ少し動作が不安定で怪しいけど、
ほぼ実用になる段階まで、ようやくこぎつけました。
一般的なカフェで、普通の椅子に座って飲み物を飲んでいるときにも、
突然椅子から浮き上がることがあって、どこのカフェでも苦労しているようです。
ポーズボールなど、他のものを使って座ると浮くという話もあって、
あえて、1プリムの椅子にしているカフェもありますが、
完全解決には至っておらず、皆さんお困りの様子です。
そういう現状を目の当たりにして、私が作った正座ゴタツは、
運良く現象を抑えることが出来るようになって、ラッキーだと感じています。
そうそう、コタツミカンは、ポップコーンを食べるアニメを流用すれば、
それとなく食べているように見えますね。
Posted by Mayumi Charron at 2007年11月07日 17:23
初めてコメントさせていただきます。
スクリプトに関しては、超初心者です。
今までに、一人掛け用の椅子は、こちらのスクリプトのお陰で、何個か作成することができました。
ありがとうございます。
今回、2人掛け用の椅子を作りたいと思っているのですが、どうすればよいのか。。。。
さっぱり見当がつきません。。。
お教えいただければ幸いです。
よろしくお願いします。
スクリプトに関しては、超初心者です。
今までに、一人掛け用の椅子は、こちらのスクリプトのお陰で、何個か作成することができました。
ありがとうございます。
今回、2人掛け用の椅子を作りたいと思っているのですが、どうすればよいのか。。。。
さっぱり見当がつきません。。。
お教えいただければ幸いです。
よろしくお願いします。
Posted by Mee
at 2007年11月14日 01:18

>Meeさん
ごく簡単に説明するなら、一人掛けの椅子を二つ並べてリンクすれば、それで二人掛けの椅子になります。
スクリプトで座る位置を指定した場合、そこには一人しか座れませんので、二人目は別のprimに座ってもらわなければいけません。
二人目用の着席位置も一人目のスクリプトと同様に書きます。
つまり二つの着席位置それぞれについて、一つずつスクリプトが必要です。
例えば、ただのキューブに着席用のスクリプト(この記事で解説しているコード)を入れてみて下さい。
うまく座れることを確認したら、そのキューブをコピーして隣に並べて置きます。
そして二つのキューブをリンクすれば、二人掛けの椅子になります。
あとは椅子らしく形を整えてやればOKです。
ごく簡単に説明するなら、一人掛けの椅子を二つ並べてリンクすれば、それで二人掛けの椅子になります。
スクリプトで座る位置を指定した場合、そこには一人しか座れませんので、二人目は別のprimに座ってもらわなければいけません。
二人目用の着席位置も一人目のスクリプトと同様に書きます。
つまり二つの着席位置それぞれについて、一つずつスクリプトが必要です。
例えば、ただのキューブに着席用のスクリプト(この記事で解説しているコード)を入れてみて下さい。
うまく座れることを確認したら、そのキューブをコピーして隣に並べて置きます。
そして二つのキューブをリンクすれば、二人掛けの椅子になります。
あとは椅子らしく形を整えてやればOKです。
Posted by Miz at 2007年11月14日 09:48
早速のコメントと丁寧な説明、ありがとうございます。
早速試してみます^^
早速試してみます^^
Posted by Mee at 2007年11月14日 12:19
いつも読ませていただいてとても参考にさせてもらってます^^
初コメントさせていただきます。
一人掛けの椅子を作ったんですが、それに規範のsitのスクリプトを入れ込んで、ダイアログを表示させてpose1〜5まで変更させるようにしたんですが^^;
胴体から上のアニメーションは表示させれるのですが、足のクロスさせている所や大きく開いてる表現がうまく表示されるず、規範のsitに組み込まれている行儀良く座る感じに固定されてしまいます><
初心者なものでどうしてもわからなくてコメントさせてもらいました。
おおよそながらsitのスクリプトが問題なのかと判断しているのですが。。
そこからいきずまりで^^;
ご指導いただければ幸いです。
初コメントさせていただきます。
一人掛けの椅子を作ったんですが、それに規範のsitのスクリプトを入れ込んで、ダイアログを表示させてpose1〜5まで変更させるようにしたんですが^^;
胴体から上のアニメーションは表示させれるのですが、足のクロスさせている所や大きく開いてる表現がうまく表示されるず、規範のsitに組み込まれている行儀良く座る感じに固定されてしまいます><
初心者なものでどうしてもわからなくてコメントさせてもらいました。
おおよそながらsitのスクリプトが問題なのかと判断しているのですが。。
そこからいきずまりで^^;
ご指導いただければ幸いです。
Posted by shinji at 2007年11月19日 09:05
>shinjiさん
優先度の問題かと思われます。
デフォルトのsitアニメーションは優先度4(最高)になっているので、それ以下の優先度のアニメーションは正しく再生されません。
llStopAnimation("sit")のようにして、デフォルトのsitアニメーションを停止してから、独自のアニメーションを再生するようにしてやれば解決するかと思います。
手っ取り早く解決するなら、独自のアニメーションの優先度を4にするというのも手です。
優先度の問題かと思われます。
デフォルトのsitアニメーションは優先度4(最高)になっているので、それ以下の優先度のアニメーションは正しく再生されません。
llStopAnimation("sit")のようにして、デフォルトのsitアニメーションを停止してから、独自のアニメーションを再生するようにしてやれば解決するかと思います。
手っ取り早く解決するなら、独自のアニメーションの優先度を4にするというのも手です。
Posted by Miz at 2007年11月19日 09:45
早急のコメントありがとうございました^^
試してみますね^^
試してみますね^^
Posted by shinji at 2007年11月19日 11:12
大変参考になりました。ありがとうございます。
ポーズボールについてなのですが、アニメーションは再生で出来たのですが、複数のアニメーションを組み合わせたジェスチャーでの再生は出来ませんでした。
ポーズボールでジェスチャーの再生は不可能ですか?
ご指導いただだければ幸いです。
ポーズボールについてなのですが、アニメーションは再生で出来たのですが、複数のアニメーションを組み合わせたジェスチャーでの再生は出来ませんでした。
ポーズボールでジェスチャーの再生は不可能ですか?
ご指導いただだければ幸いです。
Posted by dai at 2010年11月08日 13:41