だまし絵(アナモルフォーシス)とは?
特定の視点から見たときに文字や絵が復元されて見えるだまし絵のことです。
身近なとこでも活用されており、道路に書かれている「止まれ」の文字がドライバーにとって見やすくするために縦方向に伸びていたり、ガードレールの絵などがあります。
ちなみにアナモルフォーシスとはだまし絵の美術用語のことです。
実際のゲームでの例として『アサシンクリードヴァルハラ』ではアナモルフォーシスを用いたパズルギミックがあります。
https://wotpack.ru/ja/assassin-s-creed-valhalla-reshenie-zagadki-s-kamnjami/
上記の画像のタイプのものはデカールアクターなどで投影すれば実装できると思いますが今回は違うタイプのものを実装してみようと思います。
実装方針
アナモルフォーシスにも種類がいくつかあり、ゆがみや反射などを利用するタイプなど様々です。
今回は現実では物理的に難しくゲームエンジンならではの表現としてオブジェクトそのものが別の形状に変形するような表現をしてみたいと思います。技術的には簡単です。
オブジェクトの変形実装については主に以下が考えられます。
(実装方法自体はやろうと思えばさらにたくさんあると思います。)
- マテリアル(WPO)による変形
- 頂点位置をテクスチャに焼きこみ VAT 的に頂点変形
- モーフターゲットによる変形
- GeometryScript などによるランタイムでのメッシュ変形
今回はお手軽にモーフターゲットを利用して壁がゆがむようなオブジェクトを作ります。
(壁がゆがんだだけじゃ絵として意味が弱いのでアナモルフォーシス感が薄いですが、、)
blender でオブジェクトを用意する
基本的に以下の項目を満たすオブジェクトであれば問題ありません。
- ベースとなるメッシュと、変形後メッシュが完全に同一のトポロジを持っている
- 変形は Shape Key として定義されている
- ベース形状は「通常視点で見たときの自然な状態」、変形後は「特定視点から見たときに成立する形状」になっている
キューブを壁っぽくして特定視点にきたら中央付近が歪むようにします。
細分化させて "yugami" という名前でシェイプキーを作成しました。このキー名はUE側で参照します。
Cキーのサークル選択で中央付近を適当に選択し歪ませました。
これで fbx でエクスポートします。
UE にインポートする
FBX のインポート時にモーフターゲットがスケルタルメッシュではないと動かないのでスケルタルメッシュになるように設定をします。
アナモルフォーシスの実装
今度はUE側で実装していきます。BPを作成し、インポートしたメッシュを追加します。
特定の位置から見たときに変形できるように特定の位置を表す ViewPoint としてシーンコンポーネントを追加しています。
Arrow や BillBoard は分かりやすいように追加しています。
次に実装です。
大体こんな感じのことをやっています。
距離
- カメラとオブジェクトとの距離を取得
- アナモルフォーシスが成立する距離範囲にクランプ
- 適切な距離ほど値が 1 に近づくように変換
向き
- カメラの視線方向と、オブジェクトの基準方向を比較
- 内積を使って「どれだけ正面から見ているか」を数値化
- 正しい方向を向くほど値が大きくなる
全体処理です。
完成がこちら
おわり
ホラー表現やパズルギミックなんかに使えそうですね。
全体的に簡易的な実装だったんですがなんかちょっと不気味な壁ができた気がします。





