MRが楽しい

MRやVRについて学習したことを書き残す

Blender2.8で頂点カラーをテクスチャにベイクする

本日は Blender2.8 の技術調査枠です。
Blender2.8で頂点カラーをテクスチャにベイクする手順についてです。
f:id:bluebirdofoz:20191017092557j:plain

頂点カラーを利用する3Dモデルの問題

以下のような頂点カラーで色付けされた3Dモデルのポリゴン数を削減するとします。
f:id:bluebirdofoz:20191017092609j:plain

そのまま[ポリゴン数削減モディファイア]を利用すると、頂点が減ってしまうため、同時に色情報が失われてしまいます。
以下は三角面数を 480 から凡そ半分の 240 まで削減したケースの結果です。見た目が大きく変わるのが分かります。
f:id:bluebirdofoz:20191017092620j:plain

こういった場合、頂点カラーをテクスチャとしてベイクすると見た目の情報を保ったままポリゴン削減することができます。

頂点カラーをテクスチャにベイクする

下準備として、マテリアル設定でレンダリング時に頂点カラーの情報が出力されるようにしておく必要があります。
以下の記事の「頂点カラーを表示する(レンダリング表示)」の手順を参考に、頂点カラーを出力するマテリアルを設定します。
f:id:bluebirdofoz:20191017092636j:plain

まずはベイク先のテクスチャを用意します。
3DモデルのUV展開を行い、[UVエディター]の[新規]ボタンからテクスチャを作成します。
f:id:bluebirdofoz:20191017092645j:plain

ここで出力するテクスチャの名前とサイズを指定します。
[名前][幅][高さ]を設定したら[OK]ボタンをクリックします。
f:id:bluebirdofoz:20191017092655j:plain

ベイク先のテクスチャが準備できたのでオブジェクトモードに戻り、ベイク対象のオブジェクトを選択します。
[レンダー]タブから[ベイク]パネルを開きます。[レンダーエンジン]に[Cycles]を選択します。
f:id:bluebirdofoz:20191017092704j:plain

[Cycles]だと[ベイク]パネルが表示されるので、これを開きます。
必要なのは頂点カラーの色情報のみなので[ベイクタイプ]に[ディフューズ]を選択します。
また照明に影響されない元の色情報が欲しいので[影響]は[カラー]のみを選択します。
f:id:bluebirdofoz:20191017092714j:plain

最後にベイク先の画像ファイルを指定します。
[シェーダーエディター]の画面を開きます。
f:id:bluebirdofoz:20191017092725j:plain

[シェーダーエディター]のメニューから[追加]->[テクスチャ]->[画像テクスチャ]を選択して追加します。
f:id:bluebirdofoz:20191017092736j:plain

追加された[画像テクスチャ]ノードのプルダウンを選択して、先ほど作成した画像を参照させます。
f:id:bluebirdofoz:20191017092746j:plain

これで画像を参照した[画像テクスチャ]ノードが作成できました。
この[画像テクスチャ]ノードを選択した状態で、[ベイク]ボタンをクリックしてベイクを実行します。
f:id:bluebirdofoz:20191017092757j:plain

ベイクの実行が完了すると、頂点カラーがテクスチャにベイクされます。
f:id:bluebirdofoz:20191017092806j:plain

[UVエディター]のメニューから[画像]->[名前を付けて保存]で作成したベイク画像を画像ファイルとして出力します。
f:id:bluebirdofoz:20191017092816j:plain

これで頂点カラーをテクスチャにベイクして出力することができました。

ベイク画像をテクスチャとして利用する

ベイク画像をテクスチャとして利用するため、再び新規マテリアルで設定を行います。
[画像テクスチャ]ノードを追加し、[開く]ボタンから先ほど出力した画像ファイルを指定して読み込みます。
f:id:bluebirdofoz:20191017092826j:plain

先ほどの画像を指定した[画像テクスチャ]ノードを[プリンシプルBSDF]ノードの[ベースカラー]に接続します。
これでテクスチャの色情報が入力されるようになります。
f:id:bluebirdofoz:20191017092835j:plain

この状態で[ポリゴン数削減モディファイア]を適用してみます。
同じく三角面数を 480 から 240 まで削減してみました。
色情報はテクスチャで保持されているため、見た目の色情報を維持したままポリゴンの削減を行えました。
f:id:bluebirdofoz:20191017092844j:plain

Blender2.8で頂点カラーを編集/表示する

本日は Blener2.8 の調査枠です。
Blender2.8で頂点カラーを編集/表示する方法について記事にします。
f:id:bluebirdofoz:20191016094102j:plain

頂点カラーとは3Dモデルの頂点に持たせるカラー情報のことです。
テクスチャと異なり、別途画像ファイルは必要ありませんが、頂点=色なので頂点が少ないと細かい色合いは設定できません。
今回はサンプルモデルとして[UV球]メッシュを利用します。
f:id:bluebirdofoz:20191016094142j:plain

頂点カラーを設定する

モデルの頂点カラーを編集するには[頂点ペイント]のモードを使用します。
対象モデルを選択した状態でモードのプルダウンを開き、[頂点ペイント]を選択します。
f:id:bluebirdofoz:20191016094151j:plain

[頂点ペイント]のモードに切り替えたら[3Dビュー]の右端にある[<]ボタンをクリックして[サイドバー]を表示します。
f:id:bluebirdofoz:20191016094203j:plain

[サイドバー]が開いたら[ツール]タブを開きます。
ここで頂点ペイントのブラシ設定を行うことができます。
[ブラシ]パネルからブラシの半径や強さを変更し、カラーピッカーで色を変更できます。
f:id:bluebirdofoz:20191016094211j:plain

ブラシの設定を行ったら、そのままメッシュの頂点を左クリックする事で着色が行えます。
頂点が色情報を持つので、頂点以外の場所に色を設定することはできません。
f:id:bluebirdofoz:20191016094243j:plain

着色が完了しました。
モードを[頂点ペイント]から[オブジェクトモード]に戻しておきます。
f:id:bluebirdofoz:20191016094258j:plain

頂点カラーを表示する(ソリッド表示)

設定した頂点カラーを[オブジェクトモード]で確認します。
最初に[ソリッド]表示での確認方法です。
まず[3Dビューのシェーディング]を[ソリッド]に変更します。
f:id:bluebirdofoz:20191016094323j:plain

[3Dビューのシェーディング]の横にあるプルダウンメニューを表示します。
[Color]項目の[頂点]を有効化すると、モデルの頂点カラーが表示されます。
f:id:bluebirdofoz:20191016094336j:plain

陰影のないそのままの色合いを確認したい場合は、更に[Lighting]の[フラット]を有効化します。
f:id:bluebirdofoz:20191016094346j:plain

頂点カラーを表示する(レンダリング表示)

次に[レンダー]表示での確認方法です。
まず[3Dビューのシェーディング]を[レンダー]に変更します。
f:id:bluebirdofoz:20191016094356j:plain

[レンダー]表示に切り替えただけでは頂点カラーの色合いは表示されません。
頂点カラーの色合いを表示するには、マテリアルで頂点カラー出力の設定を行う必要があります。
対象モデルを選択した状態で[マテリアル]タブを開き、[新規]ボタンをクリックします。
f:id:bluebirdofoz:20191016094406j:plain

デフォルトでは[プリンシプルBSDF]のマテリアルが生成されます。
[サーフェス]パネル内の[ベースカラー]の[〇]ボタンをクリックします。
表示された一覧から[属性]を選択します。
f:id:bluebirdofoz:20191016094416j:plain

入力する属性の名前を確認します。
対象モデルを選択した状態で[オブジェクトデータ]タブを開き、[頂点カラー]パネルを開きます。
モデルが頂点カラーを保持している場合は、その名前が一覧に表示されています。
デフォルトで作成される頂点カラーは[Col]の名称で登録されています。
f:id:bluebirdofoz:20191016094427j:plain

[マテリアル]タブに戻り、[ベースカラー]に追加された[名前:]欄に先ほどの名前を入力します。
すると、頂点カラーのカラー情報が[ベースカラー]として取り込まれて表示されました。
f:id:bluebirdofoz:20191016094438j:plain

NASAが公開した「CGI Moon Kit」を利用してBlender2.8で月のモデルを作る

本日は Blender2.8 の小ネタ枠です。
少し前の話ですが、NASAが月面の高解像度3Dデータ「CGI Moon Kit」を公開しました。
svs.gsfc.nasa.gov

今回はこのデータを利用してBlender2.8で月のモデルを作る手順を記事にします。
f:id:bluebirdofoz:20191015085855j:plain

画像データの取得

公開されている画像データは以下の2種類です。
Color:カラー用テクスチャ
Displacement:ディスプレイスメント用テクスチャ

それぞれ[Download]のプルダウンから解像度を選択して取得します。
今回、カラー用テクスチャは 2048x1024 の解像度のものをダウンロードしました。
f:id:bluebirdofoz:20191015085905j:plain

ディスプレイスメント用テクスチャは 1440x720 の解像度のものをダウンロードしました。
この2つのテクスチャは異なるレベルの解像度でも問題ありません。
f:id:bluebirdofoz:20191015085915j:plain

球体メッシュの作成

画像データを取得したら Blender2.8 を起動します。
最初に画像データを反映するための球体モデルを作成します。

デフォルトの[Cube]オブジェクトは不要なので左クリックで選択後、右クリックして[削除]します。
f:id:bluebirdofoz:20191015085924j:plain

メニューから[追加]->[メッシュ]->[UV球]を選択して[UV球]を追加します。
f:id:bluebirdofoz:20191015085935j:plain

[UV球]を追加したらモデルのメッシュの細かさを設定します。
左下に表示される[UV球を追加]パネルを開きます。
f:id:bluebirdofoz:20191015085945j:plain

ここで設定したメッシュの細かさが凹凸の解像度になります。
今回は[セグメント:360]、[リング:180]を設定しました。
頂点数が増えればPCへの負荷も大きくなるのでPCスペックに合わせて無理のない数値を設定して下さい。
f:id:bluebirdofoz:20191015085955j:plain

カラー用テクスチャの設定

カラー用テクスチャを反映します。
カラー用テクスチャはその名の通り、モデルの色情報を設定するための画像です。

[ソリッド]表示ではレンダリング結果が表示されないので、まずは[3Dビューのシェーディング]を[レンダー]表示に切り替えます。
変化が分かりやすいようにカメラの位置も調整しておきます。
f:id:bluebirdofoz:20191015090005j:plain

カラー用テクスチャはマテリアルで設定します。
[Sphere]オブジェクトを選択した状態で[マテリアル]タブを開き、[新規]ボタンをクリックします。
f:id:bluebirdofoz:20191015090014j:plain

マテリアルが作成されます。
任意の名前を設定し、[ベースカラー]の[〇]ボタンをクリックします。
するとプルダウンが表示されるので[画像テクスチャ]を選択します。
f:id:bluebirdofoz:20191015090028j:plain

[ベースカラー]に[画像テクスチャ]が設定されるので[開く]ボタンをクリックします。
f:id:bluebirdofoz:20191015090037j:plain

ファイルの選択画面が開きます。
先ほどダウンロードしたカラー用テクスチャを選択して[画像を開く]ボタンをクリックします。
f:id:bluebirdofoz:20191015090050j:plain

これで球体にカラー用テクスチャが設定され、月の色が表示されます。
f:id:bluebirdofoz:20191015090102j:plain

ディスプレイスメント用テクスチャの設定

次にディスプレイスメント用テクスチャを反映します。
ディスプレイスメント用テクスチャはモデルの凹凸情報を設定するための画像です。

ディスプレイスメント用テクスチャを利用して凹凸を設定するにはディスプレイスモディファイアを利用します。
[Sphere]オブジェクトを選択した状態で[モディファイア]タブを開きます。
f:id:bluebirdofoz:20191015090114j:plain

[モディファイアを追加]をクリックしてプルダウンを開きます。
[変形]欄にある[ディスプレイス]を選択します。
f:id:bluebirdofoz:20191015090125j:plain

これで球体にディスプレイスモディファイアが設定されました。
凹凸情報としてディスプレイスメント用テクスチャを設定します。
[テクスチャ]の[新規]ボタンをクリックします。
f:id:bluebirdofoz:20191015090134j:plain

テクスチャのデータが作成されます。
画像を設定するため、右端の[テクスチャタブの表示]ボタンをクリックします。
f:id:bluebirdofoz:20191015090151j:plain

[テクスチャ]タブが開きます。
[画像]パネルから[開く]ボタンをクリックします。
f:id:bluebirdofoz:20191015090208j:plain

ファイルの選択画面が開きます。
ダウンロードしたディスプレイスメント用テクスチャを選択して[画像を開く]ボタンをクリックします。
f:id:bluebirdofoz:20191015090218j:plain

画像の凹凸情報に従って、球体が変形します。
f:id:bluebirdofoz:20191015090229j:plain

このままだと変形の凹凸が大き過ぎるので、変形の度合いを調整します。
再び[モディファイア]タブを開き、ディスプレイスモディファイアの[強さ]の設定値を低くします。
凹凸の大きさとしては正確ではありませんが、分かりやすいように[0.2]に設定しました。
f:id:bluebirdofoz:20191015090239j:plain

これでディスプレイスメント用テクスチャの設定は完了です。
最後に変形を滑らかにするため、スムースシェードを掛けてみます。
球体左クリックで選択後、右クリックして[スムースシェード]を実行します。
f:id:bluebirdofoz:20191015090249j:plain

凹凸が滑らかになりました。
これで月の3Dモデルを作ることができました。
f:id:bluebirdofoz:20191015090300j:plain

凹凸を弱めにしてライトを設定してレンダリングしてみました。
上手く撮影すればこんな感じの月の写真が作れます。
f:id:bluebirdofoz:20191015090309j:plain

Blender2.8で海洋モディファイアを使って海を作る

本日は Blender2.8 の技術調査枠です。
Blender2.8で海洋モディファイアを使って海を作る手順を記事にします。
f:id:bluebirdofoz:20191014224608j:plain

シーンを作成する

最初に環境テクスチャを設定して海を作る風景を作成します。
HDRI HEVEN から取得したテクスチャを環境テクスチャとして利用します。
詳細な手順は以下の記事を参照ください。
bluebirdofoz.hatenablog.com

テクスチャは好みのテクスチャを利用して大丈夫です。
サンプルとして以下のようなシーンを作成しました。
f:id:bluebirdofoz:20191014224630j:plain

海洋モディファイアを設定する

ではモデルに海洋モディファイアを反映します。
最初に[3Dビューのシェーディング]を[レンダー]表示にしておきます。
[Cube]オブジェクトを選択した状態で[モディファイア]タブを開きます。
f:id:bluebirdofoz:20191014224643j:plain

[モディファイアを追加]のプルダウンを開きます。
[シミュレート]の一覧から[海洋]を選択します。
f:id:bluebirdofoz:20191014224653j:plain

[Cube]オブジェクトに海洋モディファイアが設定され、形が変形しました。
f:id:bluebirdofoz:20191014224704j:plain

マテリアルを設定する

先に見た目を海らしくするため、マテリアルの設定を行います。
[Cube]オブジェクトを選択した状態で[マテリアル]タブを開きます。
まずは[ベースカラー]をクリックして色を水色に変更します。
f:id:bluebirdofoz:20191014224713j:plain

その他、パラメータを以下の通り変更して水面の質感設定は完了です。
[粗さ]:0.1([0.0]に近づける程、水面の反射が鏡面反射になり水らしくなります)
[IOR]:1.1([1.0]に近づける程、屈折が少なくなり海底がはっきりと見えます)
[伝播]:1.0([1.0]に近づける程、水面の透明度が上がります)
f:id:bluebirdofoz:20191014224724j:plain

水面の解像度や波の高さを変える

次に水面の解像度や波の高さを変えます。
[モディファイア]タブに戻ります。
f:id:bluebirdofoz:20191014224735j:plain

[解像度]を変更することで波の細かさを変更することができます。
例えば[解像度:7]の状態だと、三角面数は4,000ですが、[解像度:15]とすると三角面数は101,000になりました。
より細かな波の表現になったことが分かります。
f:id:bluebirdofoz:20191014224746j:plain

[波立ち]をあげると、よりシャープな波が発生するようになります。
[5.0]に変更してみると、より激しい波が発生しているような見た目になりました。
f:id:bluebirdofoz:20191014224757j:plain

波をアニメーションする

最後に作成した海をアニメーションさせてみます。
海洋モディファイアは[時間]の値を加算する事で時間軸を追うように変形します。
[タイムライン]エディターで[1]フレーム目が選択状態であることを確認します。
[時間:1.0]項目の上で右クリックします。
f:id:bluebirdofoz:20191014224808j:plain

表示されたメニューから[キーフレームを挿入]を実行します。
f:id:bluebirdofoz:20191014224819j:plain

これで[1]フレーム目に[時間:1.0]のキーが打ち込まれました。
次に終了フレームの[250]フレーム目にタイムラインを移動します。
[時間]項目を[時間:10]に設定し、再び右クリックします。
f:id:bluebirdofoz:20191014224829j:plain

表示されたメニューから[キーフレームを挿入]を実行します。
f:id:bluebirdofoz:20191014224840j:plain

これでアニメーションの設定ができました。
タイムラインを[1]フレーム目に戻し、[再生]ボタンをクリックするとアニメーションが開始します。
f:id:bluebirdofoz:20191014224852j:plain

参考ページ

今回の記事は以下の動画を参考に作成しました。
www.youtube.com

batファイルを介してドラッグ操作でBlenderのPythonスクリプトを起動する

本日は小ネタ枠です。
以前紹介したBlenderPythonスクリプトをファイルドラッグで起動する方法を記事にします。
f:id:bluebirdofoz:20191013112053j:plain

サンプルスクリプト

以下の記事で作成した ifc ファイルの画像を出力するサンプルスクリプトで試します。
bluebirdofoz.hatenablog.com

スクリプト内で直接記述していた読み込みファイルのパスを引数から受け取るよう修正します。
Python での引数の取得は、以下の記述で可能です。

# sysインポート
import sys
# sys.argvから引数を取得
args=sys.argv

以下の通りスクリプトを修正しました。
・3DRender_args.py

# 不要なシステムパスの削除
import sys, os
pythonexedir=os.path.dirname(sys.executable)
del sys.path[5:]
sys.path.append(pythonexedir + '\\lib\\site-packages')
sys.path.append(pythonexedir + '\\lib\\site-packages\\blender')

# 変換対象のファイルパスを取得
args=sys.argv
# 2つ目の引数が追加のファイルパス
importfilepath=args[1]

# bpy インポート
import bpy

# ユーザ設定での IfcBlender アドオンの有効化
bpy.ops.preferences.addon_enable(module='io_import_scene_ifc')

# デフォルトの Cube を削除
bpy.data.objects.remove(bpy.data.objects['Cube'])

# ifcファイルの読み込み
bpy.ops.import_scene.ifc(filepath=importfilepath)

# ifcファイルの大きさ調整
for item in bpy.data.objects:
  # 全メッシュオブジェクトを対象に処理を行う
  if item.type == 'MESH':
    # 大きさを15倍に設定する
    item.scale[0] = 15.0
    item.scale[1] = 15.0
    item.scale[2] = 15.0

# レンダリングの実行と画像ファイルの出力
bpy.context.scene.render.engine = 'CYCLES'
bpy.context.scene.render.resolution_percentage = 50
bpy.ops.render.render()
bpy.data.images['Render Result'].save_render(filepath='.\image.png')

batファイルの引数取得

Python スクリプトに引数を渡して起動するため、bat ファイルを作成します。
以下の bat ファイルを作成しました。
・3DRender.bat

%~dp0\(Blender組み込みPythonの相対パス)\python.exe %~dp0\3DRender_args.py %1

ドラッグした元ファイルのディレクトリが実行ディレクトリとなるため、特殊記号を使って bat ファイルのパスを取得しています。

%~dp:batファイルのカレントディレクトリ
%1:2つ目の引数(ドラッグファイルのパス)

実行結果

作成した bat ファイルに編集処理をかけたい ifc ファイルをドラッグします。
f:id:bluebirdofoz:20191013112111j:plain

読み込まれた ifc ファイルのレンダリング結果の画像が出力されました。成功です。
f:id:bluebirdofoz:20191013112120j:plain

Blender2.79のpythonスクリプトで3Dモデルのオブジェクトとマテリアルの結合を自動化する

本日は Blender2.79 の技術調査枠です。
Blender2.79 の Python スクリプトで3Dモデルのオブジェクトとマテリアルの結合を自動化します。
f:id:bluebirdofoz:20191012033139j:plain

サンプルモデル

以下のような3つのオブジェクトとそれぞれに同様の3つのマテリアル設定を持つモデルをサンプルとして用意しました。
f:id:bluebirdofoz:20191012033151j:plain
f:id:bluebirdofoz:20191012033200j:plain
f:id:bluebirdofoz:20191012033210j:plain

利用スクリプト

以下のオブジェクトの結合と、類似マテリアルの結合を行うスクリプトを用意しました。
マテリアルの類似判定は[Blenderレンダラー]における[マテリアル]タブ内の設定のみ考慮します。
・ModelMerge.py

実行結果

プロジェクトにスクリプトを読み込み、[スクリプト実行]を行います。
f:id:bluebirdofoz:20191012033230j:plain

処理が完了すると、以下のようにオブジェクトが1つに結合されます。
かつ、類似マテリアルも結合されて必要最低限のマテリアル数になっています。
f:id:bluebirdofoz:20191012033239j:plain

Blender2.8への移植

スクリプトはマテリアルの判定が[Blenderレンダラー]に依存しているため、Blender2.8への移植はできません。
Blender2.8用スクリプトにまとめた上で公開予定でしたが、本スクリプトは移植が厳しいため、Blender2.79向けのまま記事にしました。

TEXTURE HEVENを利用してBlender2.8で床や壁の綺麗な質感を作る その6(テクスチャのマッピング)

本日は Blender2.8 の練習枠です。
Blender2.8とTEXTURE HEVENを利用して床や壁の綺麗な質感を作るについて記事にします。
今回は[マッピング]ノードを利用してテクスチャの見た目を細かくしてみます。
f:id:bluebirdofoz:20191011094303j:plain

ノードの追加と接続

[マッピング]ノードを追加します。これはテクスチャマッピングの設定値を変更するノードです。
[シェーダーエディター]のヘッダーメニューから[追加]->[ベクトル]->[マッピング]を選択します。
f:id:bluebirdofoz:20191011094314j:plain

[画像テクスチャ]ノードが追加されたら[ベクトル]から線を伸ばし、全ての[画像テクスチャ]ノードの[ベクトル]に繋げます。
f:id:bluebirdofoz:20191011094328j:plain

次に[テクスチャ座標]ノードを追加します。これはテクスチャマッピングの種類を変更するノードです。
[シェーダーエディター]のヘッダーメニューから[追加]->[入力]->[テクスチャ座標]を選択します。
f:id:bluebirdofoz:20191011094356j:plain

[テクスチャ座標]ノードが追加されたら[UV]から線を伸ばし、[マッピング]ノードの[ベクトル]に繋げます。
f:id:bluebirdofoz:20191011094338j:plain

これでノードの追加と接続は完了です。

マッピングの変更

[マッピング]ノードの設定値を変更して、テクスチャマッピングを変えてみます。
例えば[拡大縮小]の値を大きくすると、テクスチャが繰り返し配置されるため、見た目や解像度が細かく高くなります。
f:id:bluebirdofoz:20191011094412j:plain

その他、[位置]を変更するとテクスチャの位置をズラしたり、[回転]を変更するとテクスチャを回転することができます。
f:id:bluebirdofoz:20191011094421j:plain