機能紹介

機能紹介 VRMのバージョン(0.x/1.0)と変換について (2024/03/01)

前回のVRMモデルのセットアップの解説内では省略しましたが、今回はVRM 0.x/1.0のバージョンの違いと変換を含めた運用について説明します。

2018年に最初に発表されたVRM規格(「VRM 0.x」と呼ばれるもの)は、その後色々と見直しが行われながら、最終的に2022年に「VRM 1.0」として正式な規格になりました。ファイルの拡張子は「.vrm」のままですが、内部のデータ構造も大きく変化して互換性が失われた別物になっているため、VRM 0.xにしか対応していない古いアプリ・サービスではVRM 1.0のデータを読み書きすることができず、本記事執筆時点(2024年3月)でもVRM 1.0に対応したものはまだそれほど多くないようです。

VRM 0.x/1.0間では細かな差異まで含めると多数に登りますが、Metasequoia 4上で編集するにあたって注意が必要となる違いとして以下が挙げられます。

  • 前方向の定義
  • ばねボーンの構造
  • メタ情報

前方向の定義

VRM 1.0では同じく手前側(+Z軸方向)が前と定義されていますが、VRM 0.xでは奥側(-Z軸方向)が前と逆になっています。

手前側を前としてモデリングする人のほうが多数派と思いますが、その逆だと扱いづらいだけでなく、glTF標準の定義でも手前側が前のため、VRM 0.xはglTFをベースとしながら標準に反する問題のあるものでしたが、それが是正された形となっています。

VRM 0.xファイルの読み書き時に前方向を反転させることもできます。VRM 0.xモデルが前を向いている場合、出力時には必ず反転させてください。

VRMファイルを読み込む以外の方法で用意したVRM 0.x用モデルが既に前向きになっている場合、[視線情報]内にある[前方向反転済み]をオンにしてください。これをしないと、VRMプレイヤー内で正しい姿勢でアニメーション再生されません。

ばねボーンの構造

VRM 1.0では親子間で一続きにつながっているばねボーンを一つのグループとして扱います。グループ内の個々のばねボーンに対してパラメータを設定できます。

6つのグループにそれぞればねボーンが4つずつつながっている

VRM 0.xではグループごとに、(つながりの有無に関わらず)複数のばねボーンをまとめて管理していました。ばねボーンごとに、指定したボーンから末端のボーンまで(分岐を含む)をばね制御の対象とします。グループ内の各ばねボーンには共通のパラメータが適用されます。

同じグループ内に6つのばねボーンがある

VRM 1.0のほうが自由度は高いのですが、VRM 0.xのほうが簡便に設定できるため、好き嫌いがあるかもしれませんね。

メタ情報

著作権や各許諾などの情報を含むメタ情報は、VRM 0.x/1.0で共通になっている項目がある一方で、1.0では「政治・宗教用途の利用」や「反社会的・憎悪表現」などいくつか追加されています。また、0.xでは「商用利用」はOKかNGだけだったのが、1.0では個人のみ商用利用可(法人不可)も選択できるなど、より実用性の高い設定ができるようになっています。

0.xと1.0どちらを使うべき?

目的のアプリ・サービスが既にVRM 1.0に対応しているなら1.0用にデータを作成すればいいでしょう。しかし、まだ0.xにしか対応していないものへ持っていく可能性があるなら、0.xで作成すべきです。後で0.xから1.0へ変換することもできます。

VRM 0.xから1.0へのデータ移行

既にVRM 0.x向けに作成しているデータをVRM 1.0へ移行するには、以下の手順で操作してください。

  1. 「前方向を反転」をオンにしてVRMファイルを読み込みます。
    VRM形式ではなくmqozで保存している場合、いったんVRMファイルに出力してから、そのファイルを再度読み込んでください。
  2. 読み込み後、モデルが手前側を向いていることを確認してから、[VRM 1.0へ変換]を呼び出してください。[ボーン設定モード]が「VRM 1.0」に切り替わり、またばねボーンがVRM 1.0向けの構造に変換されます。
  3. メタ情報はVRM 0.x/1.0で共通の項目のみ引き継がれますが、それ以外の項目は設定し直す必要があります。必ずメタ情報の内容を確認し、適切に設定してください。

これでVRM 1.0への変換は完了です。VRMファイルを出力すると、VRM 1.0に対応したものが出来上がります。

表情モーフのうち「surprised」(驚き)に限ってはVRM 1.0のみに存在します。表情モーフ自体が必須ではないのですが、VRMデータを持っていく先のサービス等でsurprisedの表情を使用する場合は、[モーフ]コマンド内でプリセットを追加してください。

VRM 0.x/1.0両方の出力に対応した共通モデルを用意したい

複数のアプリ・サービスで同じVRMモデルを利用する際に、既に1.0に対応しているものとまだなものがあって、VRMのバージョンを分けて出力しないといけない場合に、出力元のデータを1.0と0.xで別々に管理するのは煩雑なので、できることなら共通化したいものです。

この場合、VRM 0.xを基本としつつも、下記項目を押さえておくことで同じデータからVRM 0.x/1.0の両方の出力を行うことができます。

  • 常に[ボーン編集モード]はVRM 0.xにして、ばねボーンなどを編集すること。
    うっかりVRM 1.0でばねボーンを追加してしまった場合は戻せないので消す。
  • 手前側を前にする。(VRM 0.xと逆、VRM 1.0と同じ)
    • 既に奥を向いているなら、「前方向を反転」をオンにしてVRMファイルを読み直す。
    • 前を向いている状態で、[視線情報]内にある[前方向反転済み]をオンにする。(VRM 0.xファイルを反転読み込みした場合は既にオンになっているはず)
  • メタ情報の編集時のみ[ボーン編集モード]をVRM 0.xと1.0で切り替えながら、それぞれ編集する。(共通しない項目の両方を保持することができる)

この状態でmqozを保存しておけば、いつでもVRM 0.x/1.0どちらにも出力が可能です。出力前に[VRMを検証]を呼び出して、問題がないことも確認しておきましょう。

表情モーフsurprisedについても、VRM 0.x向けの段階で用意して構いません。標準以外の表情モーフが含まれることは問題ありません。

VRM 0.xで出力する場合

[ボーン編集モード]をVRM 0.xにしてVRMファイルを出力しますが、その際に必ず「前方向を反転」をオンにしてください。

VRM 1.0で出力する場合

[VRM 1.0へ変換]してからVRMファイルを出力します。出力後にmqozファイルを上書き保存してしまうと戻せないので注意してください。

 

機能紹介 VRMモデルのセットアップの基礎 (2024/02/29)

本記事ではVer4.8.6で数回に渡るマイナーアップデートにより強化されたVRM編集機能について解説します。

VRMはVR/メタバースなどで使用されることを想定した3Dキャラクター・アバター用のファイル形式です。glTFをベースに、キャラクターに特化した属性を持たせられるよう、主に下記の情報を付加する形で拡張が行われています。

  • アニメ調表現を行うMToonシェーダ
  • 標準的な人体のボーン構造(ヒューマノイド)
  • ばねボーン
  • 視線の制御
  • 1人称/3人称視点における可視設定
  • 著作権や利用用途・配布の許諾などを含むメタ情報

VRMファイルそのものの詳細ついてはVRMコンソーシアムvrm.dev技術仕様などをご参照ください。

VRMモデルのセットアップ作業の大半は[ボーン]コマンド内で行います。以下の説明は[ボーン]や[モーフ]コマンドの基本操作を理解していることを前提としています。一般的なボーン・モーフのセットアップ方法についてはヘルプ内のチュートリアルなどを参照してください。また、全体的な流れをつかむのが目的で、詳細な操作方法の説明までは踏み込んでおりませんので、実際に操作しながら確認したり、またヘルプも併せてご覧下さい。

MToonシェーダの設定

VRMでは材質のシェーダには以下が利用可能です。

  • Constant(陰影のない単色)
  • glTF(物理ベース)
  • MToon(アニメ調)

このうち、MToonシェーダがVRMモデルには最も一般的に扱われています。MToonシェーダを適用するには、[材質設定]の[シェーダ]欄から「VRM1.0 MToon」を選択してください。(VRM 0.xを使用する場合もこちらを指定)

MToonシェーダの特徴として、陰影・リムライト・輪郭線が挙げられます。

陰影はアニメ調表現において最も核となる要素で、光の当たる箇所と当たらない箇所をはっきりと分けて、明暗を強調する表現を行います。陰影の色や位置(シフト)、幅の調整が可能です。

左:デフォルト、中:陰影シフトを下げる、右:陰影幅を上げる

リムライトは後方から光が当たったようにオブジェクトの端付近が明るくなり、輪郭を際立たせることができます。

左:リムライトなし、右:リムライトあり

輪郭線はオブジェクトの境界の外側にオブジェクトと異なる色の領域を設けることによって、オブジェクトと背景や、オブジェクトの重なる箇所を明確に分ける効果が得られます。

左:輪郭線なし、右:輪郭線あり

VRMモデル用ボーンのセットアップ

ボーンを一からセットアップする場合と、VRM以外の用途に既に作成したボーンセットアップ済みモデルをVRM向けに改変する場合でそれぞれ説明します。

一からのセットアップ

VRMモデル用のボーンも、(VRM以外の)一般的なキャラクターモデルと同様に、おおまかには以下の手順でセットアップ行います。

  1. スキン用のオブジェクトを作成する
  2. オブジェクトに合うようにボーンを作成する
  3. [スキン設定]を行う
  4. [スキニング > ペイント]でウェイトを調整する

一般モデルと異なるのは、2でのボーンの作成時に[リギング > ボーン > 追加]コマンドで一から作成する代わりに、VRM用のテンプレートを用います。

[テンプレート]>[標準テンプレート]から「VRMヒューマノイド」を選択すると、VRMモデル用の標準構造を持ったボーンが生成されます。

生成後は、各ボーンをスキン用のオブジェクトに合うよう位置を調整します。スキン用オブジェクトは肩から両腕を横に伸ばした、いわゆる「Tポーズ」が基本となります。

標準構造で定義されていない、例えば髪や衣服、尻尾などのボーンが必要な場合は、さらに[リギング > ボーン > 追加]でボーンを追加します。

また、テンプレートの適用と同時に[ボーン設定モード]がVRM用に切り替わりますが、(既にVRM 0.xが指定されていない限り)VRMのバージョンは1.0となります。必要に応じて[表示設定]内の[ボーン設定モード]でVRM 0.x/1.0を切り替えてください。(VRMバージョンによる違いについては別記事を参照

既存のボーンセットアップ済みモデルをVRM向けにする

ウェイト調整済みのボーン付きモデルをVRM向けに改変したい場合、各材質にMToonなどのVRM向けシェーダを適用した上で、まず[ヒューマノイド]を設定します。

モデルを読み込んだ状態で、上でも説明したように[ボーン設定モード]を「VRM 0.x」または「VRM 1.0」に切り替えてください。

この状態で[ボーン設定]を呼び出すと、[基本情報]内に[ヒューマノイド]の設定項目が付加されているので、どのボーンが腰・頭・手・足などのどの部位に当たるかを一つずつ設定します。どの部位のボーンが必須かはVRM仕様書に記載されています。

ヒューマノイドの設定が一通り終わったら[VRM 0.x]または[VRM]タブ内から[VRMを検証]を呼び出し、ヒューマノイドの設定に不備がないかを必ず確認してください。(ヒューマノイド以外のチェック項目はこの時点では気にしなくて構いません)

ばねボーン・衝突体の設定

ボーンとヒューマノイドの設定を終えたら、ばねボーンのセットアップを行います。ヒューマノイドで設定されたボーンが動いたときに、形を変えながら追従して動くような「揺れ」を表現するためにばねボーンは用いられ、長い髪や衣服などに適用すると有用です。

紫色の球体がばねボーン、オレンジ色の球体が衝突体を示す。ばねボーンの表示はVRM 0.x/1.0で異なる。

髪や衣服にも追加のボーンをセットアップしている状態で、以下の手順で既存のボーンに重ねるようにばねボーンを作成します。

  1. [ばね]内の[新規作成]をオン
  2. 3Dビューやボーンリスト内でボーンを選択
  3. [ばねボーン作成]ボタンを押す

ばねボーンの作成後、[VRMプレイヤー]内で揺れ具合を調整します。

VRMプレイヤー内でばねボーンを選択し、各パラメータを変更しながら、モデルをドラッグで動かして、実際にどう揺れるかを確認してください。

ばねボーンを設定しただけの状態では、ばねボーンを設定した箇所が体内にめり込んでしまうので、合わせて衝突体(コライダー)の設定も行います。頭や胴体、腕、足などめり込む可能性のある箇所に球体またはカプセル型(VRM 1.0のみ)の衝突体を配置すると、ばねボーンがその内部には入り込まずに避けてくれる動きになります。

髪の毛用のばねボーンに対して、頭・腕・胴体に衝突体が設定されている

表情モーフの設定

表情モーフはVRMに必須の項目ではありませんが、特にフェイシャルトラッキングを用いたアバター配信には欠かせない要素です。VRMでは以下の表情が定義されています。(VRM 0.x/1.0で若干違いあり、詳細は技術仕様を参照)

  • 感情(喜・怒・哀・楽・驚)
  • リップシンク(あ・い・う・え・お)
  • 瞬き(両目・左目・右目)
  • 視点(上・下・左・右)

これらの表情は、顔のオブジェクトを複製して頂点の位置のみを動かしたものを対象オブジェクトとして複数用意した、頂点モーフのプリセットとして設定します。

各表情は頂点を動かしただけで元は同じオブジェクト

表情モーフは[モーフ]コマンド内で設定します。[ターゲット設定]でモーフの対象オブジェクトを指定するのと併せて、[設定モード]にVRM 1.0またはVRM 0.xを指定すると、プリセットの選択項目が表示されます。

プリセット選択欄の横にVRM 0.x/1.0用プリセット追加の項目があり、必要なプリセットを一括して追加することができます。

追加されたプリセットごとに対象オブジェクトのスライダーを調整して、どのモーフを適用するかを指定します。スライダーの値を変更した後は必ず[登録]してください。

プリセット「a」にA用の対象オブジェクトを100%適用した例

プリセットごとに対象オブジェクトを1つずつ用意するのが基本ですが、1つのプリセットに複数の対象オブジェクトを組み合わせることも可能です。

その他の設定

メタ情報のうち、モデル名と作者名は必須です。配布や用途に応じた許諾、サムネイル等も併せて設定しましょう。

視線情報と可視設定は通常は初期設定のままで構いませんが、配信システムやメタバース用ソフトなどで使用されるものがあります。必要に応じて設定してください。

VRMファイルへ出力

ファイルを出力する前に、ヒューマノイドの設定でも説明した[VRMを検証]を呼び出します。問題が残ったまま出力すると、受け側ソフトで読めないことがあるので、修正が必要です。「オプション」と記載されている項目はそのままでも構いません。

問題がないことが確認できたら、[名前を付けて保存]でVRM形式を指定して保存します。

最後に

駆け足ぎみに一通り説明しましたが、単に記事を読んだだけで理解するのは難しいので、併せて既存のVRMモデルを眺めることをお勧めします。VRMモデルはVRoid Studioを使って自身で作成したり、VRoid Hubニコニ立体などのサイトでダウンロード可能な既存のモデル(※著作権や利用許諾に注意すること)が配布されていますので、ばねボーンやモーフなどの構造がどうなっているかを確認しながら理解を進めていましょう。

新着情報 物理ベースレンダリング(6) 光沢・反射光・非照明 (2022/05/27)

複数回にわたって紹介してきたglTFにおける物理ベースレンダリングですが、今回で最後となります。残りの拡張設定「光沢」「反射光」「非照明」を取り上げます。

光沢 (Sheen)

光沢は特にサテンのような艶のある生地を表現するのに有用です。

光沢がどのように影響するか、球体にライトを当てるとわかりやすいです。

左:光沢なし、右:光沢あり

上図の左右を比べると光沢の有無の違いは一目瞭然ですが、詳しく観察すると、光沢ありの場合はライトからの入射角が浅くなる箇所がリング状に明るくなっています。中心付近の反射光が入射角の深い箇所に影響するのと逆の関係であることがわかります。

光沢用のパラメータは「光沢係数」「光沢粗さ」の2つです。係数は光沢の強さを、粗さは光の反射をどれだけぼかすかを調整します。

左:光沢粗さ0.6、右:光沢粗さ0.2

なお、光沢の表示に関して不具合があったため、Ver4.8.3bで修正しています。それ以前のバージョンの方は必ずアップデートしてご利用ください。

反射光 (Specular)

反射光(スペキュラー)はPhongシェーダのものと同様です。glTFシェーダでは金属感・粗さで光源に対するハイライトがどのように写るか調整しますが、Phongに比べて直接的に調整しにくいと感じることがあります。

そこで拡張設定として「反射光」が追加され、反射光の調整用に「反射係数」と「反射色」の2つのパラメータが用意されています。

左:反射色を赤、真ん中:反射光の拡張設定オフ、右:反射係数0.3

元の状態(真ん中)に対して、色と係数を調整したものがそれぞれ左と右の状態です。反射光の色と強さを直接指定して質感を調整することができます。

非照明 (Unlit)

こちらは物理ベースレンダリング用のものではありませんが、glTFシェーダの拡張設定に用意されているので、ついでに紹介します。

従来からConstantシェーダがありましたが、それと同じ役割を持ちます。ライティングによる計算を一切行わず、単色でそのまま表示するものです。

左:通常のglTFシェーダ、右:非照明

敢えてライティングしたくないオブジェクトに対して指定してください。

最後に

glTFにおける物理ベースレンダリングを全6回で紹介してきました。各拡張設定とそのパラメータをざっと説明しましたが、サンプルもそれほど多くは用意できなかったので、この解説だけではまだそれほどわからないという方もいらっしゃるかもしれません。まずは実際にMetasequoia 4で操作して、パラメータを色々変えながら試してみてください。

glTFとその新しい拡張設定に対応したアプリなら、アプリ間で(ほぼ)同じ見た目を維持しながらデータを運搬することもできます。今後より多くのアプリ・サービスでglTFが利用され、glTFのデータも増えていくことと思いますが、その一助になれば幸いです。

機能紹介 物理ベースレンダリング(5) クリア塗装 (2022/05/12)

glTFにおける物理ベースレンダリングについて、今回は[クリア塗装]拡張設定について紹介します。

クリア塗装 (Clearcoat)

クリア塗装の使用例として代表的なものとしては車のボディがあげられます。ボディそのものは金属やカーボンなどの素材の表面にペンキなどで色付けされていますが、それだけではあまり艶のある質感にはなりません。さらにその上に無色透明の塗装を施されています。これは艶を出す目的のほかに、表面を保護する役割も果たします。

ボディの素材・色にかかわらず、クリア塗装によって周囲が反射して写り込む

glTFの[クリア塗装]はその無色透明の塗装に相当します。下のボディの層に対し、クリア塗装の層による反射が加わった2層構造の質感を簡単に表現できるようになっています。

2層構造であるため、下のボディ層とクリア塗装は異なる別々の法線を持つことができます。

通常の[法線]マップとは別にクリア塗装専用の[クリア塗装法線]マップが用意されているので、どちらか片方または両方に法線マップ画像を割り当てることで、下の層とは異なる方向に反射した先の背景が写り込むようになります。

左右とも金属感0.5、粗さ0.3、法線マップあり、クリア塗装法線マップなし

上の例では左半分がクリア塗装なし、右半分はクリア塗装ありですが、それ以外はどちらも同じパラメータです。左右とも通常の[法線]マップは同じ画像を設定しているので表面がわずかに凸凹していますが、[クリア塗装法線]マップは割り当てていないのでクリア塗装の表面はのっぺりしていることになります。

サンプル画像を観察すると、左側も表面の反射による周囲の写り込みはあるものの、その反射を見るだけではどんな背景なのかはほとんどわかりません。一方右側では、下の層に重なるようにクリア塗装による反射がくっきりと写り込んでいるので、背景の様子を何となく把握するくらいはできます。

[クリア塗装]には法線マップ以外に以下のパラメータが用意されています。

[クリア塗装係数]でその反射の強度を調整したり、[クリア塗装粗さ]でぼんやりした反射にすることができます。

機能紹介 物理ベースレンダリング(4) ボリューム・屈折 (2022/04/27)

前回は[透過]を紹介しました。今回は[透過]と組み合わせて使用する[ボリューム]を紹介します。

ボリューム (Volume)

先に[透過]をオンにした状態で、さらに[ボリューム]をオンにしてください。

ボリュームの特徴として、媒質の外部から内部へ、また内部から外部へと光が出入りする際に直進する方向が曲がって透過する”屈折”の効果が得られます。透過が薄い膜状のオブジェクトに用いるのに対して、ボリュームは透明でかつ厚みもあるガラスや宝石などの媒質を表現します。

ボリュームのパストレーシングレンダリング例

[ボリューム]には以下の3つのパラメータがあります。

  • 厚さ
  • 減衰距離
  • 減衰色

このうち、パストレーシングレンダリングでは[厚さ]は設定する必要はありません。[厚さ]と[厚さ]マッピングはリアルタイム表示でのみ用いられます

上の例のように太くなっている箇所に色を付けたい場合は[減衰距離]と[減衰色]の両方を設定します。こちらはパストレーシング・リアルタイム表示どちらにも適用されます。

厚みのリアルタイム表示について

媒質内部を通過する光線がどこから入ってどの角度で出ていくのか、パストレーシングレンダリングではその処理内で計算され、屈折が正確に描写されます。

しかし、リアルタイムでは計算量的に正確な算出が困難なため、glTFのリアルタイム表示では直接入出点の位置を計算するのではなく、あらかじめ媒質の表面に厚みの値をマッピングしておき、この位置から入射する場合はマッピングされた厚み分を透過して出ていく前提で、疑似的に屈折を表現する手法が取られます。

厚さが均一な板状のオブジェクトなら[厚さ]の値を設定するだけで大丈夫ですが、曲面の場合は場所ごとに厚みが異なるため、マッピング画像として[厚さ]マップも設定する必要があります。

厚さマップの作成方法

[厚さ]マップを設定するには事前に厚さマップ用の画像を用意する必要があります。Metasequoia 4では現時点は厚さマップを直接作成する機能はありませんが、厚みの頂点カラー化、頂点カラーのテクスチャ化の2つの機能を組み合わせることで厚さマップを作製できます。

なお、厚み計測・頂点カラーのテクスチャどちらもEX版のみの機能です。Standard版ではご利用いただけませんので、この機能が必要な方はEX版へのアップグレードをご検討ください。

厚みの頂点カラー化

[計測]コマンドで[厚み]、測定方向に[放射状]を選択し、[厚みを頂点カラー化]を実行します。

厚みの頂点カラーマッピング例

[グレースケール]をオン、[色を反転]をオフにしてください。薄い箇所が暗く、太い箇所が明るく表示されているのがわかります。この状態で厚みの頂点カラー化は完了です。

ここでスライダーで設定可能な厚みの上限値(上の画像でのバーの横の数値)を覚えておいてください。この値を後で使用します。

UV展開

頂点カラーをテクスチャへ変換する前に、その準備としてUV展開が必要です。

編集モードを「マッピング」に切り替え、「自動展開」を選択します。


「切れ目を選択」の「自動選択」を呼びだし、「アルゴリズム」に「スマート」を指定します。「高速」でも構わないのですが、展開結果に重なりが生じることがあるため、スマートのほうが楽なケースが多いです。

 

切れ目が選択できたら「展開実行」を呼び出します。パラメータはそのままで構いません。処理後は、展開結果に重なりがないことを確認してください。

重なりがあると見た目に多少おかしい箇所が出てくる可能性があります。(多少なら気にしないという手もありますが…)

重なりを解消するには、「分離」コマンドで重なりのある箇所の根本付近を切り離し、「切れ目の選択」>「現在の切れ目」を呼び出して切れ目を追加してから、再度「展開実行」を呼び出します。

テクスチャ変換

UV展開ができたら、頂点カラーをテクスチャ画像化します。編集モードを「モデリング」に戻し、「頂点カラー」コマンドで「テクスチャへ変換」を呼び出します。

ポリゴン数が多いモデルの場合は横幅・縦幅を十分に高い値にしてください。ポリゴン数に対してテクスチャ画像の解像度が低いと、画像がつぶれて粗い結果になってしまうことがあります。

ファイル名を指定してpngファイルなどで保存します。出力されたファイルを適当な画像ビューアで開くと、厚さが濃淡で表現された画像になっていることが確認できます。

厚さマッピング

材質の設定

最後に材質の設定です。glTFシェーダの拡張設定内の[透過]と[ボリューム]をオンにし、[厚さ]に計測時の上限として表示されていた値を指定します。

[マッピング]内の[厚さ]に出力したファイルを指定します。

また、頂点カラー化されたままの厚さはもう不要なので、「頂点カラー」をオフにすることを忘れないでください。

[金属感]と[粗さ]は[透過]の時と同様に低めの値にしておきます。[粗さ]を若干上げるとすりガラスのようになります。

これで、プレビュー内でボリュームの材質が設定されたオブジェクトが、ガラスのようにその背景が屈折して透き通っている表示になっているはずです。後ろにオブジェクトを配置したり、環境マップを設定してください。

また、[減衰距離]と[減衰色]を設定すると、厚みのある箇所が濁って、グミや宝石のような表現も可能です。[減衰距離]は表面からその距離に達した時点で光をどこまで減衰させるかを指定します。[厚さ]と同じ値でもいいですし、より浅い厚さの箇所でも暗い色にしたいなら厚さよりも低い値を指定します。

リアルタイム表示での減衰表示

[減衰色]の値が1なら内部で減衰は起こりませんので、[減衰距離]も設定する必要はありません。

なお、[厚さ]と[減衰距離]は絶対的な寸法として指定されます。スケールの異なるオブジェクトで同じような見た目にしたい場合、そのスケールに合わせてそれぞれ異なる値を指定する必要があります。

屈折 (IOR)

[ボリューム]使用時のデフォルトの屈折率はガラスとほぼ同等の1.5ですが、水や鉱物などは異なる屈折率を持ちます。[屈折]をオンにすると任意の屈折率を設定することができます。

ボリュームが設定された状態で屈折率の値を変えると、屈折を通して見える後ろ側の見え方が変わっていくことがわかると思います。実際に試してみてください。

現実の物質における屈折率の値についてはWikipediaや色々な文献・Webなどで紹介されていますので、そちらをご参照ください。

 

今回はボリュームと屈折について紹介しました。次回では残りの他のパラメータについて紹介します。

機能紹介 物理ベースレンダリング(3) 透過 (2022/04/26)

前回の最後で紹介した拡張設定について、今回から掘り下げていきます。まず始めに、ビジュアル面でわかりやすい[透過]に焦点を当てて紹介します。

透過 (Transmission)

半透明表示は、古くから不透明度(または透明度)を指定してアルファブレンディングで行うのが定番でした。glTFでも標準的な仕様内に[Alphaモード]と[不透明度]を指定するアルファブレンディングがありますが、それとは異なる形で新たに”透過”(Transmission)が拡張として定義されました。(伝搬・伝播などと直訳されているケースもあるようですが、透過が一番しっくりくると思います)

透過はセロハンやクリアファイルのような結晶化した薄いプラスチック、ごく薄いガラスなど、屈折がない薄膜を表現するのに適しています。

アルファブレンディングと透過は背景が透けて見える点では似ていますが、粗さを変えながら比較するとその違いが明瞭にわかります。

アルファブレンディングは全体を同じ比率で合成するだけですが、透過には

  • 表面では鏡面反射する
  • 入射角の浅い辺縁部では吸収や反射(フレネル効果)によって明度の変化が顕著になる
  • 媒質内で散乱しながら光が進むことで、透過先の背景をぼかす効果が得られる

などの特徴があります。

不透明度と同様に、[透過係数]でどの程度透過させるかを調整することもできます。透過係数を0にすると透過を設定しないのと等価になります。

基本色に白以外を設定すると、色付きフィルムのような表現が得られます。

透過を使用する際に注意すべきは、[金属感]が設定されていると透過は打ち消されます。これは金属が光を外部へと反射し、内部への光を吸収してしまう性質によります。(だそうです、細かい理屈はわかっておりません…)

もう一つの注意点は、リアルタイムのプレビュー表示では、同じオブジェクトでも異なるオブジェクトでも「透過」する面の後ろにさらに「透過」する面を二重に透過させることはできません。あくまで疑似的な表現なので、手前の面のみが優先されて表示されます。パストレーシングレンダリングでは正確な描写が得られます。

透過の使用例

ガラスが非常に薄い小型の電球を作成してみます。材質の設定が主眼なのでモデリングについては言及しませんが、下絵として電球の画像を配置しながらモデリングすると、難しくないでしょう。

モデリングができたら材質の設定です。すべての材質にはglTFシェーダを割り当てておきます。

まず、ガラス用の材質を設定します。ガラスには[透過]を適用し、また他のパラメータも次の画像のように設定します。

金属感:0、粗さ:0

透過:オン、透過係数:1

光を放出するフィラメントには[自己照明]を設定します。これにより、任意の形状を光源として使用することができます。自己照明欄の右側のカラーボタンを押し、色表示欄をクリックして、オレンジ色に設定します。

 

口金は金属感を高く、粗さを低く設定します。一例として次のように設定します。

  • 金属感:1
  • 粗さ:0.1

適当な環境マップを適用して、一度パストレーシングレンダリングしてみます。

ガラスや口金の質感がうまく再現できていることがわかります。一方、フィラメントの光量が低すぎて、電球が全然明るくなっていません。

光量は[自己照明]の値と、光源用のオブジェクトの面積によって決まりますが、フィラメント用オブジェクトがかなり細いため、そのままでは光量が非常に小さいものとなっています。

色設定時にHSVモードにしたとき、明るさを示す[V]は通常は0~100の範囲で設定しますが、自己照明の値はこの範囲を超えて数値入力することができます。Vの値を10倍ずつ増やしながらレンダリング結果を確認することを繰り返し、1000万まで増やすとだいぶ明るくなったので、最終的に1500万で調節してみました。フィラメントから放出された光がガラス内部で反射しながら、眩しさを感じる明るさになりました。

なお、glbファイルに出力する際は自己照明は範囲外の値を入力しないでください。glTFの規格により値の範囲が制限されており、出力したファイルがビューア側で正常に読み込めない可能性があります。(追記:Ver4.8.3bでKHR_materials_emissive_strength拡張に対応して、自己照明のVが100以上でもそのまま出力できるようになりました)

今回は[透過]と併せて、自己照明を設定してオブジェクトを光源として使用する方法についても紹介しました。次回は[ボリューム]についてです。

機能紹介 物理ベースレンダリング(2) glTFシェーダの基礎 (2022/04/21)

前回は物理ベースレンダリング(PBR)とglTFの概要について紹介しました。今回はMetasequoia 4内でどうglTFを扱うかを基礎から解説します。

Ver4.7で既にglTFシェーダと、glTFを格納するglbファイル入出力を搭載していましたが、当初はglbファイル出力をしない人には縁のない機能だったかもしれません。しかし、Ver4.8.0で物理ベースレンダリングに対応したパストレーシングが搭載され、ここでglTFシェーダは従来のPhongに代わるパストレーシングレンダリング向けの標準シェーダとしての位置付けとなりました。glbファイルを扱わなくても、パストレーシングレンダリングで高品質な画像を得たい人は、まず材質にglTFシェーダを割り当てるところから始まりとなります。

一度も使ったことのない方、また既に使っている方にもおさらいとして一から説明していきます。

glTFシェーダの設定

材質パネル内の[設定]を押して[材質設定]画面を開いた状態で、[シェーダ]欄を[Phong]から[glTF (PBR)]に切り替えます。

シェーダを変更すると[諸設定]の内容が切り替わり、また[Specular-Glossiness設定]と[拡張設定]が折りたたまれた状態で表示されます。この3つのグループ内の各項目がglTFシェーダ向けのパラメータとなります。

PhongよりもglTFシェーダをメインに使うなら、毎回切り替えるのが面倒なので、glTFシェーダを標準にしましょう。glTFシェーダに切り替えた材質を選択した状態で、材質パネルの[他]内の[標準材質として設定]メニューを呼び出すと、以降新規に作成した材質は登録された内容と同じになります。やっぱりPhongに戻したいときはメニュー横の矢印を押してください。

金属感・粗さ

前回も簡単に解説しましたが、物理ベースレンダリングにおいては[金属感]と[粗さ]の2つのパラメータが質感の設定に大きく寄与します。

この2つの値を変更しながら、プレビュー表示上でどう変わるか観察してみましょう。縦方向に[金属感]、横方向に[粗さ]を変えて並べた結果がこちらです。

リアルタイムプレビュー表示

金属感が0のときは光の反射によるハイライトが付きません。金属感が0より大きくなるとハイライトが確認できるようになりますが、粗さが小さい左下のほうでは全体が暗くなります。

粗さに注目してみます。粗さが小さいうちは丸いハイライトの大きさが変化していきますが、0.7くらいになると輪郭がぼけてきて、1.0になるとハイライトがわからなくなります。

今度は環境マップを適用した状態でプレビュー表示を観察します。

環境マップ適用時のリアルタイムプレビュー表示

金属感・粗さの変化に対する傾向は同じですが、金属感が1に近づくにつれて背景の環境マップがくっきり反射してくるのがわかります。また、粗さが高くなるほど環境マップがぼやけて、元の画像がどんなかわからなくなります。

ちなみに、パストレーシングでのレンダリング結果がこちらになります。

パストレーシングレンダリング

おおむね同じような結果ですが、プレビュー表示とは環境マップのぼやけ具合などは微妙に異なります。これは、プレビュー表示が高速化やメモリ軽量化などのために処理を簡略化していることが一因です。(もう少し違いを小さくできないか検討中…)

ちなみに、glTFシェーダはすべてのパラメータがDirect3DやOpenGLによるリアルタイムのプレビュー表示に反映されます。材質設定ウィンドウ内の左上の小さい球体だけでなく、プレビュー表示と材質設定を並べて、実際のオブジェクトを観察しながら値を調整すると効率がいいでしょう。

並べて表示するには広めのモニター推奨

周囲光の影響について

glTFシェーダを適用したとき、Phongに比べて全体に白っぽいのが気になることがあります。

Phongもですが、glTFシェーダでもプレビュー表示には[周囲光]が影響します。光の当たらない箇所を暗くしたい場合、[照光]内の▼ボタンから[光源設定]を呼び出し、[光源]タブ内の明るさ(V)を下げてください。

明るさを0にすると、光の当たらない箇所は真っ黒になります。適当と思う明るさを設定してください。

なお、周囲光はプレビュー表示にのみ適用されます。パストレーシングレンダリングやglbファイル出力には影響しません。

拡張設定

Ver4.8.3ではPBR向けの拡張仕様に一通り対応しました。

[諸設定]グループの下側にある、閉じた状態の[拡張設定]をクリックすると、拡張設定内の各パラメータが表示されます。

チェック項目とその下に値の入力が並んでいますがが、チェックをオンにするまで各項目の値の設定はできません。

拡張設定は数が多くて一度に紹介できませんので、次回以降で説明していきます。

機能紹介 物理ベースレンダリング(1) 概要とglTF (2022/04/20)

Metasequoia 4 Ver4.8.3では最新のglTFの仕様に準拠した物理ベースのシェーダパラメータに対応しました。Metasequoiaでは物理ベースレンダリングに関する改良項目を以前のバージョンから順次取り入れてきましたが、今回の新バージョンでだいぶ整備が進んだことを踏まえて、物理ベースレンダリングとglTFについて複数回にわたって紹介していきます。

目次

物理ベースレンダリングの登場

物理ベースレンダリング(Physically Based Rendering; PBR)が登場する以前は、フォン(Phong)シェーディングモデルまたはその派生形が広く使用されていました。

Phongシェーディングは1970年代に提唱され、主に

  • ディフューズ(Diffuse; 拡散反射、拡散光) : ざらつきのある表面に光が照らされて明るく見える
  • スペキュラー(Specular; 鏡面反射、反射光) : 表面に反射して光源がハイライトとして写り込む
  • アンビエント(Ambient; 環境光) : シーン全体が照らされる

の3つの成分によってシェーディングを定義します。

Phongシェーディングモデル

この考え方はわかりやすく、また現代よりも遥かに性能の低い計算機環境でも扱いやすいシンプルな計算式でライティングを表現できたため、現在に至るまで長く使用されてきました。

しかし、この計算モデルは実際の物理法則に基づくものではないため、いかにもCGな感じの見栄えになりやすく、特に実写との合成には違和感をなくすために多大な編集の労力を要することもしばしばでした。

そこで、特に2000年代以降、拡散反射・鏡面反射それぞれについて実際の物理法則に基づいた計算式を導入して、よりリアルに見える計算モデルが活発に提唱されていきます。

特に2012年にDisneyから発表された論文“Physically Based Shading at Disney”ではデザイナーが直感的に理解しやすいパラメータ群で質感を定義できたため、広い支持を集めてRenderManなど様々な商用レンダラーに搭載されていきます。またこの後は、この計算モデルをベースにさらに改良を進めたモデルが提案され発展していくことになります。

このモデルやその派生形の計算モデルが一般に物理ベースシェーディング(Physically Based Shading; PBS)と呼ばれ、PBSを導入したレンダリングを物理ベースレンダリングと呼びます。

物理ベースシェーディング・レンダリング

Phongシェーディングモデルでは拡散反射・鏡面反射の成分を直接指定しましたが、物理ベースシェーディングでは拡散反射・鏡面反射の成分には

  • 金属感 (Metallic)
  • 粗さ (Roughness)

の2つのパラメータが大きく寄与します。

光源1つだけのライティングではPhongとの違いはわかりづらいですが、鏡面反射の計算の改良によりハイライトの形が歪みにくくなっているのが確認できます。

環境マップを光源として用いるときは、違いがよりはっきりとしたものになります。「粗さ」を設定可能なPBRでは表面のざらつきによって背景全体がぼんやりと写り、また明るい箇所については鋭いハイライトとして反映されます。

さらにSpecular, Sheen, Clearcoatなどのパラメータ効果が付与されて、より多様な質感が表現できます。

“Physically Based Shading at Disney”より引用

ただし、現実世界の物質にこのようなパラメータがあるわけではありません。物理ベースレンダリングも厳密に物理法則に基づくものではなく、あくまで以前よりもリアルっぽく見えるようになった計算手法でしかありませんが、パラメータの意味を理解して値を設定しやすい点において優れたものと言えると思います。

細かい理論や計算式などはここでは解説しませんので、興味のある方はDisneyの論文などを参照してください。

glTFの登場

Web上で3Dモデル・シーンを表現するフォーマットとして、古くはVRML、その後X3DやCOLLADA(※これはWeb用に限らず)なども提案されましたが、どれも広く普及するには至りませんでした。

そこでOpenGLやWebGLなどの規格を策定しているKhronos Groupが中心になって、新たに標準を目指すフォーマットとしてglTFが提案され、初版が2015年に策定されました。その後すぐに仕様の見直しが行われ、2017年にglTF 2.0として発表されます。現在glTFと呼んでいるものは、ほぼ2.0のことを指していると考えて構いません。

glTF 1.0では質感の定義にはPhongシェーディングが採用されていましたが、潮流の変化を見定めたということでしょうか、glTF 2.0では互換性のない形でPhongシェーディングを廃止し、代わりにMetallic/Roughnessパラメータを主とした物理ベースレンダリングが導入されることになります。

glTFによる物理ベースレンダリング

glTF 2.0の策定当初は少ないパラメータしかありませんでしたが、glTF自体は拡張によるパラメータ追加が可能な構造になっており、いくつかのベンダーが独自拡張を行っています。Khronosもまたその拡張をベースに検討を進め、Disneyの論文以降に発表された最新の計算手法も取り入れながら順次新しい拡張仕様を定義し、2021年7月時点で

  • クリア塗装;クリアコート (Clearcoat)
  • 光沢;シーン (Sheen)
  • 屈折率 (Index of refraction; IOR)
  • 反射光;スぺキュラー (Specular)
  • 透過;トランスミッション (Transmission)
  • ボリューム (Volume)
  • 照光なし (Unlit)

さらに2022年の追加項目

  • 虹ムラ (Iridescence) Ver4.8.4で対応

が質感表現のためのKhronos拡張仕様として定義されています。(日本語名は公式にはないため、弊社が独自に訳したものです)

各拡張は慎重に仕様検討が進められた甲斐もあってか、(Unlit以外の)各拡張は任意に組み合わせることができ、表現の自由度が高くなっています。また現在も議論中の項目もあり、今後さらに定義が追加される可能性があります。

(上記以外にもglTF2.0策定当初からSpecular-Glossiness拡張がありますが、現在ではArchivedとして仕様が凍結され、他の拡張との組み合わせもできない腫物扱いのような状況ですので、こちらは紹介しません)

glTFにおけるリアルタイム表示は、時間をかけて処理するパストレーシングレンダリングと理論的にはほぼ等価です。ただ、リアルタイムに処理できることを主眼としているため、パストレーシングでは使用しないリアルタイム表示専用パラメータも若干存在し、仕様自体がリアルタイムで表現可能な項目に絞られて定義されています。しかしながら、透過・屈折の表現など以前では考えられないような高度な表現がリアルタイムでもできるようになりました。

編集画面内の平面メッシュ表示も屈折する

ツールレベルではglTF自体には対応していても拡張仕様についてはまだこれからのものが多いですが、three.jsやbalylon.jsなどWeb3D用フレームワークのレベルではおおむね対応が済んでいるので、拡張仕様による表現がデファクトスタンダードとなる日も近いかもしれません。

Metasequoia 4 Ver4.8.3では上記の拡張仕様すべてに対応しています。各パラメータの設定方法について次回以降で解説していきます。

機能紹介 Ver4.7.7でのブーリアンについて (2021/04/21)

Ver4.7.7では、ブーリアン処理のエンジンの切り替えが行われました。Metasequoiaのブーリアン処理については、これまで幾度かエンジンを刷新しており、大別すると今回で第4世代のものとなります。(ちなみに第1はVer3以前の外製プラグイン、第2がVer4.0から、第3がVer4.4以降)

開発時に行った評価結果では、今回の新エンジンのほうがより堅牢性が高くてエラーが起きにくいことから、第3世代のエンジンを廃止して採用することとなりました。

ただし、どんなデータに対してもエラーが起きないわけではなく、少なくとも特定の条件下でエラーが起きるか、エラーでなくてもおかしな結果になることを確認しております。

特定の条件とは「同じオブジェクト内で面同士が交差している箇所がある」かどうかです。

例えば、青色のオブジェクトAに2つの球体、赤色のオブジェクトBに1つの球体があるときを考えます。

AからBを引いた差はどうなるでしょうか。普通は下図のような結果を期待します。

しかし、実際には下図のように、オブジェクトBがひっくり返ったようなものが残り、変な結果になってしまいました。

原因は、オブジェクトAの2つの球体の一部が重なっているためです。

解決策は少しだけ面倒ですが、「選択部処理 > 面を新規オブジェクトへ」メニューでオブジェクトAの片方の球体をいったん別のオブジェクトへ移し、個別にブーリアン処理を適用することで期待した結果が得られます。また、青の2つの球体をあらかじめブーリアンで一枚皮にくっつけておくのもいいかもしれません。

別々の2つの塊が重なっているケースでは解決も比較的簡単です。しかし、複雑なオブジェクトではまずどこが重なっているか目視で探すのは難しいかもしれません。

例えば下図のように、1つの塊の中で手前の面を奥側に移動しすぎて、奥の面を貫通してしまった場合、かなり良く見ないと貫通していることに気づきにくいです。

こんな時は新たに追加された「交差箇所の選択のみ」機能が便利です。

一つのオブジェクト内の自己交差のみを検出する場合、「自己交差もチェック」をオンにします。また、オブジェクト間の交差は除外したいので、「対象」のリストはCtrlキーを押しながらクリックして選択を外します。この状態でOKを押すと、下図のように交差箇所の面と頂点が選択された状態になります。

選択対象は「面のみ」「頂点+面」を指定できますが、面だけの選択だと交差箇所の面が小さい場合は見づらいので頂点も選択するといいでしょう。

該当箇所がわかったら、あとは該当箇所を重ならないよう修正してから再度トライしてください。

上記は自己交差に関する注意点をまとめましたが、他にもまだ把握していない問題があるかもしれません。もし、このデータでブーリアン処理に失敗するけど解決できないということがありましたら、まずは弊社サポートまでお問い合わせください。

機能紹介 Metasequoia 4の便利な機能紹介(7) – 凸凹な面の作成と編集 (2019/08/01)

Metasequoia 4はより幅広い層にご利用いただける3DCGモデリングソフトを目指して開発を続けておりますが、新たに使い始めたり久しぶりにソフトに触れたりしたとき、細かな機能を見落としてしまうこともあるかと思います。
こちらの記事では、アップデート時にあまり紹介してこなかった細かな機能や、知っていると作業時に役に立つ機能を紹介していきます。

今回は、Metasequoia 4にあるさまざまな形状の面を作る機能のうち、複雑な凸凹のついた面を取り扱う機能についてご紹介します。

これまでのMetasequoia 4機能紹介記事のまとめはこちら
続きを読む