Help us understand the problem. What is going on with this article?

[Unity] リアルな炎を作る

経緯

Unity でパーティクルシステムの勉強中ですが、試しに炎を作ってみました。
flame.gif

事前に参考になりそうな例をいくつかあさってみましたが、殆どは煙のようなモヤモヤしたテクスチャをアニメーションさせたりしてゆらぎをもたせてるか、ちょっとリアルっぽいものはテクスチャアニメーションになってるか、という印象でした。
例えば Standard Asset の FireComplex とか。

モヤモヤテクスチャは小さな炎だと違和感が出やすいし、テクスチャアニメーションはパターンが見えてくるように思います。
パーティクルの設定を弄って遊んでいるときに、幅の広めな軌跡(Trail)をランダム移動させたら炎っぽいのではないかと思いついて、試してみました。

方針

こちらの稲妻作成記事を参考にさせていただいて色々試していたのですが、
炎を太い軌跡で描いたら炎っぽく見えるんじゃないかと思いました。

初期状態から TrailNoise を有効にして(パラメーターは初期値です), RendererRenderMode: None, Trail Material: Default-Particle にしただけでこんな状態です。既になんとなく炎っぽいですよね?
step1.gif

リアルな炎って、意外と輪郭がくっきり見えるじゃないですか?
それを再現しようと思い、軌跡(Trail)のテクスチャは半透明の帯状にしました。進行方向前後は滑らかに透明になる一方で、(進行方向に対して)横方向には敢えて比較的はっきりした境界を付けます。イメージにするとこんな感じ。
sample.png
画像の左側が進行方向になるようです。

作り方(基本)

マテリアル

パーティクル用マテリアルを作って、炎用のテクスチャを貼るだけです。
ShaderParticles/Additive (Soft) がいいと思います。

設定 画像
flame-material.jpg horizontallines.png

右の画像は実際に使用したものです。私が作成したもので大した出来ではありませんが、複製・改変・再配布などに制限はありませんので、ご自由にお使いください。

Particle System

メインの設定です。
DurationLifetime は炎の高さに応じて調整してください。
Start Speed は Shape によっては炎の向きに係わります。一般的な炎なら強くし過ぎない方がいいでしょう。
Start Size はランダムにしてます。範囲は炎の大きさに合わせて調節してください。
Start Color は一般的な炎ならオレンジで半透明がよいと思います。オレンジのマテリアルが重なると重なった部分は少し黄色っぽくなります。
Gravity Modifier は、パーティクルが上の方へ向かうように -1 を設定しています。
flame-psystem.jpg

Emission

どれくらいのパーティクルを出すかを設定します。
プレビューを見ながらいい感じにしてください。
Rate over Time で通常時に出る量を調節します。
Bursts を設定することで、定期的にボワッと燃え上がる感じが出せます。
Count は控えめにしたほうが違和感が少ないです。
flame-emittion.jpg

Shape

パーティクルの出現位置を決めます。
これはもう、目的に合わせてご自由にどうぞ。
ただし広い範囲に出すなら、Emission で沢山パーティクル出すか、Particle SystemStart Size を大きめに設定しないとスカスカになります。
また、Shape の種類によっては、パーティクルが噴き出す方向が変わるので、都合が悪いなら Particle SystemStart Speed を小さくして、Gravity Modifier だけで動くようにするといいかもしれません。

設定 画像
flame-shape.jpg flame-shape-gizmo.jpg

Noise

炎にランダムな揺らぎを与えます。炎のサイズによって最適値は変わりますので、いい感じに調節してください。
Strength は強すぎると動きがギザギザになるのでほどほどに。沢山揺らがせたい場合は Position Amount の方を大きくします。ただし、こちらもほどほどにしないとロケット花火みたいになります。
Frequency はゆらぎの周期。炎の高さによりますが、大きすぎず小さすぎずでこれくらいがよいかと思います。
Size Amount はパーティクル(この場合一本の帯)の太さをうねうね変えます。炎の帯が帯っぽく見えすぎる場合は、ちょっと大きめにしてみるといいかも。
flame-noise.jpg

Trail

パーティクルの移動奇跡を設定します。今回の炎の場合パーティクル本体は描画しませんので、炎そのものと言って差し支えありません。
Lifetime を調節してください。小さすぎると変ですが、1より小さめの方が揺らいでる感じが出ます。
flame-trail.jpg

Renderer

パーティクルの描画設定です。
パーティクル本体は表示したくないので、Render ModeNoneを指定します。
Trail Material には、冒頭で作成したマテリアルを設定します。
flame-render.jpg

結果

ここまでの設定でこんな感じになりました
first-step.gif

さらにカスタマイズ

色に変化を持たせる

Partice SystemStart ColorRandom Between Two Colors を指定して、ちょっとだけ色に幅を持たせてみました。
flame-psystem2.jpg

炎の先端をいい感じにフェードアウトさせる

TrailsColor over Lifetime に Gradient を指定して、末端【画面右】で赤くなるように、また透明度を揺らがせて、またたくような効果を出してみました。
flame-trail2.jpg

周りを照らす

Lights を設定して、周囲の物体に光を飛ばすようにしました。
取り付けた光は普通にCreateしただけのポイントライトです。このライトはプレハブ化するか、シーンに置く場合は非アクティブにしておきます。
Ratio, Range Multiplier, Intensity Multiplier で適用量を調整します。
flame-lights.jpg

回転させる

最初は 2017 で作ってたせいかうまく行かなかったのですが、 2018 以降ならパーティクル回転させられるので、 Particle SystemStart Rotation (範囲を Random にする)と NoiseRotation Amout を弄るとよいです。

結果

私の場合さらに、Particle System, Shape, Emission, Lights などを微調整して冒頭の画像になりました。
flame.gif

まとめ

焚火くらいのサイズの炎として、思ってた以上にリアルな感じにできたと思います。

球体の全体を炎が包むような感じにしたくて、Shape を下記のように弄ってみましたが、あまり包み込んだように見えない & 炎の向きが横方向にばらけたりしてイマイチ調整しにくいなと思いました。
flame_shape2.jpg
焚火とかにつかうなら、SubEmitters で火の粉とか出すとさらにいい感じになりそうです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away