パッチ

パッチ関数パッケージには、パッチ オブジェクトの作成、修正、およびアクセスに使用するさまざまな関数が含まれます。このパッケージは、3ds Max 4 で導入されました。MAXScript のサブオブジェクト選択システムも、パッチ オブジェクトに対応できるように拡張されています。

パッチ オブジェクトを初めから作成するには、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>

ここで、

patch.makeTriPatch <obj> <index> <va> <vab> <vba> <vb> <vbc> <vcb> <vc> <vca> <vac> <i1> <i2> <i3> <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:<bool>]

<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> <bool>
patch.getShowInterior <obj>

patch.setAdaptive <obj> <bool>
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>

SubObject 選択

以下のメソッドには、操作対象の選択が必要です。選択を行わずにこれらのメソッドを使用しても、結果として何も起こりません。

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 $

関連事項