llLookAt について.クリエータの方お願いします.

llLookAt について.クリエータの方お願いします.

- Iseki Fumikazu の投稿
返信数: 12

llLookAt 関数を実装しようと思っています.

直感的にはクォータニオンで球面線形補間(これは非常にポピュラーな方法)をすればいいように思うのですが,長い間完全ではないようですし,懸賞金まで出ているようですので,もしかするとそんなに単純ではないのでしょうか?

http://www.hypergridbusiness.com/2015/01/opensim-users-pledge-900-to-improve-vehicles/

ただ Wiki の ”forward 軸 (x 軸正方向) を水平に保ったまま” というのが意味不明です.

http://wiki.secondlife.com/wiki/LlLookAt/ja

これは何を意味しているのでしょうか? この辺が落とし穴なのでしょうか?

クリエータの方でお詳しい人が居られましたら,是非アドバイスをお願いします.

 

Iseki Fumikazu への返信

Re: llLookAt について.クリエータの方お願いします.

- Yan Lauria の投稿

井関先生、円錐を例にすると、Z軸というのは円錐の尖った方向です。この円錐のX軸方向に翼を生やしたものを想像してください。

これに対して、

       llLookAt( llDetectedPos(0) + <0.0, 0.0, 1.0>, 3.0, 1.0 );

 を仕込むと、円錐の尖った方向をターゲットに向けますが、その際に左右の翼は水平に保っているということじゃないでしょうか。バンクさせるには別の仕掛けがいるかと。

Yan Lauria への返信

Re: llLookAt について.クリエータの方お願いします.

- Iseki Fumikazu の投稿

一応,SLの方で試してみたのですが,X軸(ローカル)の方向は水平にはならなかったので.... ??

SLでのサンプルを探して OpenSim と SL で試すとよさそうですね.

 

 

Iseki Fumikazu への返信

Re: llLookAt について.クリエータの方お願いします.

- Iseki Fumikazu の投稿

llLookAt() のバグを解説した Youtube を見つけました

Iseki Fumikazu への返信

Re: llLookAt について.クリエータの方お願いします.

- Yan Lauria の投稿

YouTubeを見ても、やはり両翼は水平を保っています。

私もSL内でllLookAtとMoveToTargetを試してみましたが、はやり両翼を水平に保つみたいです。

Iseki Fumikazu への返信

Re: llLookAt について.クリエータの方お願いします.

- 削除済みユーザ の投稿

こんばんは。

「forward 軸 (x 軸正方向) を水平に保ったまま」は誤訳が放置されているのだと思います。

LSL Wikiの英語版では、ここは「while keeping its forward axis (positive x) below the horizon」という記述なので「x軸の前方(x軸の正方向)を【水平線より下に】保って」でしょう。

じっさいにSecondLifeで挙動を見ると、llLookAtで追いかける対象が真上にあるのでなければ、角度の多少はあれ、x軸の正方向の面は下を、負方向の面は上を向きます。
そして常に水平が保たれるのは、x軸方向ではなく、y軸方向です。

削除済みユーザ への返信

Re: llLookAt について.クリエータの方お願いします.

- Iseki Fumikazu の投稿

ありがとうございます.

それならば意味が通りますね.(^^

来週あたりから頑張ってみます.

Iseki Fumikazu への返信

Re: llLookAt について.クリエータの方お願いします.

- 削除済みユーザ の投稿

プログラミングはまったくわからないため、お役に立てるかどうかわかりませんが、こんなスクリプトを書きました。OpenSimにて動作確認済みです。

// llLookAtの動きを疑似的に再現するスクリプト。
// ここでは「targetprim」という名前のオブジェクトを、0.5秒おきに検知し、
// llSetRotで能う限りの速度と強さ(?)で「上」(z軸の正方向)の面をそちらへ向けます。
// 具体的には検出された対象物と自身の座標(と距離)から、
// 仰角と平面上の向きを別々に計算し、これを合成して回転させています。

float range = 60; // 検知できる距離(メートル)
float rate = 0.5; // スキャンの頻度(秒)
vector updown; // 真上が< 0.0, 0.0, 0.0 >
vector flatrad;

default
 {
  state_entry()
   {
    llSensorRepeat( "targetprim", "", PASSIVE, range, PI, rate );
   }

  sensor( integer num_detected )// 目標を検知したら
   {
    vector targetpos = llDetectedPos( 0 ); // 目標の位置を取得
    vector mypos = llGetPos(); // 自身の位置を取得
    float distance = llVecDist(targetpos, mypos); // 目標までの距離を取得
    if(distance > 0)
     {
      updown = <0.0, llAcos((targetpos.z - mypos.z) / distance), 0.0>; // 目標との高低差と距離から仰角を取得(ラジアン)
      float ew = (targetpos.x - mypos.x); // 両者のx座標の差と
      float ns = (targetpos.y - mypos.y); // y座標の差より
      flatrad = <0.0, 0.0, llAtan2(ns , ew)>; // 平面上の向きを計算(ラジアン)
      rotation rot1 = llEuler2Rot(updown);
      rotation rot2 = llEuler2Rot(flatrad);
      llSetRot(rot1 * rot2); // クォータニオンに変換後、回転を合成して適用
     }
   }
 }

削除済みユーザ への返信

Re: llLookAt について.クリエータの方お願いします.

- Iseki Fumikazu の投稿

>> プログラミングはまったくわからないため

いえいえ,ご謙遜を!! (^^

助かります.できるかどうか分かりませんが,参考にさせていただきます.

ありがとうございます.

削除済みユーザ への返信

Re: llLookAt について.クリエータの方お願いします.

- Iseki Fumikazu の投稿

時間ができたので(すみません.状態慣性質量が半端ないものですから),改めて見直したのですが,これって擬似的どころか完璧じゃないですか!!

Iseki Fumikazu への返信

Re: llLookAt について.クリエータの方お願いします.

- Iseki Fumikazu の投稿

すみません.

llLookAt()は2/24 に Fix されたみたいです.

たった今,Janus Dugong さんのアルゴリズムでもちゃんと動作することを確認したのに...

もう少し早く対応すれば良かったですね.懸賞金が..... ごめんなさい.....(涙

http://www.hypergridbusiness.com/2015/02/dahlia-trimbles-code-fix-earns-2000-bounty/

Iseki Fumikazu への返信

Re: llLookAt について.クリエータの方お願いします.

- 削除済みユーザ の投稿

あ、でも、対象のほうを向く「速度」と「強さ」は手つかずだったので、お気になさらないでください。

削除済みユーザ への返信

Re: llLookAt について.クリエータの方お願いします.

- Iseki Fumikazu の投稿

すみません.反省してます... orz

でも Janus Dugong さんもすごいと思いますよ.v(^^

プログラムミングはやはりアルゴリズムが第一です(それからデータ構造).
アルゴリズムさえちゃんとできていれば,それを 何の言語で書くのかというのは,はっきり言ってどうでもいい話です.
LSLからC# もへの書き換えも本質的な問題ではないです.

アルゴリズムを考えてプログラミングする人と,出来合いのアルゴリズムでプログラミングする人(コーダー)は天と地ほどの差があります.

Janus Dugong さんのアルゴリズムはちゃんと動くことを確認しています.素晴らしいです!!

また何かありましたら,是非,是非アドバイスくださいませ.