オブジェクトとピボットポイント
みなさん、ピボットポイントって気にしていますか?
マニュピュレーターと呼ばれる矢印の始点のことです。 オブジェクトの位置、回転、スケール調整の起点というイメージも強いのではないでしょうか。

Unreal Engineでは、中ボタンを押しながらマニュピュレーターをドラッグすることで、ピボット位置を動かすことができます。さらに、右クリックのPivotメニューからその変更をオフセットとして保持することも可能です。

また、モデリングモードでStaticMesh自体のオブジェクト原点を個別に変えることも可能です。
これらの操作によって回転軸やスケールの起点をずらすことで、調整しやすくなるケースも多いです。

一方で、クリックした際に表示されるピボット位置は、オブジェクトの原点はここですよ、というサインでもあります。
さて、ここで少し実践的なケースを見てみます。

都市モデルや大規模な建物モデルを扱う際、下処理なしにインポートすると、このような事態に見舞われることは少なくありません。 ちなみに、これはPLATEAUのモデルです。 公式サイトでもPivot位置の扱いには注意を促されています。
PLATEAUの3D都市モデルを本トピックの方法で読み込んだ場合、オブジェクトをドラッグして位置移動できる「ピボット」と呼ばれるアイコンが表示されている位置と、実際の建物とが数キロメートル離れていることも珍しくありません。 いくつかの演算処理では、ピボット位置を基準に計算するため、ピボットから離れた場所にあると、十分な精度が出ない、もしくは、期待した効果にならないことがあります。 例えば、オブジェクトを破壊する「Chaos Destruction」などは、その典型的な例です。
そして、続けて個別に1つずつオフセット位置を修正する方法も紹介されていますが・・・
(都市全体の膨大なパーツでこれをするのは正直つらいですよね・・・)
最適化や描画処理において、ピボットポイントをしっかりと考慮することはベストパフォーマンスにつながる大切な観点です。
プロシージャルにオブジェクトの原点を真ん中にする
ちょうど最近、UEFNで大きな建物の外部モデルを扱う機会があり、まさにこの問題に直面しました。たくさんのオブジェクトに対してHoudiniで解決したことがなかったので、今回はその方法をまとめます。 何百もパーツがある場合やパーツのまとめ方を工夫したい場合に、プロシージャルは大変適したアプローチと言えるでしょう。
結果を先に書くと、このフローを配置するだけで実現できました。アウトプットはPackされたオブジェクトとなります。

作戦としては、
1.オブジェクトをパーツごとに処理できるようにする(For-EachNamedPrimitive)
2.原点から遥か彼方遠く離れたオブジェクトを一時的に原点へ移動させる(Justify/MatchSize)
3.原点にパーツがある状態をSave!(Pack)
4.元々の位置と原点付近に仮配置したときの位置関係の差分を書き出す(ExtractTransform)
5.パックされたオブジェクトを位置情報の差分を用いて元の位置に戻す(TransformPieces)
としました。これらを赤枠内で行っています。
さらにOutputノードにかけては、(おまけ)
6.パーツごとに分離したインスタンスとするために、unreal_split_instancesアトリビュートを付与(Attribute Create)
7.各PieceのUnreal Engineのプロパティ"DesiredMaxDrawDistance"を100000にする(Attribute Create)
→カメラから1000m離れたオブジェクトを描画しないようにする
8.HDAとしてUnreal Engineへ

これらの処理を経てアウトプットされた建物をクリックしてみると、想定した位置にpivot pointが表示されていることが確認できました!
※これはサンプル用にコア部分だけ組んだので、Piece数が3334になってますが、パーツ数が多いと ”unreal_split_instances” でクックが重くなることがあるので注意です。
街区ブロックごとにPieceアトリビュートを統合したりなど、分割ルールを自分で自由に設定しやすいところもHoudiniの素晴らしさですね。