The WONDER ROAD

     

Uターンの失敗からリスタートするブログ

2022年05月

今回は、Blenderでサッカーグラウンドをつくってみたいと思います。


Blender_Soccer_Ground

Contents

  1. サッカーグラウンドのつくり方

1. サッカーグラウンドのつくり方

こちらの動画を参考にしながら簡単につくっていきたいと思います。



  1. 平面オブジェクトを追加

    デフォルトのキューブオブジェクトを削除し、  Shift  +  A  →「メッシュ」→「平面」から平面オブジェクトを追加します。

  2. 平面のサイズを変更

     N キーを押してプロパティシェルフを表示し、平面オブジェクトのサイズをサッカーのピッチサイズの105m × 68m に合わせて 115m × 75m に設定します。

    Soccer_Ground_01

    このままだとスケールが X=37.5, Y=62.5 に設定されているので、  Ctrl  +  A  →「全トランスフォーム」を選択してこの形状をデフォルトにします。するとスケールがリセットされ、すべてのスケール値が1となります。

    Soccer_Ground_02

  3. 平面にマテリアルを設定

    マテリアルタブから「新規」をクリックしてマテリアルを追加し、適当に名前を付けます。
    ベースカラーをクリックし「#425c1b」に設定します。

    Soccer_Ground_03     Soccer_Ground_04

    もうひとつマテリアルを追加します。  N  ボタンを押して新しいマテリアルスロットを追加し、もう一度「新規」をクリックしてマテリアルを追加し、こちらも適当に名前をつけます。

    Soccer_Ground_05  Soccer_Ground_06


  4. オブジェクトをコピー

    もう一つのマテリアルを設定するために  Shift  +  D  ボタンで一度オブジェクトをコピーして、  G  +  X  ボタンを押してオブジェクトを平行移動しておきます。
    アウトライナーウィンドウに平面オブジェクトがもう一つ追加されます。



    コピーしたオブジェクトに2個目のマテリアルを割り当てます。
    マテリアルを割り当てるときには編集モードにする必要があるので注意してください。

  5. シェーダーエディタを開く

    マテリアルを編集するために、まずシェーダーエディタを開きます。
    3Dビューウィンドウの右上にポインターを移動させると  +  マークが表示されるので、そのままドラッグしてウィンドウを分割します。
    分割したウィンドウのヘッダーから、一番左のアイコンをクリックすると、エディタを選択できるのでシェーダーエディタをクリックします。

    Soccer_Ground_08

    Soccer_Ground_09


  6. ピッチにラインを追加する

    事前にサッカーのピッチに引かれているラインの画像を作成しておきます。
    サイズは小さくても構いませんが、縦と横の比率や線の幅など全て同じスケールで縮小する必要があります。そして、背景は透明にしておきます。

    White_Line_1


    シェーダーエディタに戻り、最初から表示されている「プリンシパルBSDF」ノードを削除し、替わりに「画像テクスチャ」ノードを追加します。
    そして、「開く」から保存したピッチ上のラインの画像を選択すると、平面オブジェクト上にラインが表示されます。

    Soccer_Ground_10

    このままでも平面に合わせてきちんとラインが表示されていますが、画像をUV座標に合わせて貼り付けられるようにテクスチャ座標ノードを追加し、「UV」を画像テクスチャノードの入力ソケットにつなげます。

    Soccer_Ground_11

  7. 2つのシェーダーを合わせる

    ピッチ上の芝の部分と白いライン部分を合わせるために「シェーダーミックス」ノードをつかって2つのシェーダーを合わせます。

    まず、ラインの画像を表示させた画像テクスチャノードのカラーをシェーダーミックスの2番目のシェーダーにつなぎます。
    また、アルファソケットをシェーダーミックスの係数につなぎます。これでラインの画像の透明部分には1番目のシェーダーの画像が表示されます。
    つぎに、1番目のシェーダーとして「ディフューズBSDF」ノードを追加します。

    Soccer_Ground_12

    平面オブジェクトはこのようになります。

    Soccer_Ground_13


  8. ピッチの縞模様を表現する

    サッカーのピッチではよく芝生が縞模様に刈られています。この縞模様をテクスチャで表現します。

    Soccer_Ground_Camp_nou

    これには「波テクスチャ」ノードを使います。
    ただ「波テクスチャ」ノードだけを背景を表現している「ディフューズBSDF」ノードに接続するとこのようになります。

    Soccer_Ground_15


    Soccer_Ground_14

    縞模様が白黒ですし、方向も90°回転した方向になってしまっています。


  9. 縞模様を緑に変更

    まず、色を緑の濃淡の縞模様にするために「RGBミックス」ノードを間に接続します。
    「波テクスチャ」ノードのカラーソケット(出力)を「RGBミックス」ノードの係数ソケット(入力)へ接続します。また、「RGBミックス」ノードのカラーソケット(出力)と「ディフューズBSDF」ノードのカラーソケット(入力)を接続します。これでノードの接続は完成です。

    次はそれぞれの色の設定ですが、「RGBミックス」ノードの「色1」「色2」で濃い緑色と薄い緑色を指定します。今回は濃い緑を「#075900」、薄い緑を「#4A6C30」としました。これで縞模様が緑の濃淡で表示されます。

    Soccer_Ground_16


    Soccer_Ground_17



  10. 縞模様の向きをかえる

    まだ縞模様が表示させたい方向と違うので変更します。
    「テクスチャ座標」ノードで平面オブジェクト上に基準となる座標系を設定し、その座標をもとに「マッピング」ノードで位置や向きを変更します。
    手順としては、「テクスチャ座標」ノードのUVソケット(出力)を「マッピング」ノードのベクトルソケット(入力)に接続し、「マッピング」ノードのベクトルソケット(出力)と「波テクスチャ」ノードのベクトルソケット(入力)を接続します。そして、「マッピング」ノードでZ軸周りに90°回転させます。これで表示させたい向きの縞模様になりました。

    Soccer_Ground_18


    Soccer_Ground_19



  11. 境目をはっきりと

    芝生の濃淡の境目がぼやけているのでもっとはっきりさせます。これには「カラーランプ」ノードをつかいます。
    「波テクスチャ」ノードのカラーソケット(出力)と「カラーランプ」ノードの係数ソケット(入力)を接続し、「カラーランプ」ノードのカラーソケット(出力)と「RGBミックス」ノードの係数ソケット(入力)を接続します。そして、「カラーランプ」ノードのカラーバンド上にある2つのカラーストップを両方とも中央付近に集めることで境界がはっきり見えるようになります。

    Soccer_Ground_20


    Soccer_Ground_21


  12. 縞模様のサイズを変更

    さらに縞模様が実際のピッチより細いのでもう少し大きくしていきます。
    これには「波テクスチャ」ノードの「スケール」を変更します。数字を小さくしていくと縞が大きくなります。ここでは写真を見ながら「2.8」にしました。

    Soccer_Ground_22


  13. パーティクルシステムで芝生の質感を再現する

    このままではツルっとした緑のシートのような見た目なので、天然芝の質感を少しでも出すためにパーティクルシステムを使用します。
    パーティクルプロパティタブからビューリスト横の  +  を押して新しくパーティクルシステムを追加します。
    タイプを「ヘアー」に変更し、サッカーのピッチの芝生はだいたい20mmくらいらしいのですが、見た目にわかりづらいので少し長めの0.05m(50mm)に変更します。

    ここからは詳細を調整していきます。

    まず「放射」のなかの「数」を「100」に設定します。

    次に「子パーティクル」を設定します。
    「レンダリング時の数」は「100000」にします。「表示数」は大きくすると画面の表示が遅くなるので「1000」くらいにしておきます。
    子パーティクルの「長さ」を「1.0」のままとします。

    「粗さ」タブから「均一」の値を0.02に変更します。

    画面の表示はあまり変化がありませんが、レンダリングするとしっかりヘアーパーティクルが表現されます。

    ヘアーパーティクルの設定の詳細はこちらの記事をどうぞ。




  14. アンビエントオクルージョンを追加する
    アンビエントオクルージョン(AO)とは、凹凸がある物体の陰影を強調する効果があります。
    ここでは「波テクスチャ」ノードと「カラーランプ」ノードの間に「AO」ノードを入れて設定します。
    その後、「ワールドプロパティ」タブから「サーフェス」を「背景」にし、色を「黒」に設定します。


  15. レンダリングの設定をする

    「レンダープロパティ」タブからレンダラーを「Cycles」に設定します。
    次に「サンプリング」タブ内の「レンダー」の値を「250」へ変更します。
    「レンダー」値は使用しているPCのスペックによりますので、レンダリングに時間がかかるようなら少しおとしてください。


  16. ライトの設定

    3Dビューポート内のライトオブジェクトを直接クリックするか、アウトライナー内の「Light」をクリックして選択し、位置を調整します。
    ライトのタイプは「サン」を選択し、「強さ」を「10」とし、色も少し黄色がかった色に設定します。ここでは「ffffe0」としました。


  17. カメラの位置調整

    レンダリング画像の視点を調整します。
    3Dビューポートに表示されている状態を視点にしたい場合は、  Ctrl  +  Alt  + テンキー  0  でカメラが現在の視点へ移動します。

    視点を確認しながら移動させたい場合は テンキー  0  を押してカメラの視点に切り替え、  N  キーでプロパティシェルフを表示し、「ビュー」タブのなかの「カメラをビューにロック」にチェックを入れると、カメラの位置を調整することができます。

    また、プロパティシェルフの「トランスフォーム」タブからカメラの座標と角度を指定する方法もあります。


このようにして作成した画像がこちらです。

Soccer_Ground_AO





今回はこちらの動画を参考にさせていただきました。









前回は、ヘアーパーティクルシステムをつかって芝生を表現するモデルをつくりました。今回はそれを実際にレンダリングしてみたいと思います。

Blender_Lawn_Mat_Rendering

Contents

  1. パーティクルシステムのレンダリング
  2. 1m×1m芝生マットのレンダリング
  3. サッカーコートをレンダリングしたらどうなるか
  4. 子パーティクルの粗さ
  5. レンダリング時間

1. パーティクルシステムのレンダリング

芝生を表現するためにつかった「ヘアーパーティクルシステム」という機能ですが、設定をするだけで細かいたくさんの毛のようなものを表現することができます。

しかし、オブジェクトの表面全体に配置すると、オブジェクトのサイズによってはパーティクルの数がとても多くなってしまい、レンダリング時間が長くなってしまうというデメリットがあります。
そのため、本物に近い表現を維持しながら、できるだけパーティクルの数を減らす必要があります。

では、実際、本物に近い表現を維持するためにはどのくらいのパーティクルが必要で、そのときのレンダリング時間はどのくらいになるのでしょうか?

それを今回は芝生のモデルを使いながら確認してみたいと思います。

2. 1m×1m芝生マットのレンダリング

それでは前回つくった 1m×1m の芝生マットをレンダリングしてみたいと思います。

まず、親パーティクルだけの状態でレンダリングしてみます。


親パーティクル数 子パーティクル数 レンダリング時間
1000 0 32秒
5000 0 50秒
10000 0 52秒

パーティクル数が増えるとレンダリング時間も増えますが、パーティクル数に比例して増えるようではありません。実際に 5000 → 10000 では、パーティクル数は2倍になっていますがレンダリング時間はそれほど変化ありません。

Lawn_Mat_P1000
1000
Lawn_Mat_P5000
5000
Lawn_Mat_P10000
10000

レンダリング画像を見ると、このサイズのモデルで芝生の質感を表現するには「10000」程度のパーティクル数が必要なようなので、トータルのパーティクル数は「10000」として、子パーティクルをつかってレンダリング時間を比較してみます。

親パーティクル数 子パーティクル数 レンダリング時間
10000 0 52秒
100 100 54秒
10 1000 54秒

このモデルでは、親パーティクルと子パーティクルの割合を変化させても、レンダリング時間に大きな変化はありませんでした。


3. サッカーコートをレンダリングしたらどうなるか

それでは、フルサイズのサッカーコートをヘアーパーティクルをつかってレンダリングして、芝生の質感を再現したら、どのくらいのパーティクル数が必要で、レンダリング時間はどのくらいになるのでしょうか?
実際に確認してみたいと思います。


親パーティクル数 子パーティクル数 レンダリング時間
100 100 37秒
100 1000 40秒
100 10000 1分01秒
100 100000 2分55秒
1000 10000 2分56秒

Full_P100C100
親100-子100
Full_P100C1000
親100-子1000
Full_P100C10000
親100-子10000
Full_P100C100000
親100-子100000
Full_P1000C10000
親1000-子10000




さすがにモデルのサイズが大きいので、100万個以下のパーティクル数であれば表面が完全に覆われていません。

1000万個であれば、十分に芝生の質感を表現できます。レンダリング時間もこの程度であれば問題はないでしょう。

次に、1000万個のパーティクルに「粗さ」のプロパティを追加した場合のレンダリング時間を確認してみます。


粗さ レンダリング時間
なし 2分55秒
均一 3分05秒
終端 3分11秒
ランダム 3分16秒

Full_P100C100000
なし
Roughness_Unified
均一
Roughness_Endpoint
終端
Roughness_Random
ランダム


画像のサイズに対してヘアープロパティの長さが短いからか、「粗さ」のプロパティを追加してもレンダリング画像の変化はあまりなく、どの場合もそれなりに芝生を表現できています。

この結果からフルサイズのサッカーコートでも1000万個程度のパーティクルを設定すれば、レンダリング時間を考えても十分に対応できそうです。


今回はフワフワの芝生の庭やグラウンドなどを表現する方法を紹介します。細かい設定で見た目がどのように変わるかも確認しましょう。


Blender_Lawn_Mat



Contents

  1. ヘアーパーティクルシステム
  2. 放射パネルの設定
  3. 子パーティクルパネルの設定
  4. 子パーティクルの粗さ

1. ヘアーパーティクルシステム

芝生を表現するためには、「パーティクルシステム」の「ヘアー」という機能を使用します。これは指定した表面から細い糸のようなものを発生させます。
まずはヘアーを発生させるための準備をします。
  1. 試しに芝生マットのようなものをつくってみたいので、まず平面オブジェクトを作ります。ここではサイズは1m×1mとしました。
  2. 平面にマテリアルを設定し、適当な名前をつけます。ここでは「Lawn_Grass」としました。シェーダーもデフォルトで選択されている「プリンシプルBSDF」のままで、色を「7cfc00」とします。
  3. プロパティエディタから「パーティクルシステム」を選択して、タイプを「ヘアー」にします。

    Lawn_Mat_01

これで平面オブジェクトからヘアーパーティクルを発生させることができました。

2. 放射パネルの設定

それでは細かい設定による違いを確認していきます。まずは放射パネルで設定するプロパティについてです。放射パネルでは次の4つのプロパティが設定できます。
  • シード
  • ヘアー長
  • セグメント

Blender_Particle_Emittion_1


    数    

ヘアーパーティクルの数を設定します。
計算負荷が大きくなるのでできるだけ少なくします。このサイズの芝生だと10000程度は必要に見えます。
後から紹介する「子パーティクル」という機能をつかうと、「数」を増やさずにボリュームを出すことができます。
Lawn_Mat_Number_1k
1000
Lawn_Mat_Number_5k
5000
Lawn_Mat_Number_10k
10000

    シード    

この値を変更するとヘアーパーティクルの発生する位置がランダムに変化します。ただ、今回は特に必要ないので使用しません。


    ヘアー長    

ヘアーの長さを設定します。
一般的に芝の長さは2~5cmくらいらしいのですが、ここでは変化が分かりやすいように長めの10cm (0.1m) に設定します。


    セグメント    

セグメントの数を設定します。
セグメントはヘアーの動きを出すため機能で、ヘアーをいくつかの節でつながった直線で表現します。


3. 子パーティクルパネルの設定

「 子パーティクル」とは、設定した親パーティクルに基づいて自動的にボリュームを増やす機能になります。

Lawn_Mat_Child_Panel

「シンプル」では親パーティクルの周辺に集中して「子パーティクル」が表示されます。親パーティクルが発生面の端の方にある場合は「子パーティクル」が発生面からはみ出すこともあります。
「 補間」では各親パーティクル間を埋めるように「子パーティクル」が表示されます。

Lawn_Mat_Child_None
なし
Lawn_Mat_Child_Simple
シンプル
Lawn_Mat_Child_Intepolate
補間

「 子パーティクル」パネルでは以下のプロパティを設定します。
  • 表示数
  • レンダリング時の数
  • 長さ
  • しきい値
  • シード

    表示数 / レンダリング時の数    

「表示数」「レンダリング時の数」は各親パーティクルに対して発生する「子パーティクル」の数を設定します。
「表示数」は3Dビューポートに表示される「子パーティクル」の数となり、「レンダリング時の数」はレンダリングした際の画像に表示される「子パーティクル」の数となります。
「表示数」を大きくすると操作時に動作が遅くなり操作しづらくなるので、「表示数」はある程度の数に設定し、「レンダリング時の数」のみ希望の数に設定するのがよいと思います。


    長さ / しきい値    

「長さ」は「子パーティクル」の長さを設定します。値は放射パネルで設定した親パーティクルの長さに対する割合で設定し、0~1となります。
「しきい値」も同様に0~1の値で設定され、「長さ」の設定に影響されない「子パーティクル」の割合を指定します。
「長さ = 0.5 」「しきい値 = 0.5」とすると表示される「子パーティクル」の半分だけが、親パーティクルと同じ長さとなり、残りの半分が親パーティクルの半分の長さとなります。

Lawn_Mat_Children_threshold_0
しきい値 0
Lawn_Mat_Children_threshold_0.5
しきい値 0.5
Lawn_Mat_Children_threshold_1.0
しきい値 1.0

    シード    

この値を変化させることで「子パーティクル」をランダムに変化させます。

4. 子パーティクルの粗さ

    均一    

「子パーティクル」の位置によって形が変わります。

Lawn_Mat_Children_Roughness_Uniform


    終端    

それぞれの「子パーティクル」の終端を移動した形になります。

Lawn_Mat_Children_Roughness_Endpoint

    ランダム    

ランダムに「子パーティクル」の形を変化させます。

Lawn_Mat_Children_Roughness_Random

それぞれの粗さプロパティを追加してレンダリングしてみます。


Lawn_Mat_Rough_None
粗さ なし
Lawn_Mat_Rough_Unify
粗さ 均一
Lawn_Mat_Rough_Endpoint
粗さ 終端
Lawn_Mat_Rough_Random
粗さ ランダム

「粗さ」のプロパティを追加しない場合はまっすぐに伸びた芝生のようになります。
「均一」のプロパティを設定すると、芝目の流れのような模様をもった状態になります。
「終端」のプロパティを設定すると、荒れた芝生のような表現になります。
「ランダム」のプロパティを設定すると、「均一」のときのような流れはなく一様に乱れた芝生になります。


次回は、このモデルのレンダリング時間を調べてみたいと思います。

このページのトップヘ