2010年6月8日火曜日

砲台の回転

オブリビオンのオブジェクトの座標系が理解しがたい。

CSでオブジェクトを回転させると、どうにも直感的ではないと思う人は多いと思う。
ある軸を回転させると、軸まで回転してしまうような印象を受けるからだと思う。

というよりも、通常のプログラミングで物体を回転させるには、回転結果が累積する場合が多く、計算にはマトリクスを使い、たんに重ねてやれば良いだけなので、日常的に3Dプログラミングをしている人でも悩むと思う。

なので、普通は、Zを90度回転後、Xを90度回転した場合と、Xを90度回転後、Zを90度回転させた場合では結果が異なる。

しかし、オブリビオンは、常に X,Y,Zの順で回転させてあるっぽい(たぶん)

SetAngle Z 90
SetAngle X 90

とやろうが


SetAngle X 90 
SetAngle Z 90
とやっても、同じ結果になるのだ。


で。砲台は長いこと下向き固定だったのだけど、詰めの段階なので、回転スクリプトが必要になった。試行錯誤しているのだが、どうにもうまくいかない。

シャトルも似た様な計算で、動いているが、そっちは適当。
シャトルは、水平方向で回転が発生した際に、バンクするように作ってあるのだが、目標角度に到達するまでバンク角の回転パラメータが増えつつも、スタビライザー(安定化の機構)で水平に寄るように減らされ続ける。
目標角度に到達すると、スタビライザーによって、バンク角が減らされ続け、最終的に0になると水平を保つ。
こういう感じなので、若干計算に誤差があっても、スタビライザーで補正されるので、適当でも見た目悪くない。

砲台は、一度その方向を向いたら、射撃が終わるまで動かないので、正確に計算してやら無いと、ずれたままユーザーに見られることになるので、なんとかしなければならない。

で。

目標の座標を(X1,Y1,Z1)とする。
砲台の座標を(X2,Y2,Z2)とする。

砲台を 目標に回転させて正面を向かせてやるには、どうすればよいか。

初期値
砲台の初期状態での正面は真下を向いた状態で、回転角度は、XYZともに0。


X軸 奥(-)から手前(+)
Y軸 左(-)から右(+)
Z軸 下(-)から上(+)


砲台を 目標に向ける場合、まず、砲台の水平平面と垂直平面で回転を考える。
直角三角形を2つおいて考えてやればよい。

直角三角形の辺の長さ
DX = X1-X2
DY = Y1-Y2
DZ = Z1-Z2

水平方向の回転角度
θ1= arctan (dy,dx) + 90

斜辺(水平(XY)平面上での距離)
dr = sqrt ( dx * dx + dy * dy )

垂直方向の回転角度
θ2= arctan (dz,dr) - 90


普通ならここで計算は終了して、
Z軸を θ1 回転させた後に、X軸を θ2 回転させればOKだと思うのですが、今回はそうは行かないらしい。

回転の順序が X,Y,Z と決まっているので、X軸を回転させた状態で、Z軸を回転させても、先に述べた結果とは異なるので、この計算式はそのままでは使えない。


で、実際どうなるのか、どういう変換をすればいいのか見当も付かない。

CSで動かして値を確認。
(1)物体 B は、X=90,Y=90,Z=0 の時、正面が手前方向を向きます。

(2)物体 B は、X=90,Y=180,Z=0 の時、正面が奥を向きます。
(3)物体 B は、X=0,Y=90,Z=90 の時、正面が左方向を向きます。
(4)物体 B は、X=0,Y=270,Z=90 の時、正面が右方向を向きます。
(5)斜め方向たとえば、物体Bほ左手前方向に向ける場合
X=45,Y=45,Z=325(概算) ぐらいになる模様。

Z軸で、まず水平方向の向きを合わせて、そこから垂直方向をX軸とY軸であわせるという考え方で行きます。

(1)~(5)の各値を見ると、ある軸が0の時、ある軸が90なので、sin cos でいけそうな気がする。
リニアで補間してやってもそれらしくなるような気はするが、面倒なので三角関数で球面補間をする。というより、むしろそれが正しいと思う。


それぞれの座標軸に対する回転角度 θx,θy,θz を求めてやる。

θx = θ2 * sin θ1
θy = -θ2 * cos θ1
θz = θ1

砲台の初期位置による向きを補正する

θx = θ2 * sin θ1
θy = -θ2 * cos θ1
θz = -θ1+90

で。

まだおかしい。

はてさて・・・

2 件のコメント:

  1. 正直今一番期待しているModだったり・・・
    スクリプト作れる人はいいですね
    首長くして待ってますよー

    返信削除
  2. 応援ありがとうございます。
    うーん。
    外観とか遠目にはいい感じで見えても、近くで見ると、ひどい所もあります。

    手動でマッピングすれば、もっとよくなると思うのですが、大きかったり、面の角度の問題で、修正しづらい箇所がけっこうあるので、どうなんだろう・・・。
    過剰な期待は禁物です(;;

    返信削除