MAXScript を使用したテクスチャのレンダリング
 
 
 

[テクスチャをレンダリング] (テクスチャ ベイク) は、プロダクション レンダラーを使用して 3ds Max ジオメトリ シーン オブジェクトのサーフェスのさまざまな側面をキャプチャし、ビットマップを作成する処理です。既定値のスキャンライン レンダラーおよび mental ray レンダラーはいずれもこの機能をサポートしています。

メイン メニュー/[レンダリング]/[テクスチャをレンダリング]メニュー項目に用意されている 3ds Max[テクスチャをレンダリング]ツール は、実際にはスクリプト ツールとして実装されています。

..¥ui¥macroscripts¥Macro_BakeTextures.mcr

また、このツールのネットワーク バージョンで使用される[テクスチャをレンダリング]メソッドの一部は、次のファイルに含まれています。

..¥stdplugs¥stdscripts¥RTT_methods.ms

[テクスチャをレンダリング]のコンポーネント

ここでは、テクスチャへのレンダリング処理に使用される MAXScript のクラス、インタフェース、プロパティ、メソッドに関する簡単な概要と、これらを使用して独自のテクスチャ ベーキング ツールを作成する方法を紹介します。

要素のベイク

テクスチャ ベイク処理に関連するメイン オブジェクト クラスは、Bake Element です。

このオブジェクト クラスは、拡散反射光、ライト, アンビエント オクルージョン、法線、シャドウなどのプロダクション レンダラーから特定のチャンネルをキャプチャする機能を持ったオブジェクトとして実装されます。

INodeBakeProperties インタフェース

サーフェスをベイクされるジオメトリ オブジェクトについては、すべてのシーン ノードによって公開される INodeBakeProperties インタフェースを使用して処理用のセットアップを行う必要があります。

このインタフェースは、特定のノードに 1 つまたは複数のベイク要素を追加し、ベイクを可能にしてその他の関連パラメータをコントロールする目的で使用されます。

プロダクション レンダラー

プロダクション レンダラー (既定値のスキャンライン レンダラーおよび mental ray レンダラーを含む) は、次のようにして起動した特別なモードの MAXScript を使用して呼び出します。

render rendertype:#bakeSelected

UVW アンラップ

ベイクしたテクスチャを使用するためには、レンダリングするオブジェクトがオーバーラップのない、良好なテクスチャ座標を持っている必要があります。

3ds Max に付属の[テクスチャをレンダリング]スクリプトでは、Unwrap_UVW モディファイヤの自動適用とセットアップをコントロールすることによって、テクスチャ座標をベイクに使用できるようにしています。正しく使用できる適切な UV 座標がオブジェクトに用意されている場合を除き、独自のスクリプトを作成する場合でも、同様にする必要があります。

プロジェクション マッピング

法線マップを生成する場合などは特に、レンダリングされるサーフェスがオブジェクトの高解像度バージョンであり、マッピングされるターゲット オブジェクトは低解像度バージョンである場合があります。このような場合は、解像度が低いオブジェクトのテクスチャ座標を、解像度が高い方のオブジェクトからの投影によって生成する必要があります。

インタフェース: INodeBakeProjProperties」、「プロジェクション モディファイヤ」、「Project_Mapping : ReferenceTarget」が、3ds Max プロジェクション マッピング システムの主な要素です。

シェル マテリアル

シェル マテリアルは、[テクスチャをレンダリング]ツールと組み合わせて使用するために特別に設計されたものです。2 種類のマテリアル、通常は元のマテリアルとベイク マテリアルを保持することができます。いずれも、ビューポートまたはレンダラーで使用することができます。

簡単な[テクスチャをレンダリング]スクリプトの開発

次の例は、[テクスチャをレンダリング]カスタム スクリプトを作成するための基本的な手順を示したものです。

このスクリプトでは、テクスチャが適用された平面上にテクスチャが適用された球があり、影付けが有効なオムニ ライトで照明されているという、単純なシーンを作成しています。

次に、両オブジェクトの拡散反射光およびライトの要素をディスク上の TGA ファイルにベイクし、1 つのスロットに古いマテリアルが、他方のスロットにはベイク マテリアルが含まれているシェル マテリアルを作成します。

ベイクされたマテリアルでは、拡散反射光およびライト情報を単一の拡散反射光マップに統合するために合成マップを使用しています。

この単純な例では、両オブジェクトのテクスチャ座標はジオメトリ プリミティブによって手続き的に生成され、ベイクに使用することができます。また、この例では投影マッピングは必要ありません。

スクリプト:

fn BakeDiffuseAndLighting obj size =
(
--すべてのレンダリング要素をクリア   
obj.iNodeBakeProperties.removeAllBakeElements() 
--ベイク要素を準備
be1 = diffusemap() --ベイク要素クラスのインスタンス
be1.outputSzX = be1.outputSzY = size --ベイクするマップのサイズを設定
--ファイルの完全パス、名前、種類を指定
be1.fileType = (getDir #image+"\\"+obj.name+"_diffuse.tga")
be1.fileName = filenameFromPath be1.fileType
be1.filterOn = true --フィルタリングを有効化
be1.shadowsOn = false --影付けを無効化
be1.lightingOn = false --ライティングを無効化
be1.enabled = true --ベイクを有効化
be2 = LightingMap() -- ベイク要素のクラスのインスタンス
be2.outputSzX =be2.outputSzY = size --ベイクするマップのサイズを設定
--ファイルの完全パス、名前、種類を指定
be2.fileType = (getDir #image+"\\"+obj.name+"_lighting.tga")
be2.fileName = filenameFromPath be2.fileType
be2.filterOn = true --フィルタリングを有効化 
be2.shadowsOn =true --影付けを有効化
be2.enabled = true --ベイクを有効化
--ベイク用にオブジェクトを準備
obj.INodeBakeProperties.addBakeElement be1 --1 つ目の要素を追加
obj.INodeBakeProperties.addBakeElement be2 -- 2 つ目の要素を追加
obj.INodeBakeProperties.bakeEnabled = true --ベイクを有効化
obj.INodeBakeProperties.bakeChannel = 1 --ベイクするチャンネル
obj.INodeBakeProperties.nDilations = 1 --テクスチャを少し拡張
select obj --選択をベイクするので、オブジェクトを選択
--レンダラーを呼び出して 2 つの要素をベイク:
render rendertype:#bakeSelected vfb:off progressBar:true outputSize:[size,size]
theComp = CompositeTextureMap() --合成マップを作成
theComp.add() --2 つ目のレイヤを追加
theComp.blendMode = #(0,5) --2 つ目のレイヤを設定して乗算 
--2 つのマップを作成(拡散反射光およびライティング マップ用)
theMap1 =bitmaptexture filename:be1.fileType
theMap2=bitmaptexture filename:be2.fileType
theComp.mapList = #(theMap1,theMap2) --2 つのマップを合成
theComp.opacity = #(100,70) --ライティング マップの不透明度を 70% に設定
--合成マップを使用して標準の自己照明マテリアルを作成
bakedMat = standard diffusemap:theComp selfIllumAmount:100
--オブジェクトにシェル マテリアルを割り当て
--古いマテリアルを元のマテリアルとして保持
--新しい bakedMat をベイク マテリアルとして設定
obj.material = Shell_Material originalMaterial:obj.material\
bakedMaterial:bakedMat viewportMtlIndex:1 renderMtlIndex:1
--ベイク マテリアルのテクスチャをビューポートに表示
showTextureMap obj.material obj.material.bakedMaterial true
)-- fn 終了
resetMaxFile #noprompt--シーンをリセットしてはじめから開始
--白いオムニ ライトを照射するシャドウを作成
theLight = omniLight pos:[0,-60,100] rgb:white
theLight.baseobject.castshadows = true
--グラウンド平面の上方にマップが適用された球オブジェクトを作成
theObject = Sphere segs:32 mapcoords:true pos:[0,0,25]
--細胞マップを作成し、標準マテリアルでオブジェクトに割り当て
theMap = cellular cellColor:blue divColor1:red divColor2:yellow size:15
theObject.material = standard diffusemap:theMap
--このオブジェクトと必要なサイズを使用してベイク機能を呼び出し
BakeDiffuseAndLightingtheObject 256
--グラウンド平面上に、マップが適用された平面オブジェクトを作成
theObject = Plane width:200 length:200 mapcoords:true
--チェック マップを作成してタイリングを 4 × 4 に設定し、オブジェクトに割り当て

theMap = checker Color1:green Color2:orange
theMap.coordinates.uTiling = theMap.coordinates.vTiling = 4
theObject.material = standard diffusemap:theMap
--このオブジェクトと必要なサイズを使用してベイク機能を呼び出し
BakeDiffuseAndLightingtheObject 256
--シーンからライトを削除してすべての選択を解除
delete theLight
max select none

結果

スクリプトを実行すると、イメージ フォルダに次の 4 つのベイク テクスチャが書き込まれ、これがビューポート内のシーン オブジェクト上に表示されます。

 

関連事項