QRコード
QRCODE
アクセスカウンタ
読者登録
メールアドレスを入力して登録する事で、このブログの新着エントリーをメールでお届けいたします。解除は→こちら
現在の読者数 0人
オーナーへメッセージ
slMame › 一日一膳腹八分目 › 算数 › 斜面に沿って回転させる
2014年03月01日

斜面に沿って回転させる

知人から質問を受けたので久しぶりに。。

下のSSの様に、ある特定の方向(黄色いUFOの方向)を向いているプリムを、

斜面に沿って回転させる





斜面に沿って回転させる



と言う風に斜面に沿って元向いていた方向を維持しながら傾斜させることを考えます。

これは、以前にだらだらと書いておりました、
http://rbk.slmame.com/e971594.html
の変種で、戦車の車体が傾斜している地面、回転させたいプリムが砲塔、そして砲身が無いバージョンになります。

このような場合は、まず、llCastRay()を使って、下の地面の法線ベクトルと、黄色のUFOの方向(つまりllRot2Fwd(llGetRot())を取得します。
法線ベクトルとは、面に垂直な方向を向いている長さ1のvectorの事です。つまり、回転対象の上の面がこのベクトルの方向を向けば良いという事になります。つまり下の図のように回転させればよいという事で、この場合は元々の自分の上方向のベクトルllRot2Up(llGetRot())と、法線ベクトルの間でllRotBetween()を取ってやると回転角の差分が求まります。今の自分の回転にこの回転差分をかけてやると、上面方向は一致します。

斜面に沿って回転させる



上面の傾きが一致しました。ただ、この回転だけを仮に実際にやると、llRot2Up()で上面だけ特定方向を向けたときのように、正面がどこを向くかが不定になります。
そこで、次に、下のSSの様に、その面内で回転して元見ていた黄色のUFOの方向を向けさせます。

斜面に沿って回転させる




この時に少し考え方に工夫を入れてやると、この問題は簡単になります。まず、下の図のように、先に回転させた白線の回転結果と反対に、自分の回転が完全にゼロになるまで、UFOと自分の回転を戻してやります。

斜面に沿って回転させる



具体的には、先に取得しておいた自分の元々の正面方向(UFOの方向)のベクトルを、白線矢印の回転をした後の自分の回転で割ります。
自分の方は、自分の回転を自分の回転で割るので常にZERO_ROTATIONになりますので、<1,0,0>と、<UFOベクトルのX,UFOベクトルのY,0>との間のllRotBetween()を取れば、すぐに平面上での回転方向は定まります。

つまり、手順的には、

1)
自分の正面方向の単位ベクトルllRot2Fwd(llGetRot)を求めておき、

2)
llCastRay()の結果と自分の上方向のノルムllRot2Up(llGetRot)の間の回転角を求め、これを現在の自分の回転にかけた値を先に求め、

3)
1)の正面方向ベクトルを2)の結果の回転で割って回転後のローカル座標系での見かけの方向に直し、次にその結果の上下方向回転だけをゼロにした、つまりZ値だけ0にしたベクトルのノルムを求め、

4)
3)の結果とローカル座標系の正面方向<1,0,0>とのllRotBetweenを取り、

5)
4)の結果に2)の結果をかけたrotationをllSetRot()等する


という手順になります。
この場合は、2)の手順の時にまず一つのベクトルを求め、3)の手順でもう一つのベクトルを求め、これが直交ベクトルになるので4)と2)の合成(5)で3次元回転が一意に決まる、という手順です。また、5)の掛け算の順は、必ず4)に2)をかけなければなりません。これは、4)がローカル回転、2)がグローバル回転になるからです。

他の手順もありますが、3次元回転をベクトルで割り出す場合は基本的に2手順で2つの直交するベクトルを求めて、もう1次元分の向きが自動的に定まるように計算します。


同じカテゴリー(算数)の記事画像
秋祭り開催中(lsl+α:任意形状のあたり判定をする)
lsl 戦車砲をシミュレートする
lsl 特定の面のサイズと4隅のリージョン座標を取得する
lsl 座標系の変換(vector)
スカート製造装置(物体の回転その3)
物体の回転その2(対空砲)
同じカテゴリー(算数)の記事
 秋祭り開催中(lsl+α:任意形状のあたり判定をする) (2010-10-10 00:03)
 lsl 戦車砲をシミュレートする (2010-09-26 14:09)
 lsl 連立一次方程式を解く (2010-02-22 21:40)
 lsl 多倍長演算 (2010-02-10 22:04)
 lsl 特定の面のサイズと4隅のリージョン座標を取得する (2009-12-04 21:04)
 lsl 座標系の変換(vector) (2009-11-03 15:09)

Posted by RBK Drachnyd(しお) at 19:48│Comments(0)算数
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。