Pencil+ 4 Render Element リファレンス
Pencil+ 4 リファレンス の章一覧
3ds Max 2022 / Pencil+ 4 レンダーエレメント プロパティ一覧
プロパティなどをInspectして少し加筆しました。
1. Pencil__4_LineRenderElement(RenderElement)
Pencil+ 4 ライン用レンダーエレメント。ライン描画結果を個別出力する。
クラス名の注意
classOfの戻り値はPencil__4_LineRenderElement(アンダースコア 2つ)。
コンストラクタとしてはPencil_4_LineRenderElement()(1つ)でも動作する。
共通プロパティ
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
.enabled |
Boolean | true | エレメントを有効にするか |
.filterOn |
Boolean | true | フィルターを有効にするか |
.elementName |
String | “Pencil+ 4 ライン” | エレメント名 |
.bitmap |
Bitmap / undefined | undefined | 出力パス |
ライン出力設定
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
.visibleLineEnable |
Boolean | true | 可視線を出力するか |
.hiddenLineEnable |
Boolean | true | 隠線を出力するか |
.lineBackgroundColorEnable |
Boolean | false | 背景色を有効にするか |
.lineBackgroundColor |
Color | (255, 255, 255) | 背景色 |
エッジタイプ別フィルター
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
.outlineEnable |
Boolean | true | アウトライン |
.objectEnable |
Boolean | true | オブジェクトエッジ |
.isectEnable |
Boolean | true | 交差エッジ |
.smoothEnable |
Boolean | true | スムージングエッジ |
.matidEnable |
Boolean | true | マテリアルIDエッジ |
.selEnable |
Boolean | true | 選択エッジ |
.normalEnable |
Boolean | true | 法線角エッジ |
.wireEnable |
Boolean | true | ワイヤーエッジ |
ラインセットID フィルター
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
.linesetID |
ArrayParameter (Boolean) | #(true ×8) | ラインセットID別の出力有効(8個) |
出力タイプ・Z深度
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
.outputType |
Integer | 0 | 出力タイプ(0:カラー / 1:Z深度) |
.zDepthMin |
Float | 100.0 | Z深度 最小値 |
.zDepthMax |
Float | 300.0 | Z深度 最大値 |
2. Pencil__4_MaterialRenderElement(RenderElement)
Pencil+ 4 マテリアル用レンダーエレメント。マテリアルのシェーディング結果を個別出力する。
クラス名の注意
classOfの戻り値はPencil__4_MaterialRenderElement(アンダースコア 2つ)。
コンストラクタとしてはPencil_4_MtlRenderElement()(1つ、かつ Material → Mtl 省略形)でも動作する。
共通プロパティ
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
.enabled |
Boolean | true | エレメントを有効にするか |
.filterOn |
Boolean | true | フィルターを有効にするか |
.elementName |
String | “Pencil+ 4 マテリアル” | エレメント名 |
.bitmap |
Bitmap / undefined | undefined | 出力パス |
選択フィルター
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
.selectType |
Integer | 0 | 選択タイプ(0:マテリアルID / 1:オブジェクトID) |
.matID |
Integer | 1 | マテリアルID |
.objID |
Integer | 0 | オブジェクトID |
背景色
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
.backgroundColorEnable |
Boolean | false | 背景色を有効にするか |
.backgroundColor |
Color | (255, 255, 255) | 背景色 |
カラー出力コンポーネント
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
.colorHi |
Boolean | true | ハイライト色を含む |
.colorStroke |
Boolean | true | ストローク色を含む |
.colorReflec |
Boolean | true | 反射色を含む |
.colorZoneMap |
Boolean | true | ゾーンマップ色を含む |
.colorZoneID |
ArrayParameter (Boolean) | #(true ×8) | ゾーンID別のカラー出力(8個) |
.colorZoneBG |
Boolean | true | ゾーンの形状を維持するか |
.colorZoneBGについて
デフォルトでtrueだが、ゾーンIDごとに素材を書き出したい場合にtrueだとゾーンIDを超えてゾーンポジションの影響を受けてしまうので、基本的にfalse推奨。
falseでも指定したゾーンID内のゾーンポジションは影響は受けるので、マテリアル側でしっかりコントロールしていれば大丈夫なはず。
アルファ出力コンポーネント
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
.alphaHi |
Boolean | true | ハイライトをアルファに含む |
.alphaZoneID |
ArrayParameter (Boolean) | #(true ×8) | ゾーンID別のアルファ出力(8個) |
.alphaStrokeOnly |
Boolean | false | ストロークのみアルファ出力 |
.alphaZoneMapOnly |
Boolean | false | ゾーンマップのみアルファ出力 |
除外設定
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
.exaMatidEnable |
Boolean | false | マテリアルID除外有効 |
.exaMatid |
Integer | 0 | 除外マテリアルID |
.exaObjidEnable |
Boolean | false | オブジェクトID除外有効 |
.exaObjid |
Integer | 0 | 除外オブジェクトID |
3. Render Element Manager API
レンダーエレメントの操作は maxOps.GetCurRenderElementMgr() で取得するマネージャ経由で行う。
メソッド一覧
| メソッド | 戻り値 | 説明 |
|---|---|---|
maxOps.GetCurRenderElementMgr() |
RenderElementMgr | マネージャ取得 |
mgr.NumRenderElements() |
Integer | エレメント総数 |
mgr.GetRenderElement i |
RenderElement | インデックスで取得(0-based) |
mgr.AddRenderElement re |
— | エレメントを追加 |
インデックスの注意
GetRenderElement/NumRenderElementsは 0-based(C++ 由来)。
MaxScript の配列は通常 1-based だが、この API だけ 0-based のため注意。
エレメント名による検索
マネージャにはエレメント名で検索するメソッドがないため、走査して探す必要がある。
-- elementName でレンダーエレメントのインデックスを検索
-- 戻り値: 0-based インデックス、見つからない場合は -1
fn findRenderElementByName elementName = (
local mgr = maxOps.GetCurRenderElementMgr()
for i = 0 to (mgr.NumRenderElements() - 1) do (
local re = mgr.GetRenderElement i
if re.elementName == elementName do return i
)
return -1
)
重複作成を防ぐ場合は、AddRenderElement の前にこの検索で既存チェックを行う。
レンダーダイアログの更新
スクリプトからエレメントを追加・変更した後、レンダリングダイアログに反映させるには以下を呼ぶ。
renderSceneDialog.update()
4. アクセスパス早見表
-- Render Element Manager 取得
reMgr = maxOps.GetCurRenderElementMgr()
numRE = reMgr.NumRenderElements()
-- インデックスは 0-based
for i = 0 to (numRE - 1) do (
local re = reMgr.GetRenderElement i
format " [%] % : %\n" i (classOf re) re.elementName
)
-- Pencil+ 4 Line Render Element を探す
fn findPencilLineRE = (
local mgr = maxOps.GetCurRenderElementMgr()
for i = 0 to (mgr.NumRenderElements() - 1) do (
local re = mgr.GetRenderElement i
if classOf re == Pencil__4_LineRenderElement do return re
)
undefined
)
-- Pencil+ 4 Material Render Element を探す
fn findPencilMtlRE = (
local mgr = maxOps.GetCurRenderElementMgr()
for i = 0 to (mgr.NumRenderElements() - 1) do (
local re = mgr.GetRenderElement i
if classOf re == Pencil__4_MaterialRenderElement do return re
)
undefined
)
-- Line Render Element の操作例
lineRE = findPencilLineRE()
if lineRE != undefined do (
lineRE.outlineEnable = true
lineRE.objectEnable = false -- オブジェクトエッジを除外
lineRE.linesetID[1] = true -- ラインセット1 有効
lineRE.linesetID[2] = false -- ラインセット2 無効
lineRE.lineBackgroundColorEnable = true
lineRE.lineBackgroundColor = color 0 0 0 -- 背景を黒に
)
-- Material Render Element の操作例
mtlRE = findPencilMtlRE()
if mtlRE != undefined do (
mtlRE.colorHi = false -- ハイライトをカラーから除外
mtlRE.colorZoneID[1] = true -- ゾーン1 カラー有効
mtlRE.colorZoneBG = false -- 指定ゾーンIDを超えたゾーンの形状の維持をしない
mtlRE.alphaStrokeOnly = true -- アルファはストロークのみ
mtlRE.exaMatidEnable = true -- MatID除外を有効化
mtlRE.exaMatid = 3 -- MatID 3 を除外
)
-- 特定ゾーンIDのみ有効にする(他を全て無効にする)
-- 例: ゾーンID 3 のみを有効化
for n = 1 to 8 do (
mtlRE.colorZoneID[n] = (n == 3)
)
-- Render Element の新規作成と追加
mgr = maxOps.GetCurRenderElementMgr()
-- 作成前に重複チェック
if (findRenderElementByName "Pcl4_Line_OutlineOnly") == -1 do (
local newLineRE = Pencil__4_LineRenderElement()
newLineRE.elementName = "Pcl4_Line_OutlineOnly"
newLineRE.enabled = false -- StateSet連携時は初期無効にすることが多い
newLineRE.outlineEnable = true
newLineRE.objectEnable = false
newLineRE.isectEnable = false
newLineRE.smoothEnable = false
newLineRE.matidEnable = false
newLineRE.selEnable = false
newLineRE.normalEnable = false
newLineRE.wireEnable = false
mgr.AddRenderElement newLineRE
)
-- レンダーダイアログを更新
renderSceneDialog.update()
5. 注意事項
- クラス名(Line):
classOfの戻り値はPencil__4_LineRenderElement(アンダースコア2つ)。コンストラクタはPencil_4_LineRenderElement()(1つ)でも動作する。 - クラス名(Material):
classOfの戻り値はPencil__4_MaterialRenderElement(アンダースコア2つ)。コンストラクタはPencil_4_MtlRenderElement(1つ、かつ Material → Mtl 省略形)でも動作する。 しかしPencil__4_MtlRenderElementはだめらしい… - 0-based インデックス:
maxOps.GetCurRenderElementMgr().GetRenderElementのインデックスは 0-based。MaxScript の配列は通常 1-based だが、Render Element Manager API は C++ 由来のため 0-based。 .linesetID/.colorZoneID/.alphaZoneIDは 8要素の Boolean 配列で、それぞれ ID 1〜8 に対応する。配列アクセスは 1-based(.linesetID[1]= ラインセットID 1)。- Line Render Element にはインターフェイスやメソッドは検出されなかった(プロパティのみ)。
- Pencil__4_LineRenderElementは特殊なことをしない限りデフォルト設定で問題なし。
- エレメント名の重複: マネージャに同名エレメントを追加してもエラーにはならないが、検索時に混乱するため作成前に名前ベースの既存チェックを行うことを推奨。
- StateSet連携: StateSet と連携する場合、エレメントは
.enabled = falseで初期作成し、ステート記録時に有効化するパターンを推奨。