こんにちは、Steemです。今回紹介するのは、指定した平面にオブジェクトをピタリとくっつけるスクリプトです。
(このタイプのスクリプトはもうひとつ(次回記事:StmPlaneProjection)作成したので、ちょっとしたシリーズになるかもしれません。)
こちらはPythonスクリプトです。
動画
機能紹介
動画にある通り、こちらはオブジェクトを一定の方向に移動し、指定したサーフェスにピタリと揃えるスクリプトです。オブジェクトは変形せず、トランスフォームのみが変化します。
UI:クリックで拡大
こちらUIはシンプルです。
- オブジェクト(群)を登録
- サーフェス(スナップ先)を登録
- 実行ボタン
サーフェスはポリゴンオブジェクトを指定してください。
オブジェクトをスナップする方向はオブジェクトのローカルY方向とワールドY方向の2つから選択可能です。どちらも+Y,-Yいずれの方向にもスナップします。(両方にスナップできる場所がある場合、近い方にスナップします。)
また、スナップ先のフェースの向きに合わせてオブジェクトを回転させられます。(オブジェクトのローカルY軸をスナップ先の法線ベクトルに最小回転で揃えます。
(動画にある通り、きれいに回転します。)
なお、これらサーフェスへのスナップと回転について、オブジェクトの基点は「ピボット位置」です。特定の場所を接地させたいという場合には、あらかじめその場所にピボットを移動しておく必要があります。
追加説明
スクリプト名 "stmRayDrop" ですが、こちらは「オブジェクトのピボット位置から指定した方向(ローカルYまたはワールドY方向)にレイを飛ばし、サーフェス上でぶつかった点にオブジェクトをドロップする」という仕組みから来ています。覚えにくかったらすみません。
(冒頭に挙げたもうひとつのスクリプトも実のところレイを飛ばしているのですが…あくまで「平行投影」を意識したのでこちらは "Projection" です。)
またさらに余談になりますが(少し長いです)、オブジェクトの回転の決定には「クォタニオン(四元数)からオイラー角への変換」を用いています。クォタニオンが何かといえば、3次元空間の回転を記述する四つのスカラーを持つ値で、具体的には「回転軸(ベクトル)」「回転角(スカラー)」から成り立ちます。
クォタニオンの作成とオイラー角への変換はそれぞれコマンドひとつで実行できるため、あとはこのクォタニオンの作成に必要な「回転軸」「回転角」が得られればよいわけです。
ここで当スクリプトにおいては、オブジェクトのローカルYをフェースの法線ベクトルに揃える回転をしたいので、回転軸は両方のベクトルに直角なベクトル = 外積ベクトル、回転角は正規化した二つのベクトルの内積のacos(cosの逆数)を用いればよいというわけです。これで回転に必要な全ての情報が揃います。
最小回転をこんなにも直感的に記述できる便利な道具があるものですねという、数学的な話でした。
おわりに
今回は平面スナップツールを紹介しました。
もとは大きくない用途のためのスクリプトだったのですが、以前発表したタイルを作成するスクリプトについて、平面にしか対応していないと言われそうだな…と思い配布できる形にしてみようと作成に取り掛かりました。
地形を調節しながら柔軟にオブジェクトを移動できるツールです。デフォーマを使用するとノード管理もややこしくなり、そもそもオブジェクト自体の変形も生じますが、これを使えば一瞬です。
とりあえず曲面に何かを置きたいと思ったときには、使用できる局面がそれなりにあるのではないかと思います。
=================
こちらのスクリプトを無料配布しています↓
ダウンロードページはこちら
(2025.12.28更新)
=================
お問い合わせはこちらまでお願いします。
