Second Life in Japan
Advertisement

Scripters_cafeログ


08/08/09[]

サーバーのバージョン1.24で追加されたllDetectedTouchPos()とllDetectedTouchNormal()をプレビューグリッドにて試しました。


llDetectedTouchPos()は、プリムの面上でタッチされた位置をリージョン座標で取得できます。

llDetectedTouchNormal()は、プリムの面上でタッチされた位置のポリゴンに対する法線ベクトルを取得できます。


llDetectedTouchPosとllDetectedTouchNormalを使ってレーザーポインタ[]

これまでオフィスアワーにてカメラ位置の取得を応用したレーザーポインタなどの話題が出ていましたが、今回はタッチした位置とその場所での法線ベクトルを使ったレーザーポインタを作ってみよう、ということで早速作ってみました。

TestingPos&Normal

この画像はFakeさん作のポインタで、タッチした面上の座標と法線ベクトルをそれぞれllDetectedTouchPos/llDetectedTouchNormalで取得し、それをポインタオブジェクトに通信で送信し、ポインタオブジェクトは受け取った座標・向きに移動するというものです。


法線ベクトルの扱いのちょっとした勘違い[]

このポインタを作る途中で、法線ベクトルの扱いを少しだけミスしていました。法線ベクトルは向きを表すものですが、rotationや、rotationのEuler表現とは全く異なります。 最初(あまり考えずに)法線ベクトルの値をllEuler2Rotしてオブジェクトの向きに適用してしまっていました。


法線ベクトル→回転の変換[]

法線ベクトルから、オブジェクトの向きを知るためには、何らかの方向で変換を行う必要があります。

方法はいくつかあると思いますが、<0,0,1> ベクトルからの回転を求めるのが手軽かもしれません。法線ベクトルが normal_vec 変数に格納されているとして、以下のようにして回転を得ることができます。

rotation rot = llRotBetween( <0,0,1>, normal_vec );



【参考】

Advertisement