2011年05月30日
プリムを変形する際、ローカル方向へ移動させるには
こんにちは、いつもお世話になっております。
スクリプトで変形するアイテムを製作中、下記の問題にぶつかり、自力で解決することが出来ませんでした。
どなたかご存知の方がいらっしゃいましたら、お力を貸して頂けますと幸いです。
<問題>1プリムのスカルプトアイテムを多段階に変形させる際、形状により中心の位置がずれてしまいます。
1.スカルプトアイテムの「位置の計測」は、グローバルでとっています。
2.スカルプトはそれぞれの段階をリンクしてから、回転・移動の差分を求めて、それを元にして移動させています。
状況1>南向きで「1.位置の計測」を行ったアイテムを「西向きに設置」して変形すると、位置が微妙にずれてしまいます。
状況2>南向きで「1.位置の計測」を行ったアイテムを「南向きのまま設置」すると、位置はずれずに正しく変形できます。
状況2により、計測した位置の差、角度の差は正しいことが証明されています。
状況1により、計測した初期角度から向きが変わると、正しい方向へ移動できません。
方法案>「1.位置の計測」で出された数値に、「状況2」の場合+90度(南→西)分をプラスする事が出来れば、正しい移動をするのではないか、と考えているのですが、どうすればそうした動作が可能となるのかが判りません。
または、もっと別の方法などがあるのでしょうか。
下記のように移動の差分を計算しましたが、うまくいきませんでした。
vector p = 1段階目のグローバル位置-2段階目のグローバル位置
rotation d_rot = 計測時の角度
vector s = llRot2Fwd(d_rot)*p.x+llRot2Left(d_rot)*p.y+llRot2Up(d_rot)*p.z;//現在の位置からの差分
vector position = llGetPos()-s
差分を正しく適応して、どの角度で設置しても、プリムがずれないように変形させたいと思っています。
どうぞよろしくお願いいたします。
スクリプトで変形するアイテムを製作中、下記の問題にぶつかり、自力で解決することが出来ませんでした。
どなたかご存知の方がいらっしゃいましたら、お力を貸して頂けますと幸いです。
<問題>1プリムのスカルプトアイテムを多段階に変形させる際、形状により中心の位置がずれてしまいます。
1.スカルプトアイテムの「位置の計測」は、グローバルでとっています。
2.スカルプトはそれぞれの段階をリンクしてから、回転・移動の差分を求めて、それを元にして移動させています。
状況1>南向きで「1.位置の計測」を行ったアイテムを「西向きに設置」して変形すると、位置が微妙にずれてしまいます。
状況2>南向きで「1.位置の計測」を行ったアイテムを「南向きのまま設置」すると、位置はずれずに正しく変形できます。
状況2により、計測した位置の差、角度の差は正しいことが証明されています。
状況1により、計測した初期角度から向きが変わると、正しい方向へ移動できません。
方法案>「1.位置の計測」で出された数値に、「状況2」の場合+90度(南→西)分をプラスする事が出来れば、正しい移動をするのではないか、と考えているのですが、どうすればそうした動作が可能となるのかが判りません。
または、もっと別の方法などがあるのでしょうか。
下記のように移動の差分を計算しましたが、うまくいきませんでした。
vector p = 1段階目のグローバル位置-2段階目のグローバル位置
rotation d_rot = 計測時の角度
vector s = llRot2Fwd(d_rot)*p.x+llRot2Left(d_rot)*p.y+llRot2Up(d_rot)*p.z;//現在の位置からの差分
vector position = llGetPos()-s
差分を正しく適応して、どの角度で設置しても、プリムがずれないように変形させたいと思っています。
どうぞよろしくお願いいたします。
テクスチェンジのHUDについて
モール用のプリムカウンターを探しています
連続するアニメーションの処理
オブジェクトの上にフローティングテキストを出す。
チャットログの盗聴について
椅子に座った後で位置調整できるスクリプト
モール用のプリムカウンターを探しています
連続するアニメーションの処理
オブジェクトの上にフローティングテキストを出す。
チャットログの盗聴について
椅子に座った後で位置調整できるスクリプト
その場合でしたら、記録されているベクトルの差分にその時の回転を掛け、その値を現在の原点座標に足します。(足す、引くの符号はスクリプトを組まれた時の記録時のやり方次第です)
http://wiki.secondlife.com/wiki/Rotation/ja
の中段にvectorの回転という項目がございます。
なお、「真南を向いている」という言葉がどういう状態を指しますか判断に迷いますが、記録時に回転がZERO_ROTATIONか、その真逆を向いている場合という事だとは思いますので、その場合は記録のアルゴリズムが間違っていても見かけ上正しく記録されているように見える状況はあります。ので、上記(つまり再生側の改修)だけでは上手くない場合は記録側も疑ってください。この場合も原理はlsl-wikiのそれですので、記録する直前にその時の回転であらかじめ割って、無回転の値にしてから記録、とします。
ご回答ありがとうございます。
無事に思った通りの動作が出来るようになりました!
情報を記録する際に、現在の角度で除算していなかったのが原因だったみたいです。
勝手にグローバルな値として差が出ると思い込んでたため、なかなか思い至りませんでした;
本当にありがとうございます。