tpc33-2

TOPIC 33|PLATEAUを使った映像作品を作る【後編】 夜景の作り方と大量のオブジェクトのアニメーション制御[2/2]|夜景シーンを作る

PLATEAUの3D都市モデルを映像分野で活用するトピックの後編です。後編では、夜景の作成方法と大量のオブジェクトをアニメーションで制御する方法について説明します。まずは夜景をどのように表現するかを解説します。

Share

PLATEAUの3D都市モデルを映像分野で活用するトピックの後編です。後編では、夜景の作り方と大量のオブジェクトをアニメーションで制御する方法について解説します。

このトピックの内容は「PLATEAUを活用した映像表現の応用 LOD3の活用や大量オブジェクト制御によるシーン制作法」(2024年度PLATEAU Hands-onアーカイブ動画)でも制作方法をハンズオン形式で紹介しています。

【目次】

33.5  夜景を表現する

 33.5.1  街灯を付ける

 33.5.2  遠景で窓から漏れる光を表現する

33.6  浮遊するアニメーションシーンを作る

 33.6.1  浮遊させるビルを作る

 33.6.2  シーンに配置して浮遊する

33.7  まとめ

33.5 _ 夜景を表現する

次に、夜景シーンの作り方を解説します。PLATEAUのテクスチャは昼景なので、ポイントライトを追加したり、ビルの窓明かりのテクスチャを貼ったりして作ります。

【メモ】

TOPIC 25|PLATEAUを使った映像作品を作る」では、別の方法として、夜景の実写をカメラマッピングで貼ってシーンを作る例を示しています。興味のある人は、参考にしてください。

33.5.1 _ 街灯を付ける

まずは、近景において街灯や窓から漏れる光を付ける方法を説明します。ポイントライトで表現します。

図33-97 近景に街灯を設定する

【手順】街灯を追加する

[1]街灯を追加したい場所を指定する

街灯を追加したい場所に3Dカーソルを置きます。[Shift]キーを押しながら右クリックすると、3Dカーソルを移動できます。

図33-98 スポットライトを追加したい場所を3Dカーソルで指定する

[2]ポイントライトを追加する

[Shift]+[A]キーを押して、[Light]―[Point]を選択し、ポイントライトを追加します。

図33-99 ポイントライトを追加する

[3]街灯が追加された

街灯が追加されました。ビジュアルを見ながら位置や強さを調整します。

図33-100 街灯が追加された

[4]複製する

[Shift]+[D]キーで複製して、さらに街灯を配置します。窓の前に付けると、窓の薄明かりを表現できます。

図33-101 窓の前にポイントライトを設定したところ

33.5.2 _ 遠景で窓から漏れる光を表現する

遠景の場合、この方法で窓から漏れる光をひとつひとつ表現するのは数が多くて大変なので、窓からの光を表現したテクスチャを貼って表現します。

図33-102 テクスチャを貼って夜景を表現する

【手順】夜景のテクスチャを貼る

[1]テクスチャを用意する

まずは、使用するテクスチャを用意します。今回は、textures.comから2種類のテクスチャをダウンロードして使います。

・textures.com
https://www.textures.com/

今回使用したテクスチャは、以下の2種類です。seamlessのMサイズを使用しています。

https://www.textures.com/download/high-rise-night-0048/55320
https://www.textures.com/download/high-rise-night-0058/55357

図33-103 テクスチャ①
図33-104 テクスチャ②

[2]Shader Editorを起動する

画面を左右に分割して、Shader Editorを起動します。

図33-105 Shader Editorを起動する

[3]テクスチャを張り替える

この区画はLOD2の3D都市モデルが提供されている地域で、いくつかのテクスチャが貼られています。このうちのひとつを選びます。そして、用意しておいたテクスチャのうちのひとつをドラッグ&ドロップして、Shader Editorに配置します。

まずはこれを[Alt]+[Shift]キーを押してクリックし、直接Group Outputに接続して、テクスチャの様子を確認します。

図33-106 デフォルトのテクスチャのひとつを選んだところ
図33-107 使用するテクスチャをドラッグ&ドロップする
図33-108 Group Outputに接続して確認したところ

[4]テクスチャの大きさを調整する

拡大表示して、適当な1つのビルを対象に調整します。

まずは、テクスチャの大きさが適切ではないので調整します。テクスチャをクリックして、[Ctrl]+[T]を押します。すると、Mappingノードが追加されます。

追加されたら、スケールを調整します。そのためには、[Shift]+[A]キーを押してValueノードを追加して、MappingノードのScale入力に接続します。そしてValueを調整して、テクスチャの大きさを調整します。

図33-109 テクスチャを選択して[Ctrl]+[T]を押す
図33-110 Valueノードを追加する
図33-111 ValueノードをMappingノードのScale入力に接続する
図33-112 Valueを調整したところ

[5]元のテクスチャに光り具合だけをミックスする

現在のShaderの設定は、新しいテクスチャマッピングだけが適用されており、元々のテクスチャはまったく反映されていません。これを元のPLATEAUのテクスチャを活かしたまま光の具合だけを適用します。そのためには、テクスチャの出力を、元からあるPrincipled BSDFのColor入力に接続します。そして、Strength入力を「1」に設定します。すると、元のテクスチャを活かしたまま、光り具合だけを変えられます。

図33-113 ここまでの操作では、新しいテクスチャが直接出力されている
図33-114 元のShaderのColorに接続する
図33-115 Strengthを「1」にする

[6]光っている部分を削るための縞模様のマスクを作る

このままだと光っている面が多すぎるので、もう少し抑えます。いくつかの方法がありますが、ここでは白と黒の縞模様のマスクを用意して、黒いところは光らないようにマスキングして抑えることにします。

まずは[Shift]+[A]キーを押して、Checker Textureノードを追加します。Checker Textureノードは、縞模様のテクスチャを出力するノードです。いったん[Ctrl]+[Shift]を押しながらクリックして、これをGroup Outputに接続し、直接出力することで表示内容を確認します。

もう少し小さな縞模様にしたいので、Scale入力を変更します(ここでは「90」にしました)。また、白と黒にしたいのでColor1入力を白、Color2入力を黒に変更します。

図33-116 Checker Textureノードを追加する
図33-117 Check Textureノードをいったん直接出力する
図33-118 Scaleを変更し、Color1を白、Color2を黒に変更したところ

[7]テクスチャの出力と縞模様を掛け合わせる

[Shift]+[A]キーを押して、Mix Colorノードを追加します。追加したら、ModeをMultiplyに変更します。そして、入力Aには新しく設定したビル光のテクスチャの出力を、入力Bには縞模様を出力するChecker Textureノードの出力を、それぞれつなぎます。そしてFactor入力を「1」にすると、縞模様の黒の部分の色が削られます。その結果、窓全部は光らず、少し間隔が空いて光るような感じになります。

図33-119 Mix Colorノードを追加する
図33-120 Modeを[Multiply]に変更する
図33-121 テクスチャと縞模様を掛け合わせる
図33-122 Factorを1にすると縞模様の黒い部分の色が消える
図33-123 テクスチャを削る動作

[8]テクスチャを複雑にする

この縞模様を変更すると、よりリアルにできます。ここではノイズをかけていきます。

[Shift]+[A]キーを押して、Noise TextureノードおよびColor Rampノードをそれぞれ追加します。

Noise TextureノードのFac出力をColor RampノードのFac入力に入れ、Color RampノードのColor出力をColor TextureノードのColor1入力に入れます。これで縞模様のテクスチャの白い部分にノイズがかかるようになります。

次に、ノイズのかかり具合を調整します。Noise TextureノードのScaleを「40」などの大きな値にします。そしてColor RampをConstantに変更し、左右のスケールで閾値を調整します。

さらにノイズのかかり具合を変えたいので、Noise Textureノードをクリックして[Ctrl]+[T]キーを押します。すると、Mappingノードなどが追加されます。ここでMappingノードのScaleのYの値を変更することで、小さくします。

図33-124 Noise Textureノードを追加する
図33-125 Color Rampノードを追加する
図33-126 縞模様の白い部分にノイズがかかるようにする
図33-127 ノイズのScaleを大きくする
図33-128 ノイズのかかり具合を調整する
図33-129 Mappingノードなど一式を追加する
図33-130 ScaleのYを調整する

[9]レンダリングしながら調整する

テクスチャの出力をGroup Outputに接続し直し、Color Rampノードを調整して、光のかかり具合を調整します。

図33-131 Color Rampノードで光のかかり具合を調整する
コラム:もう1セット作って複雑にする

同様の方法で、ここまで作成してきたノード群を複製して、もう1セットのテクスチャも配置し、Color Mixでそれらを掛け合わせるように構成します。詳しい操作は、チュートリアル動画のテクスチャを複製して複雑にしている操作(03:05:48~)を参照してください。

図33-132 もうひとつのテクスチャも同様にして適用する

■ 屋根を調整する

ここまでの手順では、建物の屋根も窓があるかのように光ってしまっています。調整して、屋根は光らないようにします。

図33-133 屋根が光っている

【手順】屋根の光を消す

[1]Geometryノードを追加する

[Shift]+[A]キーを押して、Geometryノードを追加します。追加したら、確認のため[Ctrl]+[Shift]を押しながら、GeometryノードのNormal出力をクリックします。するとGroup Outputに直接つながり、動作を確認できます。

図33-134 Geometryノードを追加する
図33-135 Normal出力を出力したところ

[2]Separate XYZノードを追加する

同様に[Shift]+[A]キーを押してSeparate XYZノードを追加し、Normal出力の先につなぎます。Separate XYZノードは、ベクトルをX、Y、Z個別に分離するノードです。ここでは、上向きの面(Z方向)を分離して、発光しない面として指定するのに使用しています。

図33-136 Separate XYZノードを追加する。上向きの面が白になった

[3]反転する

これをChecker Textureで作った縞模様との合成と同じように、黒い部分で削るという仕組みを使えば、屋根の色だけを消せます。

そのためには、今は屋根が白なので、これを反転して屋根を黒にします。[Shift]+[A]キーを押してInvert Colorノードを追加して挟み込みます。これで白・黒が反転しました。

図33-137 Invert Colorノードを追加する

[4]縞模様のテクスチャと合成する

縞模様のテクスチャと、この屋根だけが黒くなった出力を合成します。[Shift]+[A]キーを押して、Mix Colorノードを追加し、片方に縞模様のテクスチャ、もう片方のこのInvert Colorノードからの出力を入れます。ModeをMultiply、Factorを1にすると、屋根の光が消えます。

図33-138 Mix Colorノードで合成する
図33-139 屋根の光が消えた

■ 他のテクスチャにも反映する

これで1つのテクスチャに対する光の加減の調整ができました。残りのテクスチャにも同様に適用します。

【手順】他のテクスチャにも反映する

[1]グループ化する

入力と出力の間にあるすべてのノードを選択して、[Ctrl]+[G]キーを押してグループ化します。

図33-140 グループ化する

[2]ひとつにまとめて名前を付ける

グループ化した状態で[Tab]キーを押すと、表示がひとつにまとまります。まとめたら、名前を付けます。ここでは、Night Textureとしました。

図33-141 Tabキーを押したところ
図33-142 名前を付ける

[3]他のテクスチャに適用する

このグループ化した設定をほかのテクスチャに反映します。

適用したい他のテクスチャをクリックして開きます。そして[Shift]+[A]キーを押してGroupを選択すると、手順[2]で名前を付けたグループがあるので、それを選択します。するとグループが追加されるので、ノードをつないで適用します。

この作業を必要なだけ繰り返します。

【メモ】

すべてに適用しなくてもそれらしくはなります。なお、お寺が含まれているエリアなどは暗めに設定しています。詳細は、チュートリアル動画の「夜景テクスチャの作り方(LOD2)のあたりの解説(02:53:27~)を参考にしてください。

図33-143 他のテクスチャに手順[2]のグループを追加する
図33-144 テクスチャに適用する

33.6 _ 浮遊するアニメーションシーンを作る

最後に、浮遊するアニメーションシーンの作り方を解説します。このシーンでは、多数の建物が浮遊していくのですが、それぞれキーフレームを打つのは現実的ではないため、ジオメトリノードの機能を使って、実現しています。

図33-145 建物が浮遊するアニメーションを作る

33.6.1 _浮遊させるビルを作る

まずは浮遊させるビルを作ります。京都駅付近のLOD2のモデルから選びました。まずは、このビルをバラバラにします。

図33-146 京都駅付近(LOD2モデル)

【手順】ビルごとにバラバラにする

[1]編集モードに入る

[Tab]キーを押して、編集モードに入ります。

[2]セパレートする

[A]キーを押して全選択し、[P]キーを押して[Separate]―[By Loose Parts]をクリックします。これでビルがひとつひとつに分かれます。

図33-147 By Loose Partsでセパレートする
図33-148 ビルがひとつひとつ分かれた

[3]原点を設定する

このあとジオメトリノードの機能を使って、ビルを浮遊させるのですが、そのとき原点を設定しておく必要があります。そこで、[A]キーを押して全選択した状態で、[Object]メニューから[Set Origin]―[Origin to Geometry]を選択します。

図33-149 原点を設定する

[4]浮遊させたいビルをコレクションにする

 レンダリングして外観を確認しながら、浮遊させると見栄えのするビルを選びます。[Shift]キーを押しながらクリックすると複数選択するので、その操作で複数選択します。選択したら、[M]キーを押して、[New Collection]を選択して、新しいコレクションとして構成します。

[Shift]キーを押しながらクリックして選択し、[M]キーを押して[New Collection]を選択

図33-150 浮遊させたいビルをコレクションとして構成する

[5]浮遊させるビルを原点にまとめる

浮遊させるビルを原点にまとめます。コレクション内のビルをすべて選択して、[Shift]+[S]キーを押し、[Selection to Cursor]を選択します。すると、原点(カーソルがある場所)に移動します。

図33-151 Selection to Cursorを選択する
図33-152 原点に移動した

[6]見栄え良くテクスチャを張り替える

ひとつひとつのビルの見栄えが良くなるよう、テクスチャを張り替えます。Cube Projectionで、窓の光があるテクスチャを貼っています。詳しくはチュートリアル動画の原点にまとめてからテクスチャを1つずつ貼っていく操作(03:21:27~)を参考にしてください。

図33-153 テクスチャを貼る

[7]1つのコレクションにまとめる

こうした作業を繰り返し、30個ぐらいのビルを原点にまとめて、ひとつのコレクションとして保存します。

図33-154 浮遊させたいビル群を原点にまとめてコレクションとして保存しておく

33.6.2 _ シーンに配置して浮遊する

次に、この用意したビル群を浮遊させていきます。浮遊するシーンは、京都駅周辺です。こちらのシーンは、あらかじめ別に用意しておくものとします。

図33-155 用意したシーン

【手順】ジオメトリノードでビルを浮遊させる

[1]キューブを作る

ジオメトリノードを設定するための適当なオブジェクトを作ります。このジオメトリ(幾何形状)は使わないのでオブジェクトの種類は何でもかまいませんが、ここではキューブにします。

[Shift]+[A]キーを押して、[Mesh]―[Cube]を選択してキューブを作ります。キューブを作ったら、コレクションにします。

図33-156 キューブを作りコレクションにする

[2]ジオメトリノードを作る

[Geometry Nodes]タブをクリックして、ジオメトリノードエディタを開きます。[New]をクリックして、ジオメトリノードを作ります。

図33-157 ジオメトリを作る

[3]Cubeノードを追加する

[Shift]+[A]キーを押してCubeノードを追加し、これを出力につなぎます。

図33-158 Cubeノードを追加する
図33-159 CubeノードをGroup Outputに接続する

[4]浮遊する範囲を指定する

以下の工程では、このCubeノードのなかに点を配置して、その点にビルを置くことで浮遊しているように見せます。つまり、Cubeノードの範囲が浮遊する範囲になります。そこでSizeを変更して、その浮遊範囲を調整します。ここでは50m四方にしました。

図33-160 Sizeを調整する

[5]ボリューム化する

[Shift]+[A]キーを押して、Mesh to Volumeノードを追加して挟み、これをボリュームに変換します。

図33-161 Mesh to Volumeノードを使って、ボリュームに変換する

[6]ボリューム内にポイントを拡散する

[Shift]+[A]キーを押し、Distribute Points in Volumeノードを追加して挟みます。すると、ボリュームのなかにポイントを拡散できます。

図33-162 Distribute Points in Volumeノードを追加する

[7]密度を下げる

このポイントにビルを配置していくのですが、密度が高いので、Densityの値を小さくして密度を低くします。

図33-163 密度を低くする

[8]ビルを追加する

ここにビルを追加していきます。[File]メニューから[Append]を選択して、先ほど作成しておいたビルのコレクションをこのプロジェクトに追加します。

そしてドラッグ&ドロップで、読み込んだコレクションをジオメトリノードエディタに追加します。

図33-164 ビルのコレクションを追加する

[9]ポイントにビルを配置する

[Shift]+[A]キーを押して、Instance on Pointsノードを追加して差し込みます。そして、手順[8]で読み込んだCollection InfoノードのInstancesとInstance on PointsノードのInstanceを接続します。このとき、Collection InfoノードのSeparate Childrenにチェックを付け、Instance on PointsノードでもPick Instanceにチェックを付けます。そうすることで、各ビルが1つずつポイントに割り当てられます。

図33-165 ポイントにビルを配置する

[10]サイズを調整する

サイズが大きいので、[Shift]+[A]キーを押してValueノードを追加し、Scale入力に接続して調整します。このとき密度が高いようであれば、Densityを再調整します。

図33-166 ScaleにValueを接続して調整したところ
図33-167 密度を再調整したところ
コラム:Separate ChildrenやPick Instanceにチェックを付けない場合

Separate ChildrenやPick Instanceにチェックを付けないと、ビルがまとめてポイントに配置されてしまいます。

図33-168 Separate ChildrenやPick Instanceにチェックを付けない場合

[11]上に動かす

このビル群を上に動かすアニメーションを追加します。そのために、Translate Instancesノードを追加して、挟みます。

図33-169 Translate Instancesノードを追加する

[12]ランダムに上昇させる

Combine XYZノードを作成し、Translate InstancesノードのTranslation入力に接続します。

このままZの値を増やせば上に動くのですが、すべてのビルが同じ速度で上昇します。そうではなく、速いビルもあれば遅いビルもあるようにしたいと思います。そのためには、ランダムな値を発生させるため、Random Valueノードを追加します。Minを0.1、Maxを1.0に設定します。

そしてキーフレームを打たなくてもアニメーションするようにするため、Scene Timeノードを追加します。Scene Timeノードは、シーンのフレーム位置を出力するノードです。これをZに接続することで、Zの値がフレーム位置の値になるので、上に移動するアニメーションになります。

この動きをランダムにしたいので、先ほどのRandom Valueノードの値を掛け合わせます。そのためにはMathノードを追加します。Mathノードを追加したら、Multiplyに変更してRandom ValueノードとScene Timeノードをかけ算するように構成します。

図33-170 Combine XYZノードを追加する
図33-171 Random Valueノードを追加する
図33-172 Scene Timeノードを追加する
図33-173 Scene TimeノードをZに接続してアニメーション実行すると、上に移動していくのがわかる
図33-174 Mathノードを追加する
図33-175 Random ValueとScene Timeをかけ算する

[13]回転させる

ビルを回転させます。そのためには、Rotate Instanceノードを作り、挟み込みます。ランダムな回転角にするため、Combine XYZノードとRandom Valueノードを作って接続します。

角度はラジアンで指定する必要があるため、間にToRadiansノードを挟みます。また、このときX軸に少し値を設定して、傾きも入れておきます。

【メモ】

別解として、Random ValueのMinを0、Maxを2πにして、ToRadiansノードを使わない方法もあります。

図33-176 Rotate Instanceノードを作り、挟み込む
図33-177 ランダムな角度にする
図33-178 ラジアン角に変換する

[14]シーンと合わせて調整する

以上で完成です。シーンと合わせて、アニメーションする範囲の大きさや密度を調整します。詳しい調整方法については、チュートリアル動画のシーンに合わせて調整していく操作(03:41:34~)を参考にしてください。

図33-179 シーンと合わせて調整する
図33-180 完成図

33.7 _ まとめ

このトピックでは、夜景の作り方を解説しました。主要な話題は、屋根の瓦を作ったり、大量のアニメーションを作ったりするときに使ったジオメトリノードです。頂点を操作するため少し複雑ですが、インスタンスをポイントに配置できるため、今回のような点の位置にオブジェクトを置いて動かすことができます。

また夜景を作る方法として、ビルの光る窓のテクスチャに張り替えるのはよくある手法です。しかし、そのまま張り替えると元の印象を損なうため、光の当たり具合だけを調整することでディテールを高められます。

TOPIC 32・33と続いた、この一連の解説からわかるように、PLATEAUのLOD3の都市モデルは詳細度が高く、リアルな街並みの3DCG画像を作れます。しかし細部をよく見ると、ディテールが足りないところがあるので、キットバッシュを使ったり、手作業で凹凸を付けたりすることで、リアル感を増やせます。よりリアルにするには、実写との比較が欠かせません。現地で撮影した写真やGoogleストリートビューを参考にして、細部を作り込んでみてください。

【文】

森 祐太朗(WOW inc.)
大澤文孝