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

Pencil+ 4 Material リファレンス

  • 3ds Max
  • MaxScript
  • Pencil+ 4
Pencil+ 4 リファレンス の章一覧

3ds Max 2022 / Pencil+ 4 マテリアル プロパティ・メソッド一覧
プロパティなどをInspectして少し加筆しました。


1. Pencil__4_Material(material)

Pencil+ 4 マテリアル本体。オブジェクトに割り当てるトップレベルマテリアル。

クラス名の注意
MaxScript上のクラス名は Pencil__4_Material(アンダースコア 2つ)。
「Pencil+ 4 Material」の + と空白がそれぞれ _ に変換されるため。

classOf $.material  -- => Pencil__4_Material

プロパティ

プロパティ デフォルト 説明
.basicMaterial Standardmaterial ベースマテリアル(Standard Legacy 等)
.shade Float 0.0 シェーディング(グラデーション位置?)
.advancedMaterial Advanced_Settings 高度な設定
.lineFunctionsMaterial Line_Related_Functions ライン関連機能
.zones ArrayParameter (Zone) 4個 ゾーン配列(1〜8ゾーン)

.basicMaterialについて

大まかな設定はbasicMaterial依存のようです。

Standard Legacyの設定を両面にすればPencil側も両面表示(両面が外れていると裏面はアルファになってしまいます。)

不透明度が0なら不透明度も0などなど

またPencilラインのエフェクトをかけている場合、マテリアル側の不透明度が0やモディファイア側でレンダリング表示をオフにしたシェイプなどオブジェクトのレンダリングはPencilラインだけ出たりします。

ハイライト設定

プロパティ デフォルト 説明
.hiColor Color (255, 255, 255) ハイライト色
.hiBlend Integer 0 ブレンドモード
.hiAlpha Float 100.0 アルファ
.hiLevel Integer 0 レベル
.hiGloss Integer 10 光沢
.hiSquash Integer 0 スカッシュ
.hiAniso Integer 0 異方性
.hiOrient Integer 0 向き
.hiSharp Integer 0 シャープネス
.hiDiff Integer 0 ディフューズ
.hiDiffRange Integer 0 ディフューズ範囲
.hiMapOpacity Float 100.0 マップ不透明度
.hiMapEnable Boolean true マップ有効
.hiMap textureMap / undefined undefined ハイライトマップ
.hiLevelMap textureMap / undefined undefined レベルマップ
.hiGlossMap textureMap / undefined undefined 光沢マップ
.hiMapChannelEnable Boolean false マップチャンネル有効
.hiMapChannel Integer 99 マップチャンネル番号

バンプ・反射

プロパティ デフォルト 説明
.bumpEnable Boolean false バンプ有効
.bumpAmount Integer 30 バンプ量
.bumpMap textureMap / undefined undefined バンプマップ
.bumpHiDisable Boolean false ハイライトへのバンプ無効化
.reflecEnable Boolean false 反射有効
.reflecAmount Integer 100 反射量
.reflecMap textureMap / undefined undefined 反射マップ

ストロークアニメーション

プロパティ デフォルト 説明
.strokeAnimationEnable Boolean false ストロークアニメーション有効
.strokeAnimationInterval Integer 1 アニメーション間隔
.strokeAnimationMotionOnly Boolean false モーションのみ
.strokeOnly Boolean false ストロークのみ描画
.strokeScale Float 100.0 ストロークスケール
.strokeRemoveHiddenSurfce Boolean false 隠面除去(※typo: Surfce

インターフェイス: Pcl4StaticInterface

メソッド 戻り値 引数 説明
openBrushSettings Boolean brush (maxObject) ブラシ設定ダイアログを開く
getLangID Integer 言語IDを取得

2. Zone(ReferenceTarget / Pencil_4_Zone)

ゾーン設定。material.zones[i] で取得。デフォルトで4ゾーン。

ゾーンの制約

項目
最小ゾーン数 1
最大ゾーン数 8
デフォルトゾーン数 4
先頭ゾーンの posMin 0.0 で強制
末尾ゾーンの posMax 100.0 で強制

プロパティ

プロパティ デフォルト例 説明
.id Integer (1〜8) 1〜4 ゾーンID
.posMin Float 0.0 / 25.0 / 50.0 / 75.0 グラデーション位置 下限 (%)
.posMax Float 25.0 / 50.0 / 75.0 / 100.0 グラデーション位置 上限 (%)
.Enable Boolean true ゾーン有効
.color Color ゾーンごとに異なる ゾーン色
.mapOpacity Float 100.0 マップ不透明度
.mapEnable Boolean true マップ有効
.ColorMap textureMap / undefined undefined カラーマップ
.blendMode Integer 0 ブレンドモード
.blendAmount Float 100.0 ブレンド量
.strokesEnable ArrayParameter (Boolean) #() ストローク有効配列
.Strokes ArrayParameter #() ストローク配列

デフォルトゾーン構成

Zone id posMin posMax color
zones[1] 1 0.0 25.0 (0, 0, 0)
zones[2] 2 25.0 50.0 (63.75, 63.75, 63.75)
zones[3] 3 50.0 75.0 (127.5, 127.5, 127.5)
zones[4] 4 75.0 100.0 (191.25, 191.25, 191.25)

ゾーンの動的操作

Pencil_4_Zone() コンストラクタで新規ゾーンを作成し、.zones 配列に対して追加・削除ができる。

ゾーンの追加

-- 空のゾーンを新規作成
local newZone = Pencil_4_Zone()
newZone.posMin = 100.0
newZone.posMax = 100.0
newZone.color = color 0 0 0
newZone.colorMap = undefined
newZone.id = 5

-- マテリアルのゾーン配列の末尾に追加(copyで独立コピーとして追加)
append pencilMat.zones (copy newZone)

ゾーンの削減

残したいゾーンだけを集めた配列を .zones に直接代入する。

-- ゾーンを3つに減らす(先頭3つを残す)
local newZones = #()
for i = 1 to 3 do
    append newZones pencilMat.zones[i]
pencilMat.zones = newZones

3. Advanced_Settings(material)

高度な設定。material.advancedMaterial で取得。

グラデーションオフセット

プロパティ デフォルト 説明
.gradOffsetEnable Boolean false グラデーションオフセット有効
.gradOffsetAmount Integer 100 オフセット量
.gradOffsetMap textureMap / undefined undefined オフセットマップ
.gradOffsetMapOffset Float -0.5 マップオフセット値

シャドウブレンド

プロパティ デフォルト 説明
.sblendEnable Boolean false シャドウブレンド有効
.sblendColor Color (0, 0, 0) ブレンド色
.sblendMapOpacity Float 100.0 マップ不透明度
.sblendMapEnable Boolean false マップ有効
.sblendMap textureMap / undefined undefined ブレンドマップ
.sblendMode Integer 0 ブレンドモード
.sblendAmount Float 100.0 ブレンド量

ライトカラー

プロパティ デフォルト 説明
.lightColEnable Boolean false ライトカラー有効
.lightColBlend Integer 0 ブレンドモード
.lightcolAmount Float 100.0 量(※小文字 col
.lightcolZoneIDs ArrayParameter (Boolean) #(true ×8) 対象ゾーンID (8個)
.lightColRelpaceEnable Boolean false 置換有効(※typo: Relpace
.lightColRelpaceColor Color (0, 0, 0) 置換色(※typo: Relpace
.lightColReplaceAmount Float 100.0 置換量

ハイライトデザイン

プロパティ デフォルト 説明
.hiDesignEnable Boolean false ハイライトデザイン有効
.hiDesignAmount Float 100.0
.hiDesignAngle Float 0.0 角度

ゾーンアンチエイリアシング

プロパティ デフォルト 説明
.zoneAntiIntensity Float 100.0 アンチエイリアシング強度
.zoneAntiEnable Boolean true アンチエイリアシング有効

特定ライト

プロパティ デフォルト 説明
.specificLightsEnable Boolean false 特定ライト有効
.specificLights ArrayParameter (Node) #() 対象ライト配列
.specificLightsStrength ArrayParameter (Float) #() ライト強度配列

特定透過

プロパティ デフォルト 説明
.specificTranspEnable Boolean false 特定透過有効
.specificTranspMaterials ArrayParameter (material) #() 透過マテリアル配列
.specificTranspMaterialsValue ArrayParameter (Float) #() 透過値配列
.specificTranspMapEnable Boolean false 透過マップ有効
.specificTranspMap textureMap / undefined undefined 透過マップ
.specificTranspMapAmount Float 100.0 透過マップ量

特定透過の配列操作

specificTranspMaterialsspecificTranspMaterialsValueインデックスが1:1で対応するペア配列。操作時は両方を同時に変更しないとペアが崩れる。

操作の基本方針は「残すものだけ新配列に収集 → ペアで一括代入」。同じループの同じ分岐で append するため、長さとインデックスの対応が構造的に保証される。

削除(名前にマッチするマテリアルを除去)
local adv = pencilMat.advancedMaterial
if not adv.specificTranspEnable do return false

local oldMats = adv.specificTranspMaterials
local oldVals = adv.specificTranspMaterialsValue

local newMats = #()
local newVals = #()

for k = 1 to oldMats.count do
(
    if oldMats[k] != undefined and
       matchPattern oldMats[k].name pattern:"*target_name*" then
    (
        -- 除去対象 → スキップ
        format "Removed: %\n" oldMats[k].name
    )
    else
    (
        -- 残す
        append newMats oldMats[k]
        append newVals oldVals[k]
    )
)

-- ペアで一括代入(常に同じ長さが保証される)
adv.specificTranspMaterials      = newMats
adv.specificTranspMaterialsValue = newVals
追加(マテリアルと透過値のペアを追加)
local adv = pencilMat.advancedMaterial

local mats = adv.specificTranspMaterials
local vals = adv.specificTranspMaterialsValue

-- ペアで追加
append mats someMaterial   -- 追加するマテリアル参照
append vals 100.0          -- 対応する透過値

-- ペアで一括代入
adv.specificTranspMaterials      = mats
adv.specificTranspMaterialsValue = vals

-- 特定透過を有効化(まだ無効の場合)
adv.specificTranspEnable = true

注意点

  • 各要素 mats[k] はマテリアルへの参照であり、.name でマテリアル名を取得可能。
  • 追加・削除いずれの場合も matsvals を必ずペアで操作・代入すること。

TKPolygonCtrl(内部カーブ)

Advanced_Settings 内の無名プロパティ . で参照される内部カーブコントローラ。ハイライトデザインのポリゴン形状制御に使用。

プロパティ デフォルト 説明
.polyNodeAngle ArrayParameter (Float) 6点(0〜-2π) ノード角度(ラジアン)
.polyNodeRadius ArrayParameter (Float) #(1.0 ×6) ノード半径
.polyNodeTYPE ArrayParameter (Integer) #(0 ×6) ノードタイプ
.polyHandle0 ArrayParameter (Point3) #([0,0,0] ×6) ハンドル0
.polyHandle1 ArrayParameter (Point3) #([0,0,0] ×6) ハンドル1
.polyNodeResetNum Integer 6 リセット時のノード数

ライン関連機能。material.lineFunctionsMaterial で取得。

エッジ制御

プロパティ デフォルト 説明
.isectDisable Boolean false 交差線無効化
.maskingDisable Boolean false マスキング無効化
.maskingOffTargetsEnable Boolean false マスキングオフ対象有効
.maskHiddenLinesTargetsEnable Boolean false 隠線マスク対象有効

ライン色置換(エッジタイプ別)

各エッジタイプに対し Enable / Color / Amount の3プロパティセット。

エッジタイプ Enable Color Amount
Outline .replaceEnableOutline .replaceColorOutline .replaceAmountOutline
Object .replaceEnableObject .replaceColorObject .replaceAmountObject
Intersection .replaceEnableIsect .replaceColorISect .replaceAmountISect
Smoothing .replaceEnableSmooth .replaceColorSmooth .replaceAmountSmooth
Material ID .replaceEnableMatid .replaceColorMatid .replaceAmountMatid
Selected Edge .replaceEnableSel .replaceColorSel .replaceAmountSel
Normal Angle .replaceEnableNormal .replaceColorNormal .replaceAmountNormal
Wire .replaceEnableWire .replaceColorWire .replaceAmountWire

デフォルト: 全 Enable = false、全 Color = (0,0,0)、全 Amount = 100.0

マスキング対象

プロパティ デフォルト 説明
.maskingOffObjects ArrayParameter (Node) #() マスキングオフ対象オブジェクト
.maskingOffMtls ArrayParameter #() マスキングオフ対象マテリアル
.maskHiddenLinesObjects ArrayParameter (Node) #() 隠線マスク対象オブジェクト
.maskHiddenLinesMtls ArrayParameter #() 隠線マスク対象マテリアル

5. マテリアル階層の走査パターン

実際のプロダクションでは、Pencil+ 4 マテリアルは Shell_Material や Multi/Sub-Object マテリアルの下にネストされていることが多い。スクリプトから Pencil+ 4 マテリアルにアクセスするには、親マテリアルの種類に応じて再帰的に走査する必要がある。

対応すべき親マテリアルの種類

親マテリアル クラス名 子マテリアルへのアクセス
Shell マテリアル Shell_Material .originalMaterial(レンダリング用)、.bakedMaterial(ビューポート用)
Multi/Sub-Object Multimaterial .materialIDList でID一覧 → mat[id] で各サブマテリアル
両面マテリアル doubleSided .material1(表面)、.material2(裏面)

走査コード例

-- マテリアルを再帰的に走査して Pencil__4_Material を処理する
fn processPencilMaterials mat callback =
(
    local matClass = classOf mat
    
    if matClass == Pencil__4_Material then
    (
        -- Pencil+4マテリアルに到達 → コールバックで処理
        callback mat
    )
    else if matClass == Shell_Material then
    (
        -- Shell: レンダリング用とビューポート用の両方を走査
        if mat.originalMaterial != undefined then
            processPencilMaterials mat.originalMaterial callback
        if mat.bakedMaterial != undefined then
            processPencilMaterials mat.bakedMaterial callback
    )
    else if matClass == Multimaterial then
    (
        -- Multi/Sub: 全サブマテリアルを走査
        local idList = mat.materialIDList
        for i = 1 to idList.count do
        (
            if mat[idList[i]] != undefined then
                processPencilMaterials mat[idList[i]] callback
        )
    )
    else if matClass == doubleSided then
    (
        -- 両面: 表面と裏面を走査
        if mat.material1 != undefined then
            processPencilMaterials mat.material1 callback
        if mat.material2 != undefined then
            processPencilMaterials mat.material2 callback
    )
)

-- 使用例: 全ゾーンの色を赤に変更
processPencilMaterials $.material (fn callback pencilMat = (
    for i = 1 to pencilMat.zones.count do
        pencilMat.zones[i].color = color 255 0 0
))

注意点

  • Shell_Material は .originalMaterial.bakedMaterial両方 にPencilマテリアルが入っている場合がある。片方だけ処理すると表示と描画で不一致が生じる。
  • Multimaterial のサブマテリアルは mat[idList[i]] でアクセスする。mat[i] だとインデックスとIDの不一致でスキップが発生する。
  • これらの親マテリアルは入れ子になり得る(例: Multi/Sub → Shell → 両面 → Pencil+4)。

6. アクセスパス早見表

-- Pencil+ 4 Material を取得
mat = $.material  -- 選択オブジェクトから(直接割り当ての場合)
-- または
mat = meditmaterials[1]  -- マテリアルエディタから

-- ベースマテリアル
mat.basicMaterial               -- Standardmaterial (Legacy)
mat.basicMaterial.Diffuse       -- ディフューズ色

-- ゾーン
mat.zones.count                 -- ゾーン数(デフォルト4、最大8)
mat.zones[1].color              -- ゾーン1のカラー
mat.zones[1].posMin             -- グラデーション位置 下限
mat.zones[1].posMax             -- グラデーション位置 上限
mat.zones[1].ColorMap           -- カラーマップ

-- ゾーンの動的操作
local z = Pencil_4_Zone()       -- 新規ゾーン作成
append mat.zones (copy z)       -- ゾーン追加
mat.zones = #(mat.zones[1], mat.zones[2])  -- ゾーン2つに縮小

-- ハイライト
mat.hiColor                     -- (color 255 255 255)
mat.hiLevel                     -- 0
mat.hiGloss                     -- 10

-- バンプ・反射
mat.bumpEnable                  -- false
mat.bumpMap                     -- undefined
mat.reflecEnable                -- false
mat.reflecMap                   -- undefined

-- 高度な設定
adv = mat.advancedMaterial
adv.gradOffsetEnable            -- グラデーションオフセット
adv.sblendEnable                -- シャドウブレンド
adv.lightColEnable              -- ライトカラー
adv.specificLightsEnable        -- 特定ライト
adv.specificLights              -- ライト配列
adv.specificTranspEnable        -- 特定透過
adv.specificTranspMaterials     -- 透過マテリアル配列(ペア配列、後述)
adv.specificTranspMaterialsValue -- 透過値配列(ペア配列)

-- ライン関連機能
lf = mat.lineFunctionsMaterial
lf.isectDisable                 -- 交差線無効化
lf.replaceEnableOutline         -- アウトライン色置換
lf.replaceColorOutline          -- 置換色
lf.maskingOffObjects            -- マスキングオフ対象

-- ストローク
mat.strokeAnimationEnable       -- false
mat.strokeOnly                  -- false
mat.strokeScale                 -- 100.0

7. 注意事項

  • クラス名: Pencil__4_Material(アンダースコア2つ)が正式名。Pencil++ と空白がそれぞれ _ に変換される。classOf での比較時に注意。
  • .strokeRemoveHiddenSurfce は Pencil+ 4 側のtypo(SurfaceSurfce)。スクリプトでもそのまま使用する。
  • .lightColRelpaceEnable / .lightColRelpaceColor も同様にtypo(ReplaceRelpace)。
  • Zone.strokesEnableZone.Strokes はデフォルト空配列。ストロークをゾーンに割り当てると要素が増える。
  • basicMaterial には Standard (Legacy) 以外のマテリアルも割り当て可能(Physical Material 等)。ダンプの Standardmaterial プロパティは basicMaterial の種類に依存する。
  • ゾーンの制約: 最小1ゾーン、最大8ゾーン。先頭ゾーンの posMin は 0.0、末尾ゾーンの posMax は 100.0 で強制される。
  • 特定透過のペア配列: specificTranspMaterialsspecificTranspMaterialsValue はインデックス1:1対応。片方だけ操作するとペアが崩れるため、常にセットで操作すること。
  • マテリアル階層: 実プロダクションでは Shell_Material / Multimaterial / doubleSided の下にネストされることが多い。再帰走査パターン(セクション5参照)の実装が必要。

← Pencil+ 4 リファレンス へ