基礎から始める3dsmax/Python(MaxPlus)プログラミング③

さて3dsmaxのPythonも3回目です。
今回もサンプルプログラムを改造して練習してみましょう。
なぜ改造するのかというと、ここにあるサンプルはちょっと高度で長いので、「基礎から始める」には厳しいからです。

ではまず下のプログラムをご覧ください。今回はマテリアルと移動、スケールの設定です。

import MaxPlus as mp
def solidMaterial(color):
m = mp.Factory.CreateDefaultStdMat()
m.Ambient = color
m.Diffuse = color
m.Specular = mp.Color(1, 1, 1)
m.Shininess = 0.5
m.ShinyStrength = 0.7
return m
obj = mp.Factory.CreateGeomObject(mp.ClassIds.Teapot)
obj.ParameterBlock.Radius.Value = 5.0
for i in range(10):
node = mp.Factory.CreateNode(obj)
m = solidMaterial(mp.Color(0, i*0.1,0))
node.Material = m
node.Position = mp.Point3(i*5, 0,0 )
node.Scaling = mp.Point3(i*0.1+0.1, i*0.1+0.1, i*0.1+0.1)

 

これを3dsmaxのmaxscriptエディタにペーストして、CTRL+Eで実行します。

すると、ティーポットが10個がだんだん大きくなりながら色が変化して並んでいます。

マテリアルエディタを見ると・・・

ちゃんと黒からだんだん緑になる10個のマテリアルが生成され、色や鏡面反射の設定も自動でできています。

では1行づつ説明しましょう。(行数はMaxScriptエディタの画面を参考に
import MaxPlus as mp
これは前回とちょっと違います。サンプルの中のあちこちに「MaxPlus」が並んでいるので、このように書くとMaxPlusをmpで省略できるのです。

ちょっと飛んで13、14行ですが、これは前回でもやったので簡単に。ティーポットを作る準備をして、大きさを5に指定しています。この段階ではティーポットはできていません。
16~19行目ですが、
for i in range(10):
 node = mp.Factory.CreateNode(obj)
 m = solidMaterial(mp.Color(0, i*0.1,0))
 node.Material = m
pythonのfor命令ですね。インデントで17~19行を10回繰り返しています。
17行は14行で決めたティーポット「obj」を「node」に代入することで新規に生成します。この命令をfor繰り返せば、オブジェクトは自動で大量に作れるのです。

さて18行目が今回のメインです。
solidMaterialという関数を呼び出して、結果をmに代入しています。引数としてmp.Color(0, i*0.1,0)を送っています。
for命令でrange(10)なので、iが0~9に増えていきますので、i*0.1は0~0.9になりますね。3つの数字はRGBの真ん中なので緑です。

3~10行がマテリアルの設定の関数でcolorを受け取ります。
def solidMaterial(color):
 m = mp.Factory.CreateDefaultStdMat()
 m.Ambient = color
 m.Diffuse = color
 m.Specular = mp.Color(1, 1, 1)
 m.Shininess = 0.5
 m.ShinyStrength = 0.7
 return m
4行で新規の標準マテリアルを作ります。 m.Ambientが「周辺光」、m.Diffuse が「拡散反射光」で、それぞれ引数の「color」を入れてます。
m.Specular = mp.Color(1, 1, 1)は「鏡面反射光」を白に設定しています。
mp.Colorに(R, G, B)を入れれば色の指定になることが判りますね。
しかし値は0~255ではなく、0~1です。

m.Shininess、m.ShinyStrengthで「鏡面反射レベル」と「光沢」を設定しています。これまた数値が0~1です。maxだと0~100ですね。
return mは設定したマテリアルの情報を「m」として返す、ということです。

for命令でこの関数を10回呼び出すので、その度に違う緑のマテリアルを作って19行に戻って、node.Material = mで作ったティーポット(node)に設定しているということです。

20,21行で位置と大きさを変えています。
node.Position = mp.Point3(i*5, 0,0 )
node.Scaling = mp.Point3(i*0.1+0.1, i*0.1+0.1, i*0.1+0.1)
2行ともmp.Point3(x,y,z)という変数があります。色で使ったmp.Colorと同様に3つの値を入れる時に使います。
位置はXに5づつ移動、スケールは最初が0.1でそれに0~0.9を足していますね。
これでだんだん大きくなって色も変わるプログラムになるのです。

さて、何か不足してますね。そうです「回転」です。
3dmaxユーザーの方なら判ると思いますが、「コントローラ」が関わってくるので、ややこしいので、これだけ次回に説明します。

glTF exporter for MayaでWebGLはじめました

さて、今週の木曜のリアルタイムCGの回はUE4はお休みして、WebGLです。
WebGLとはWebブラウザ上で3DCGを表示してインタラクティブに鑑賞できる仕組みです。
工業製品などのプレゼンには最高なのですが、UE4やUnityから書き出すこともできるのですが、いま一つ制限とかあり面倒でした。

そこで今日のお話の「glTF exporter for Maya」です。
glTFって・・・ってちゃんとそこから説明します。以下が解りやすいです。
https://qiita.com/cx20/items/95127986f4b9fa91fe9b

簡単に言えば、3DCG用の標準フォーマットを狙ったファイル形式なのです。
V-Rayでお馴染みのKhronosが決めているらしく、それにマイクロソフトなども賛同して広めようとしているようです。さらにVTuber向けにもドワンゴが開発した「VRM」もこのフォーマットです。

ところがBlenderからしか書き出せない・・・ちょっと不便でした。そこで今日のお話のMayaから書き出すプラグインが出た!というお話です(導入が長くてすいません・・・)

まず、プラグインを「株式会社カシカ」様からダウンロードしてきます。
https://kashika.co.jp/product/gltfexporter/


Maya2017と2018があります。日本語と英語の親切なマニュアルが付いてくるのでとても有り難いです。
上の3つを指定されたMayaのインストール先にコピーするだけです。

Mayaを起動してプラグインマネージャーで確認すると、ちゃんと認識されているので、「Loaded」をONにします。


このブログやCGwrold記事でお馴染みのロボットくんです。リアルタイム用なので比較的軽いモデルです。

FBXのように選択してエクスポートします。細かいことが抜きにして今回はglb形式で書き出してみます。

Mayaのmaだと6MBがたったの133KBで約1/45になりました。
これならスマホでも使える訳です。

表示のためのプログラムや環境を用意するのは面倒なので、確認用にWebサイトがいくつかあるので、それで実験します。
この画面に、書き出したファイルをドラッグ&ドロップするだけです。

このようにすぐに表示されグリグリ回せます。
ぜひ動画でご覧ください。

背景を変えたり、ライトをセットしたり自由です。以前ご紹介したSketchFabと違うのはどこにも置けるのと、UIやインタラクションを自由に決められるということです。
次回、マテリアルやテクスチャー設定やアニメーションなど順に連載していきます。

UnrealEngine4/Voxel Global Illumintaion (VXGI) をテスト②

先週に引き続きUnrealEngine4でVXGIを試してみます。
前回はデモを起動するだけでしたが、今回は機能をしっかり解説します。

まず、前回作ったUE4.19-VXGIを起動します。普通に新規作成から、お馴染みのThirdPresonのテンプレートでスターターコンテンツ付です。

以下のように空やライトなど全部消して、壁を移動して空間も狭くします。
もちろん真っ暗にして「非ライティング」で作業します。
右上の「モード」からポストプロセスボリュームを出します。

この空間に配置します。

以下のように、VXGIの項目が追加されています。各項目を「Enable」をONするだけで、今回は細かい設定は省略します。次回以降にお話ししましょう。

もともとのオブジェトは削除して、スターターコンテンツからイスと岩を置きます。ピンクの壁はただのCubeです。

モード→ライト→AreaLightをドラッグします。

上が表なので回転とスケールで以下のようにしましょう。

Playすると以下のようにエリアライトでソフトな影が出ます。ちゃんとGIしてますね。
マテリアルが設定できますが、実はこの色は関係ありません。

ライトカラーはその下に明るさと一緒にあります。

青いライトにしてみました。

もう1つエリアライトを出して背後に置きます。明るさを強くします。

色はオレンジに。マテリアルは白に戻しました。

このようにリムライトができます。ライトの板は自体は右の青いライトの色です。

右のピンクの壁のエミッシブ(自己照明)を強くします。

壁全体が光ったGIの表現ができます。ロボットの背中に映り込みも計算されています。

スターターコンテンツをご存知の方は以下のマテリアルに見覚えがあるかと思います。

これを床に貼ると・・・

このアニメーションの光もGI計算します。

表示メニューをクリックすると、VXGIのモードがあります。

まずVoxel計算の状態です。

前回の説明では良く解らなかったかと思いますが、各パーツをブロック化して、その6面の光だけ計算する、ということらしいです。
以下はEmmitance表示。光っているパーツです。

ぜひ動画でご覧ください。

次回はポストプロセスの設定などを細かく調べていきましょう。