リファレンス / 3ds Max / Pencil+ 4 リファレンス

Pencil+ 4 Render Element リファレンス

  • 3ds Max
  • MaxScript
  • Pencil+ 4
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 / NumRenderElements0-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 で初期作成し、ステート記録時に有効化するパターンを推奨。

← Pencil+ 4 リファレンス へ