2015年8月3日月曜日

Shadow Projector活用サンプル~地面から離れると小さく消失する影~

Unity提供のアセット(Shadow Projector)で「丸い影」を落とすサンプル。

ただし上昇して地面から離れるほど影を小さくして消失させます。







サンプル

環境: Windows7x64。Unity5.1.1f1 personal。

プロジェクトのダウンロードはGitHubサイト右下 Download ZIP
https://github.com/maruton/Sample_ShadowProjector



概要

普通(?)にShadow Projectorを利用して「丸い影」を落としたのが下の図1。影を上から照射しています。

この場合、上昇していくと影は次第に大きくなります。
(ある程度の高さを超えると影は薄くなり見えなくなります)

図1


上昇していくと小さくなり、やがて消失する影を考えてみます。

図2は影を下から照射しています。
下方から照射しても床の裏側だけでなく、表側にも影がレンダリングされることを利用します。

図2



光の回折

現実世界で太陽光下(無限遠から平行に照射)のような状況にて、光の回折を考えた場合。
高度が上がるほどに太陽光は真下に回り込むようになります。

結果、上昇していくと影は徐々に小さくなりいずれ完全に消失します。
(電灯などの近接してる非並行な光では逆に影は大きくなったりするので図1の方が自然な感覚)

Unityで屋外フィールド上をキャラクタが上昇/下降するような場合、演出的にも影が小さくなることで高度が上がってる感が出しやすそうです。


とはいえ「誰も影なんかそこまで見てない」という意見が最も的確な気もしますが、


ちょっとやってみたくなったので ⊂⌒~⊃。Д。)⊃


と、強引な動機付けが済んだところで、以後簡単に補足説明。

※夏休みの自由研究に格子回折とかちょっと面白いかもしれません(´∀`)




使用するアセット

Shadow projectorのAssetはUnityに標準で提供されていますが、パッケージ名がUnity5で変わったようです。

Shadow projectorを含むAssetは上部メニューから、

Assets > Import Package > Effects

で、インポート。



Shadow projectorの配置

ここではCubeをキャラクタに見立てて配置しています(オブジェクト名Character)。

インポートしたAssetに含まれる BlobShadowProjector をCharacterオブジェクトにドラッグ&ドロップして子Objectにします。



BlobShadowProjector が下から影を照射するように配置。



Floorオブジェクトに影の照射はしつつもCharacterオブジェクトには照射したくないのでレイヤで調整します。

ここでは簡単に、
  • レイヤ名Characterを新しく作り、Characterオブジェクトをそのレイヤに設定。
  • 子オブジェクト BlobShadowProjector はDefaultレイヤのまま。
さらに 子オブジェクトBlobShadowProjector を選択、Inspector内の Ignore Layersに レイヤ名 Character を指定。

これで レイヤ名 Character に配置したCharacterオブジェクトには影が照射されなくなります。


この状態で床下、床上を見ると以下のようになります。

影は床の表裏ともにレンダリングされているので、床上でも影が見えます。

ここでオブジェクトCharacterを上に移動していくと影が小さくなり、BlobShadowProjector が床よりも上に出た時点で影は消失するようになります。


この辺の微調整は BlobShadowProjector の Inspector内の Field Of View で行います。
他、照射の距離範囲はNear Clip Plane、Far Clip Plane等々。




ここまでで一応、上昇すると影が小さくなりやがて消失する影が簡単にできます。

しかし、Characterオブジェクトが傾むく動作をすると、子オブジェクトのBlobShadowProjector はぶら下がった振り子のような挙動になる為、真下に影が照射されません。

サンプルプロジェクトではこの辺も対応しています。



補足

  • 地面から遠くなるにつれて影の輪郭がハッキリしてしまう
    本当は徐々にぼやけていくべきですが、しくみの都合上仕様です。
    がんばってシェーダーをいじればぼかすこともできるかもしれませんが、軽量低負荷簡単手抜きという目的もあるので割り切ってしまう方が得策と思います。
    シーン上での見せ方とか、高速移動してるとどうせわからないとか、ごまかす手段はいろいろありますタブン|∀゚)
     
  • キャラクタ本体のScaleに注意
    親Objectであるキャラクタ本体と BlobShadowProjector  のScale値が等しくない場合、子オブジェクトの距離指定時に相互Scaleの比率で倍率がかかります。詳細は割愛しますがUnity4頃からこうなっているので仕様なようです。
    距離に倍率をかけて補正すれば良いだけですが無駄な演算が増えるのでScaleは共に <1,1,1>にした方が無難です。
     
  • 本体キャラが縦長の場合
    影そのものはBlobShadowProjector のInspector内のAspect Ratioで縦横比を簡単に変更できます。問題はキャラ本体の向きに追従させなければならない点ですが、サンプルでは軽量化の為考慮してません。
    BlobShadowProjector の向きをキャラ本体の向きに合わせるように制御すれば可能だと思います。
     
  • 本体キャラがロール/ピッチ変動する場合
    サンプルのiTween移動のようにロール/ピッチ角が変動すれば影の縦横比も変動すべきですが、これも軽量化の為に常に丸影です。
    まじめにAspect Ratioを動的に変えてやればそれっぽい楕円な影が落とせそうです。(でもロール/ピッチの両方はちょっと面倒そうです。Field Of Viewも動的にいじらないとダメかも?)


    しかし所詮「丸影」なのでそこまでする必要性は要検討です。

結局なんちゃって影なので、凝るのはほどほどにしておくのが良さそうです(´∀`)


0 件のコメント:

コメントを投稿