ビルボードを使って、常にカメラの方を向く木のオブジェクトの作り方を紹介したいと思います。
最近ではビルボードを使う機会も減り、パーティクル以外ではあまり使われなくなりました。ただ、スマートフォン用など、ROM容量が厳しい環境では、依然として使われているようです。
ビルボードの歴史
そもそもどうしてビルボードというものがあるのか、というところから説明したいと思います。今でこそ記憶媒体は豊富になりましたが、ひと昔前までは今では想像できないぐらい記憶媒体の容量が少なかったのです。したがって、ゲームの容量(サイズ)を出来る限り減らすことを常に意識する必要がありました。
ドラクエのROMサイズが64KBだったというのは有名な話ですね。一体どうやって作ったのか、想像を絶するものがあります。
マリオの雲と草も同じテクスチャを使いまわしていたり、マリオとルイージは色違いだったりと、色々と容量を減らすための涙の努力が見え隠れします。
そんな中で、リッチでハイポリな木の3Dモデルなんか使えるはずもありません。かといって、そのまま木を平面に貼り付けただけでは、見る方向によってものすごく不自然な見た目になってしまいます。
そのために考えられた技術がビルボードです。ビルボードの実体は平面に貼ったテクスチャですが、常にカメラの方向を向く特性を持っています。そのため、あたかも2Dオブジェクトを3Dオブジェクトのように見せることができるのです。
ビルボードの作り方
ではどのようにしてこのビルボードを作るのかを紹介します。Unityを使わずにビルボードを作る場合はカメラの位置とオブジェクトの位置から変換行列を自力で計算しなくてはいけません。
UnityではLookAtという超便利なメソッドが用意されているため、非常に簡単にビルボードを作ることができます。次のプログラムをビルボードにしたいオブジェクトにアタッチするだけです。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BillBoard : MonoBehaviour { void Update () { Vector3 p = Camera.main.transform.position; p.y = transform.position.y; transform.LookAt (p); } }
ただし、3Dモデル(Planeなど)にテクスチャを貼り付ける場合、平面を90度回転してカメラに向けた状態で使うことが多いと思います。
初期状態で回転した状態だとビルボードが正しく動かないため、回転していない空のオブジェクトを用意し、モデルをその子要素にして下さい。
この場合、ビルボードのスクリプトは親のオブジェクトにアタッチします。
実行結果
ビルボードで作った木の間を車が走行するデモがこちらです。見た目に全然不自然ではありません。言われなければビルボードを使っていることは分からないのではないでしょうか。
ですが実際は、カメラの移動に合わせて結構壮絶な木の大回転が行われています(笑)バックヤードの動画がこちらです。
なんと、木がいっせいに動いている・・・ジブリの世界?ですね。
おまけ
ちなみに、スーパーマリオ64のボム兵は球体の部分(体)の部分だけ、ビルボードで作られているようです。昔は容量がなかった分、面白技術が色々と生まれたのですね。