パッチは、すべてのパッチ オブジェクトの一般的な編集可能バージョンで、編集可能メッシュのジオメトリ オブジェクトに対する関係と似ています。パッチは、編集モディファイヤを適用するとパッチ オブジェクトに変換され、またパッチ基本オブジェクトのモディファイヤ スタックを集約すると、結果はパッチ オブジェクトになります。MAXScript ではパッチを構築することはできますが、パッチ オブジェクト内のサブオブジェクト(頂点、エッジ、およびパッチ)にアクセスしたり、これらのサブオブジェクトを修正するプロパティやメソッドはありません。
コンストラクタ
Quadpatch...
Tripatch...
パッチ シーン オブジェクトをゼロから作成するために、パッチ コンストラクタ関数を呼び出すことができます。
例
Quadpatch pos:[10,10,10] name:"foo"
これにより、空のパッチが作成されます。
convertTo <node> Editable_Patch -- mapped
これは与えられたシーン ノードをパッチ オブジェクトに変換します。オブジェクトを変換できない(通常はジオメトリ オブジェクトでない)場合、この関数は undefined
を返します。存在するモディファイヤはすべて集約されます。collapseStack()
関数も、3ds Max の[モディファイヤ スタック](modifier stack)ダイアログ ボックスにおける[集約] (collapse)ボタンと同じ用途で使用できます。いずれもパッチを生成しますが、これは少なくとも 1 つのモディファイヤが存在するときに限られます。
プロパティ
コントロール頂点とその接線は、コントローラがコントロール頂点に割り当てられた後で、プロパティとして使用できます。コントロール頂点の接線の数は、コントロール頂点に関連するエッジの数になります。コントローラは MAXScript を使用するコントロール頂点には割り当てることができません。TriPatch オブジェクトが Editable_Patch に集約され、コントロール頂点のいくつかがアニメートされている場合、コントロール頂点と接線のプロパティは次のようになります。
$TriPatch01.Vertex_1 Point3value:[-21.5,-6.4,0] -- animatable
$TriPatch01.Vertex_1_Vector_1 Point3value:[-21.5,-2.1,0] -- animatable
$TriPatch01.Vertex_1_Vector_2 Point3value:[-7.1,-6.4,0 ]-- animatable
$TriPatch01.Vertex_2 Point3value:[21.5,-6.4,0] -- animatable
$TriPatch01.Vertex_2_Vector_1 Point3value:[7.1,-6.4,0] -- animatable
$TriPatch01.Vertex_2_Vector_2 Point3value:[7.1,-2.1,0] -- animatable
パッチ頂点と接線へのアクセスについては「クラスとオブジェクトの調査関数」を参照してください。頂点および接線ハンドラに割り当てられたコントローラ値はオブジェクト空間内にあります。ワールド空間からオブジェクト空間への変換については、「ノード変換プロパティの使い方」を参照してください。
メソッド
getPatchSteps <editable_patch_node>
パッチが使用するビューポートのステップ数を返し、[ステップを表示](View Steps)スピナーを[修正] (Modify)パネルに反映します。
setPatchSteps <editable_patch_node> <integer>
編集可能なパッチ オブジェクトによって使用される[ステップを表示](View Steps)の数を指定された値に設定します。
スクリプトで[編集可能パッチ](Editable Patch)、[編集メッシュの修正](Edit Mesh Modify)パネル モードと操作を呼び出すために、一連のメソッドが用意されています。これらはさまざまなサブオブジェクト レベルで使用できるボタンに対応しています。これらのメソッドは、patchOps
グローバル構造体内にあります。[修正] (Modify)パネルにあるボタンを押して操作することができます。これらのメソッドを使用するには、ノードを選択して[修正] (Modify)パネルを開かなければなりません。最初の引数 <editable_patch_node_or_modifier>
は、モディファイヤ スタック レベルが基本オブジェクトに位置するパッチを編集可能パッチ ノード、またはモディファイヤ スタック レベルが編集パッチに位置する編集パッチ モディファイヤとして解釈されます。以下のメソッドは、現在のサブオブジェクト レベルがメソッドの呼び出しに適切なレベルである場合に有効です。
次のメソッドは、現在選択されているサブオブジェクトに対して、[編集可能パッチの修正](Editable Patch Modify)パネル内にある「ユーザ相互作用」ボタンの操作を呼び出します。これらのメソッドは、[ジオメトリ] (Geometry)ロールアウト内の対応するボタンをハイライトして操作を開始します。ここで、ユーザはインタラクティブに操作を実行します。メソッドは、操作の開始からユーザの操作完了までの間に返されるため、使用するスクリプトが操作の妨げにならないようにする必要があります。これらのメソッドを呼び出すことは、[修正] (Modify)パネルの関連するボタンをクリックすることと同じです。ユーザのアクションまたは MAXScript コマンドにより操作がすでに実行されている場合にメソッドを呼び出すと、操作が中止され、ボタンのハイライトが消えます。
patchOps.startAttach <editable_patch_node_or_modifier>
[アタッチ] (Attach)コマンド モードに入ります。これは、すべてのサブオブジェクト レベルで、サブオブジェクト モード以外のときに有効です。
patchOps.startBevel <editable_patch_node_or_modifier>
[ベベル] (Bevel)コマンド モードに入ります。パッチ サブオブジェクト レベルで有効です。
patchOps.startBind <editable_patch_node_or_modifier>
[バインド] (Bind)コマンド モードに入ります。これは、頂点サブオブジェクト レベルで有効です。
patchOps.startCreate <editable_patch_node_or_modifier>
[作成] (Create)コマンド モードになります。頂点、パッチ、要素のサブオブジェクト レベルで有効です。
patchOps.startExtrude <editable_patch_node_or_modifier>
[押し出し] (Extrude)コマンド モードに入ります。パッチ サブオブジェクト レベルで有効です。
patchOps.startFlipNormalMode <editable_patch_node_or_modifier>
[法線を反転](Flip Normal)コマンド モードになります。パッチと要素のサブオブジェクト レベルで有効です。
patchOps.startWeldTarget <editable_patch_node_or_modifier>
[ターゲットの連結](Weld Target)コマンド モードになります。頂点サブオブジェクト レベルで有効です。
次のメソッドは、現在選択されているサブオブジェクトに対して、[編集可能パッチの修正](Editable Patch Modify)パネルにある[即時] (instantaneous)ボタン操作を呼び出します。
patchOps.addTri <editable_patch_node_or_modifier>
TriPatch を選択したエッジに追加します。エッジ サブオブジェクト レベルで有効です。
patchOps.addQuad <editable_patch_node_or_modifier>
QuadPatch を選択したエッジに追加します。エッジ サブオブジェクト レベルで有効です。
patchOps.break <editable_patch_node_or_modifier>
選択されているサブオブジェクトにアタッチするパッチに対して、それぞれ 1 つの新しい頂点を作成します。頂点およびエッジ サブオブジェクト レベルで有効です。
patchOps.clearAllSG <editable_patch_node_or_modifier>
現在選択されているパッチのスムーズ グループをクリアします。面、ポリゴン、要素のサブオブジェクト レベルで有効です。
patchOps.createShapeFromEdges <editable_patch_node_or_modifier>
[シェイプを作成](Create Shape)ダイアログ ボックスを表示し、選択されたエッジから作成するシェイプにオブジェクト名を指定できます。これは、エッジ サブオブジェクト レベルで有効です。
patchOps.delete <editable_patch_node_or_modifier>
選択したサブオブジェクトを削除します。これは、すべてのサブオブジェクト レベルで有効です。
patchOps.detach <editable_patch_node_or_modifier>
ユーザがオブジェクト名を指定できる[デタッチ] (Detach)ダイアログ ボックスを表示します。これは、パッチ サブオブジェクト レベルで有効です。
patchOps.flipNormal <editable_patch_node_or_modifier>
選択されているパッチの法線を反転します。パッチと要素のサブオブジェクト レベルで有効です。
patchOps.hide <editable_patch_node_or_modifier>
選択したサブオブジェクトを非表示にします。これは、すべてのサブオブジェクト レベルで有効です。
patchOps.selectByID <editable_patch_node_or_modifier>
[マテリアル ID による選択](Select By Material ID)ダイアログ ボックスを表示して、指定したマテリアル ID を持つパッチを選択します。- パッチと要素のサブオブジェクト レベルで有効です。
patchOps.selectBySG <editable_patch_node_or_modifier>
[スムーズ グループによる選択](Select By Smooth Groups)を表示して、指定したスムーズ グループ ID を持つパッチを選択します。パッチと要素のサブオブジェクト レベルで有効です。
patchOps.selectOpenEdges <editable_patch_node_or_modifier>
1 つのパッチしかないエッジをすべて選択します。これは、エッジ サブオブジェクト レベルで有効です。
patchOps.subdivide <editable_patch_node_or_modifier>
選択したサブオブジェクトを分割します。これは、エッジとパッチのサブオブジェクト レベルで有効です。
patchOps.unbind <editable_patch_node_or_modifier>
選択した頂点のバインドを解除します。これは、頂点サブオブジェクト レベルで有効です。
patchOps.unifyNormal <editable_patch_node_or_modifier>
選択したパッチの法線を統一します。これは、パッチと要素のサブオブジェクト レベルで有効です。
patchOps.unhideAll <editable_patch_node_or_modifier>
非表示のサブオブジェクトをすべて再表示します。これは、すべてのサブオブジェクト レベルで、サブオブジェクト モード以外のときに有効です。
patchOps.weld <editable_patch_node_or_modifier>
選択した頂点を結合します。これは、頂点サブオブジェクト レベルで有効です。
3ds Max 6 以降 では、次のメソッドが使用できます。
patchOps.growSelection <editable_patch_node_or_modifier>
選択を広げます。ハンドル以外のすべてのサブオブジェクト レベルで有効です。
patchOps.shrinkSelection <editable_patch_node_or_modifier>
選択を縮小します。ハンドル以外のすべてのサブオブジェクト レベルで有効です。
patchOps.selectEdgeRing <editable_patch_node_or_modifier>
エッジのリングを選択します。エッジ サブオブジェクト レベルで有効です。
patchOps.selectEdgeLoop <editable_patch_node_or_modifier>
エッジのループを選択します。エッジ サブオブジェクト レベルで有効です。
patchOps.patchSmooth <editable_patch_node_or_modifier>
ハンドルを平均化することでパッチをスムージングします。
patchOps.toggleShadedFaces <editable_patch_node_or_modifier>
シェーディング面を切り替えます。
パッチ オブジェクトを作成、変更、およびアクセスするための多くの関数を含む patch
構造体もあります。
以下の関数は、パッチのタイプを取得するときに使います。
patch.getPatchType < patch_object >
#triPatch
、#quadPatch
、#undefPatch
、または 'undefined'
を返します。#undefPatch
の値は、サードパーティが定義したパッチ オブジェクトによって返されることもあります。「undefined」の値は、内部パッチ タイプが定義済みの値リストにない場合に返されます。
keep:true
を setNumXXX
関数に設定し、関数が既存の vertex/vector/patch/edge データを保持するようにします。この値の既定値は false で、ジオメトリを空にします。
patch.getNumVerts <obj>
頂点の数を整数値で返します。
patch.setNumVerts <obj> <num> [keep:<boolean>]
頂点の数を整数値に設定します。
patch.getNumVecs <obj>
ベクトルの数を整数値で返します。
patch.setNumVecs <obj> <num> [keep:<boolean>]
ベクトルの数を整数値に設定します。
patch.getNumPatches <obj>
パッチの数を整数値で返します。
patch.setNumPatches <obj> <num> [keep:<boolean>]
パッチの数を整数値に設定します。
patch.getNumEdges <obj>
エッジの数を整数値で返します。
patch.setNumEdges <obj> <num> [keep:<boolean>]
エッジの数を整数値に設定します。
頂点とベクトル座標は、MAXScript の現在の作業座標コンテキスト内で解釈されます。他の MAXScript と同様に、頂点、パッチ、ベクトル、エッジのインデックスは、すべて 1 から始まります。
patch.getVert <obj> <index>
インデックスで指定された頂点を Point3 値として返します。
patch.setVert <obj> <index> <point3>
インデックスで指定された頂点を Point3 値に設定します。
patch.getVec <obj> <index>
インデックスで指定されたベクトルを Point3 値として返します。
patch.setVec <obj> <index> <point3>
インデックスで指定されたベクトルを Point3 型の値に設定します。
patch.makeQuadPatch <obj> <index> <va> <vab> <vba> <vb> <vbc> <vcb> <vc> <vcd> <vdc> <vd> <vda> <vad> <i1> <i2> <i3> <i4> <sm>
ここで、
patch.makeTriPatch <obj> <index> <va> <vab> <vba> <vb> <vbc> <vcb> <vc> <vca> <vac> <i1> <i2> <i3> <sm>
ここで、
patch.update <obj>
次の関数は、ジオメトリとトポロジのキャッシュをすべて再構築し、変更通知を送信し、画面再描画要求のフラグを設定します。これらは強制的に実行されます。
パス オブジェクトに変更を加えてからスクリプトを終了するまでに、この関数を呼び出す必要があります。この関数を呼び出さない場合は、MAX に無効なパッチが渡され、クラッシュが発生する可能性があります。patch.update()
関数の機能と目的は、メッシュ オブジェクト スクリプトの update()
関数と似ています。
これらの関数は、要求されたサブオブジェクトのインデックスまたはインデックス配列を返します。たとえば、getVertVecs()
は、指定された頂点から出るベクトルの配列を返します。
patch.getVertVecs <obj> <index> -> integer_array
patch.getVertPatches <obj> <index> -> integer_array
patch.getVertEdges <obj> <index> -> integer_array
patch.getVecVert <obj> <index> -> integer
patch.getVecPatches <obj> <index> -> integer_array
patch.getEdgeVert1 <obj> <index> -> integer
patch.getEdgeVert2 <obj> <index> -> integer
patch.getEdgeVec12 <obj> <index> -> integer
patch.getEdgeVec21 <obj> <index> -> integer
patch.setNumMaps <obj> <num> [keep:<boolean>]
patch.getNumMaps <obj> -> integer
patch.setMapSupport <obj> <map_chan> [init:<boolean>]
patch.getMapSupport <obj> <map_chan> -> boolean
patch.maxMapChannels <obj>
patch.setNumMapVerts <obj> <map_chan> <num> [keep:<boolean>]
patch.getNumMapVerts <obj> <map_index>
patch.setNumMapPatches <obj> <map_chan> <num> [keep:<boolean>]
patch.getMapVert <obj> <map_chan> <index>
patch.setMapVert <obj> <map_chan> <index> <point3>
patch.getMapPatch <obj> <map_chan> <index>
patch.setMapPatch <obj> <map_chan> <index> <index_array>
patch.getPatchMtlID <obj> <index> -> integer
patch.setPatchMtlID <obj> <patch_index> <mtl_id>
patch.getPatchMtlID
によって返されるマテリアル ID 値、および patch.setPatchMtlID
によって設定されるマテリアル ID 値は、1 から始まるようになっています。3ds Max 4 では、マテリアル ID 値の基数は 0 でした。patch.setMeshSteps <obj> <steps>
patch.getMeshSteps <obj>
patch.setMeshStepsRender <obj> <steps>
patch.getMeshStepsRender <obj>
patch.setShowInterior <obj> <boolean>
patch.getShowInterior <obj>
patch.setAdaptive <obj> <boolean>
patch.getAdaptive <obj>
patch.getEdges <obj> <v1> [<v2>] -> integer_array
patch.getPatches <obj> <v1> [<v2>] -> integer_array
patch.getVectors <obj> <vert> -> integer_array
patch.transform <obj> <matrix3>
この変換は、オブジェクトのローカル スペースで発生します。
patch.weldVerts <obj> <threshold> <weldIdentical_bool> <startVert>
patch.weld2Verts <obj> <v1> <v2>
patch.weldEdges <obj>
patch.deletePatchParts <obj> <del_vert_bitarray> <del_patches_bitarray>
patch.clonePatchParts <obj> <patch_bit_array>
patch.subdivideEdges <obj> <propogate>
patch.subdividePatches <obj> <propogate>
patch.addTriPatch <obj>
patch.addQuadPatch <obj>
patch.patchNormal <obj> <patch>
patch.edgeNormal <obj> <edge>
patch.updatePatchNormals <obj>
patch.flipPatchNormal <obj> <patch>
patch.unifyNormals <obj>
patch.autoSmooth <obj> <angle> <useSel_bool> <preventIndirectSmoothing_bool>
法線ベクトルは、MAXScript の現在の作業座標コンテキスト内で解釈されます。
patch.changeVertType <obj> <vert> #corner|#coplanar patch.getVertType <obj> <vert> -> #corner or #coplanar
patch.changePatchInteriorType <obj> <patch> #automatic|#manual patch.getPatchInteriorType <obj> <patch> -> #automatic or #manual
patch.getMesh <obj> -> mesh value
patch.interpTriPatch <obj> <patch> <u> <v> <w> -> point3
patch.interpQuadPatch <obj> <patch> <u> <v> -> point3
三角形パッチ補間は、重心座標として u,v,w をとります。四角形パッチは、パラメータとして u と c をとります。これらの関数が返したポイントは、現在の MAXScript 作業座標コンテキストで解釈されます。