パッチ関数パッケージには、パッチ オブジェクトの作成、修正、およびアクセスに使用するさまざまな関数が含まれます。このパッケージは、3ds Max 4 で導入されました。MAXScript のサブオブジェクト選択システムも、パッチ オブジェクトに対応できるように拡張されています。
MAX の編集可能パッチ オブジェクトは、MAXScript では「Patch」と呼ばれていました。このバージョンでは、Editable_Mesh および Editable_Poly の名前に合わせて「Editable_Patch」という名前に変更され、新しいパッチ関数パッケージに「patch」と付けることができるようになりました。
MAXScript サブオブジェクト選択システムは、編集可能パッチ オブジェクトを操作できるように拡張されています。つまり、MAXScript の VertexSelection、FaceSelection、EdgeSelection のプロパティと操作を利用して、パッチ オブジェクトを操作できます。このシステムの「面」サブオブジェクト選択は、パッチに適用されるときの「パッチ」サブオブジェクト レベルに相当します。
パッチ関数。このパッケージのすべての関数は、編集可能パッチ オブジェクトを含むシーン ノードを受け取るか、編集可能パッチ基本オブジェクトを最初の引数として受け取ります。QuadPatch と TriPatch オブジェクトは、適用可能なパッチ関数の編集可能パッチに変換する必要があります。たとえば、convertTo
$foo Editable_Patch を使うときに、この変換が必要です。
パッチ オブジェクトを初めから作成するには、Editable_Patch シーン オブジェクトを作成して空のパッチ オブジェクトをまず作成し、ジオメトリおよびトポロジ作成関数を使ってその下にパッチを作成します。次に、patch.update
() 関数を使って、作図を完成します。
patch.update
() 関数を呼び出すまでは有効になりません。この方法を利用すると、効果的に作図を行うことができますが、.update
を呼び出す前に、変更中のコードが含まれるスクリプトを終了すると、パッチが不安定な状態になり、MAX がクラッシュする可能性があります。関数 :
以下の関数は、パッチのジオメトリ全体を取得および設定するときに使われます。これらの関数で既存の頂点、ベクトル、パッチ、エッジのデータを保持するには、setNumXXX 関数に keep:true
を指定します。既定値は false で、ジオメトリを空にします。
これらの関数の多くは、MAX SDK クラスの PatchMesh 上で、同じ名前のメソッドを直接呼び出します。詳細については、SDK ヘルプ ファイルの「Working with Patches」と、主なパッチ システム クラスのマニュアルを参照してください。
<integer> patch.getNumVerts <obj>
patch.setNumVerts <obj> <num> [keep:<boolean>]
<integer> patch.getNumVecs <obj>
patch.setNumVecs <obj> <num> [keep:<boolean>]
<integer> patch.getNumPatches <obj>
patch.setNumPatches <obj> <num> [keep:<boolean>]
<integer> patch.getNumEdges <obj>
patch.setNumEdges <obj> <num> [keep:<boolean>]
以下の関数は、頂点とベクトル ハンドルの位置を個別に取得および設定します。頂点とベクトル座標は、MAXScript の現在の作業座標コンテキスト内で解釈されます。
他の MAXScript と同様に、頂点、パッチ、ベクトル、エッジのインデックスは、すべて 1 から始まります。
<point3> patch.getVert <obj> <index>
patch.setVert <obj> <index> <point3>
<point3> patch.getVec <obj> <index>
patch.setVec <obj> <index> <point3>
パッチ メッシュ内にパッチを個別に作成するときは、次の 2 つの関数を主に使います。
patch.makeQuadPatch <obj> <index> <va> <vab> <vba> <vb> <vbc> <vcb> <vc> <vcd> <vdc> <vd> <vda> <vad> <i1> <i2> <i3> <i4> <sm>
ここで、
index
= 作成するパッチのインデックス(0> = インデックス < numPatches)。va
= 最初の頂点。vab
= ベクトル ab。vba
= ベクトル ba。vb
= 2 番目の頂点。vbc
= ベクトル bc。vcb
= ベクトル cb。vc
= 3 番目の頂点。vcd
= ベクトル cd。vdc
= ベクトル dc。vd
= 4 番目の頂点。vda
= ベクトル da。vad
= ベクトル ad。i1
= 内部 1。i2
= 内部 2。i3
= 内部 3。i4
= 内部 4。sm
= スムージング グループ マスクpatch.makeTriPatch <obj> <index> <va> <vab> <vba> <vb> <vbc> <vcb> <vc> <vca> <vac> <i1> <i2> <i3> <sm>
引数の意味:
va
= 最初の頂点。vab
= ベクトル ab。vba
= ベクトル ba。vb
= 2 番目の頂点。vbc
= ベクトル bc。vcb
= ベクトル cb。vc
= 3 番目の頂点。vca
= ベクトルca。vac
= ベクトル ac。i1
= 内部 1。i2
= 内部 2。i3
= 内部 3。sm
= スムージング グループ マスク次の関数は、ジオメトリとトポロジのキャッシュをすべて再構築し、変更通知を送信し、画面再描画要求のフラグを設定します。これらは強制的に実行されます。
パス オブジェクトに変更を加えたら、スクリプトを終了する前に、この関数を呼び出す必要があります。この関数を呼び出さない場合は、MAX に無効なパッチが渡され、クラッシュが発生する可能性があります。patch.update
() 関数は、メッシュ オブジェクト スクリプトの update()関数と似ています。
patch.update <obj>
次の関数を使って、既存のパッチ オブジェクトのトポロジにアクセスできます。これらの関数は、要求されたサブオブジェクトのインデックスまたはインデックス配列を返します。
getVertVecs()
は、指定された頂点から出るベクトルの配列を返します。
<integer_array> patch.getVertVecs <obj> <index>
<integer_array> patch.getVertPatches <obj> <index>
<integer_array> patch.getVertEdges <obj> <index>
<integer> patch.getVecVert <obj> <index>
<integer_array> patch.getVecPatches <obj> <index>
<integer> patch.getEdgeVert1 <obj> <index>
<integer> patch.getEdgeVert2 <obj> <index>
<integer> patch.getEdgeVec12 <obj> <index>
<integer> patch.getEdgeVec21 <obj> <index>
次の関数は、パッチ オブジェクトのテクスチャ マップ情報を取得および操作します。
<integer> patch.getNumMaps <obj>
patch.setNumMaps <obj> <num> [keep:<boolean>]
<boolean> patch.getMapSupport <obj> <map_chan>
patch.setMapSupport <obj> <map_chan> [init:<boolean>]
<integer> patch.getNumMapVerts <obj> <map_index>
patch.setNumMapVerts <obj> <map_chan> <num> [keep:<boolean>]
<point3> patch.getMapVert <obj> <map_chan> <index>
patch.setMapVert <obj> <map_chan> <index> <point3>
<index_array> patch.getMapPatch <obj> <map_chan> <index>
patch.setMapPatch <obj> <map_chan> <index> <index_array>
patch.maxMapChannels <obj>
patch.setNumMapPatches <obj> <map_chan> <num> [keep:<boolean>]
次の関数は、パッチ オブジェクト全体または各パッチ オブジェクトのマテリアル ID を取得および設定します。
<integer> patch.getMtlID <obj>
patch.setMtlID <obj> <mtl_id>
<integer>patch.getPatchMtlID <obj> <index>
patch.setPatchMtlID <obj> <patch_index> <mtl_id>
次の関数は、ビューポートとレンダラーにアクセスし、面分割と可視性をコントロールします。
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>
次の関数は、指定されたサブオブジェクトのトポロジ情報にアクセスします。
<integer_array> patch.getEdges <obj> <v1> [<v2>]
<integer_array> patch.getPatches <obj> <v1> [<v2>]
<integer_array> patch.getVectors <obj> <vert>
次の関数は、指定された行列に基づいて、パッチ オブジェクトのすべての頂点とベクトルを変換します。この変換は、オブジェクトのローカル スペースで発生します。
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> <propagate>
patch.subdividePatches <obj> <propagate>
patch.addTriPatch <obj>
patch.addQuadPatch <obj>
次の関数は、サーフェス法線の情報を取得および操作します。法線ベクトルは、MAXScript の現在の作業座標コンテキスト内で解釈されます。
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>
次の関数は、頂点と内部頂点のタイプを取得および変更します。
patch.changeVertType <obj> <vert> #corner|#coplanar patch.getVertType <obj> <vert> ->#corneror#coplanar
patch.changePatchInteriorType <obj> <patch> #automatic|#manual patch.getPatchInteriorType <obj> <patch> ->#automaticor#manual
次の関数は、パッチ オブジェクトの現在のメッシュ面分割を返します。
<mesh value>patch.getMesh <obj>
次の関数は、個々のパッチ サーフェスの補間に使われます。三角形パッチ補間は、重心座標として u,v,w をとります。四角形パッチは、パラメータとして u と c をとります。これらの関数が返したポイントは、現在の MAXScript 作業座標コンテキストで解釈されます。
<point3>patch.interpTriPatch <obj> <patch> <u> <v> <w>
<point3>patch.interpQuadPatch <obj> <patch> <u> <v>
以下のメソッドには、操作対象の選択が必要です。選択を行わずにこれらのメソッドを使用しても、結果として何も起こりません。
subDivideEdges:
Quadpatch lengthsegs:1 widthsegs:1 length:100 width:100 isSelected:on
convertTo $ Editable_Patch
$.selectededges = #{1}
patch.subdivideEdges $ false
patch.update $
subdividePatches:
Quadpatch lengthsegs:1 widthsegs:1 length:100 width:100 isSelected:on
convertTo $ Editable_Patch
$.selectedfaces = #{1}
patch.subdividePatches $ false
patch.update $
addTriPatch/addQuadPatch:
Quadpatch lengthsegs:1 widthsegs:1 length:100 width:100 isSelected:on
convertTo $ Editable_Patch
$.selectededges = #{1}
patch.addTriPatch $
patch.update $
$.selectededges = #{3}
patch.addQuadPatch $
patch.update $