【数学】ギズモ操作の実装

DCCツールやゲームエンジンなどで普段何気なく使用しているギズモ。

このギズモの操作って、同様の動作を実装しようと思うと意外に難しかったりする。

それでもカメラのアングルが一定であれば、比較的容易に実装できる。

ドラッグした方向を見て決めうちの補正値をかけてオブジェクトを移動してやればいい。

問題はカメラが自由に移動・回転するケース。

使用者は画面に対して右にドラッグすればオブジェクトも右に動いて欲しいし、下にドラッグすれば下に動くことを期待する。

けれども画面に対して右の方向が、必ずしもオブジェクトにとっても右になるとは限らない。

カメラがどこから捉えているかによって、ワールド座標上では下であるかもしれないし、左であるかもしれない。

たとえば、画面に対して右にドラッグした場合に、ワールド座標上でのその方向はどうやって取得すればよいのか?

どういうやり方がベストな答えなのかはわからないんだけれども、いろいろ試行錯誤の上、なんとか実現できた。

俺がたどり着いたやり方を箇条書きするとこんな感じになる。

・まず、ギズモの各軸が2Dスクリーン上でどっちの方向を向いているのか(つまり方向ベクトル)を取得する。
(これはたぶんワールド座標からスクリーン座標への射影という計算になるんだと思う)

・次に、2Dスクリーン上でマウスでドラッグした方向ベクトルを取得する。
 これは一フレーム前のマウス位置と現在のマウス位置の差分で求められた。

・二つのベクトルが分かれば、二つのベクトルの成す角が内積によって求められる。
 この内積の値はコサイン値なので、ギズモのある軸に対して、マウスが正の方向にうごいたのか負の方向に動いたのか、どのくらいの正確さでその方向に動いたのかという情報として使える。

・あとは上で求めたコサイン値に補正値(ギズモの移動する早さなど)をかけて、ワールド座標上のギズモの軸の方向へ移動してあげればうまく行った。

動画がこちら

数学は苦手だけれども、必要に迫られてじっくり落ち着いて考えると、ちょっとずつ解ってきたような気がするのが楽しい。

3年前

コメントを残す

メールアドレスが公開されることはありません。