Chapter Thirty-seven

第37話



今回はカーソルの変化から回転マトリックスを作り出すGuessAngle.viについて紹介しよう。第35話の時に、バグがまだあると白状したが、GuessAngle.viの中にいたのを見つけて狙い通りの動きをさせられるようになった。

画面上のカーソルのドラッグされた座標をもとに、表示データの座標系のz軸周りの回転量とディスプレイのX軸周りの回転量に分解して回転マトリックスを作るのがこのVIの役割だ。

入力は現在の回転マトリックス(Matrix)、データ領域の頂点の座標(HandlePonit)、データ領域の重心(GC)、ドラッグ後のカーソル位置(Cursor Position)の4個で、出力はカーソルのドラッグに対応した回転マトリックス(RotMatrix)だ。

ダイアグラムは画面におさまる範囲だが、少し大きいので二つに分割しても良かったかもしれない。

機能的には左下の@の枠で囲まれている部分が独立している。ここでは、HandlePointが現在のカーソルの位置に移動したと考えたときに画面の奥に向かうY座標の値を計算している。距離は回転しても変化しないから、重心からHandlePointまでの距離の二乗を計算しておいて、重心を基準としたカーソルのX座標とZ座標の二乗和を引いたもののルートをとればY座標が求められる。虚数になるような場合は回転不能なので基本マトリックスを出力することにした。

残りの大部分はかなり分かりにくいダイアグラムだが考え方は次のようなものだ。

1)データのz軸から画面のZ軸までの角度を求めて、(データのz軸を画面のZ軸に一致させるための)画面のX軸周りの回転マトリックス(Mx)を作る。同時に元に戻すための逆回転の回転マトリックス(Mxr)も作っておく。(Aの枠)

2)元のHandlePointと新しいHandlePointを1)で作った回転マトリックスで回転させてから二つののベクトルの角度を求める。このときの角度の求め方はZ軸の回転のあとX軸を回転させる手順で行う。この角度分だけ回転させるマトリックス(Md)を作る。(Bの枠)

3)データ[Vd]へのマトリックスの作用のさせ方は、(Mxr)×(Md)×(Mx)×[Vd]のかたちになるが、このVIでは合成したマトリックスを出力するところまでだ。(Cの枠)

二つの3次元ベクトルの間の角度を出力するVecor_Angle.viは新しくでてきたサブVIなので説明しよう。3D Polar.viというサブVIでx,y,zをR,theta,phiに変換した後、単純に引き算をしてX軸周りの回転角度とZ軸周りの回転角度を計算している。


以上、簡単な説明だったが、カーソルの動きに応じた回転マトリックスの変化分を出力し、(35話で説明した)呼び出し側のダイアグラムの中でWhile Loopのシフトレジスタにある現在の回転マトリックスに掛けることで最新の回転マトリックスを計算している。

これで表示の時の角度の指定が気軽に行なえるようになった。今回の機能アップではデータの重心を回転中心にすることにしたし、ベクトルの左側からマトリックスを掛けていくように考え方を変更したので本体もいじらなければならない。

See you!


Nigel Yamaguchi

戻る