Editable_Mesh は、モディファイヤ スタックを編集可能メッシュ オブジェクトに集約してできるノード オブジェクトのクラスです。MAXScript でメッシュを修正するメッシュ操作の多くは、Editable_Mesh シーンのノードにのみ作用します。
TriMesh クラスは、下位レベル 3ds MaxSDK Mesh クラスの MAXScript 値のラップの 1 つです。このメッシュ クラスは、3ds Max 内のメッシュ ベースのオブジェクトおよびモディファイヤで広範囲に使われます。メッシュは、三角形メッシュに実際の頂点や面配列などを保持します。たとえば、Editable_Mesh オブジェクトはメッシュのインスタンスを含みます。TriMesh クラスの主な用途は、スクリプトで書かれたプリミティブ オブジェクトのプラグインにアクセスできるようにし、ジオメトリ オブジェクトの内部に Mesh オブジェクトを構築することです。このクラスには、広範囲なメッシュ操作の関数および作図関数が含まれ、Editable Mesh シーン ノードの下位レベル メッシュ操作に相当します。
このトピックで説明されるプロパティとメソッドは、Editable_Mesh オブジェクトおよび TriMesh 値の両方に適用でき、<mesh
> の値タイプで表されます。TriMesh 値だけに適用できるプロパティとメソッドは <trimesh
> の値タイプで表されます。
MAXScript で作成されるメッシュは triMesh
値です。
update()
関数だけがメッシュの内部キャッシュおよび 3ds Max ビューポートのイメージを更新します。これは、更新操作は計算面で負担が大きく、関数呼び出しのたびに更新を実行するのは好ましくないからです。ただし、一連の変更を行った後で、3ds Max でメッシュを操作する前や MAXScript で他の関数を使ってメッシュを操作する前に、update()
関数を呼び出すようにする必要があります。
座標は、MAXScript の作業座標系で与えられます。
[修正] (Modify)パネルで選択され、現在開かれているオブジェクトに対して update()
関数を呼び出すと、3ds Max のクラッシュを回避するため現在の選択が解除されます。現時点では、[修正] (Modify)パネルで開いているオブジェクトに対するスクリプトの変更はサポートされていません。
メッシュの作成または修正中に、メッシュでまだ update()
を実行していない状態で、3ds Max ウィンドウを最小化してから最大化すると 3ds Max がクラッシュすることがあります。これは、不完全なメッシュが作成され、内部 3ds Max のメッシュ構造が不安定な状態に置かれるためです。
コンストラクタ (Editable_Mesh)
editable_mesh...
空のメッシュを作成します。
mesh [ length:<integer> ] [ width:<integer> ] [ lengthsegs:<integer> ] [ widthsegs:<integer> ]
所定のサイズとセグメント数を持つ、平らで矩形のメッシュを作成します。長さおよび幅の既定値は 50、セグメント数の既定値は 5 です。
mesh [ numverts:<number> ] [ numfaces:<number> ]
所定のジオメトリのメッシュを作成しますが、このメッシュにはトポロジ(面や頂点)がありません。頂点を個別に指定して、面を作成しなければなりません。頂点と面の既定値は、それぞれ 36 と 50 です。
mesh [ mesh:<TriMesh>]
指定された TriMesh 値をメッシュ ソースとして使用して、メッシュを作成します。
mesh vertices:<array_of_point3s> faces:<array_of_point3s> [ materialIDs:<array_of_integers> ] [ tverts:<array_of_point3s> ]
頂点と面の配列からメッシュを作成します。vertices
配列の各 Point3 値は、現在の座標系における頂点の位置を指定します。faces
配列の各 Point3 値は、面を形成する 3 つの頂点のインデックスを指定します。materialIDs
配列は、各面に割り当てられるマテリアル ID を指定します。
tverts
配列の各 Point3 値は、テクスチャ頂点の UVW 座標を指定します。テクスチャ頂点の詳細については、メソッド セクションの「テクスチャ マップ」を参照してください。
この形式のコンストラクタを使ったメッシュ構築の例を次に示します。
例
mesh vertices:#([0,0,0],[10,0,0],[0,10,0],[10,10,0]) \ faces:#([1,2,3],[2,4,3]) materialIDS:#(1,2)
tverts
配列機能は現在機能していません。テクスチャ頂点は正しく設定されますが、テクスチャ面は内部では構築されません。これが修正されるまでは、次のようにユーザ自身でテクスチャ面を構築してこの問題を回避してください。対応例:
mnode = mesh vertices:#([0,0,0],[10,0,0],[0,10,0],[10,10,0]) tverts:#([0,0,0],[10,0,0],[0,10,0],[10,10,0]) faces:#([1,2,3],[2,4,3]) mmesh = mnode.mesh buildTVFaces mmesh for i = 1 to mmesh.numfaces do(setTVFace mmesh i (getFace mmesh i))
collapseStack <node> -- mapped
ノードのスタックの最上位にある評価結果に対応した基本オブジェクトを残して、スタックからオブジェクト空間モディファイヤを集約します。つまり、スタック最上位の結果が Editable_Mesh である場合に限り、結果は Editable_Mesh になります。モディファイヤの中には、オブジェクト クラスを暗黙的に変換するものがあります。たとえば、MeshSmooth は入ってくるジオメトリをポリゴンに暗黙的に変換するので、最上位に MeshSmooth があるボックスは Editable_Poly に集約します。メッシュ スムーズ モディファイヤの上に MeshSelector とメッシュに変換モディファイヤを追加し、collapseStack()
を呼び出すと、Editable_Mesh ベース オブジェクトが得られます。
例
b = box() --create a box --> $Box:Box01 @ [0.000000,0.000000,0.000000] addModifier b (MeshSmooth()) --add meshSmooth modifier --> OK classof b --check the class - it was turned into Polygons! --> PolyMeshObject collapseStack b --collapse the stack of the box --> OK classof b --the result is Editable_Poly --> Editable_Poly addModifier b (Turn_To_Mesh()) --now add Turn To Mesh modifier --> OK classof b --the class is now Editable_Mesh and not Editable_Poly! --> Editable_mesh collapseStack b --collapse the stack --> OK classof b --as expected, the result is an Editable_Mesh! --> Editable_mesh
これを呼び出すときにスタックの中にモディファイヤが存在しない場合は、何も行われません。このため、(たとえば、以下に示すメッシュ操作を行うために)オブジェクトを強制的に編集可能メッシュにする場合は、Null のモディファイヤを適用し、それからスタックを集約します。
例
b = box() --create a box --> $Box:Box03 @ [0.000000,0.000000,0.000000] collapseStack b --try to collapse the stack --> OK classof b --it is still a box - nothing to collapse! --> Box addModifier b (meshSelect()) --add a MeshSelect modifier --> OK collapseStack b --try to collapse the stack again --> OK classof b --this time it worked! --> Editable_mesh
collapseStack()
は、ワールド空間モディファイヤ(スペース ワープへのバインドを含む)の効果を集約しません。ワールド スペース モディファイヤは、オブジェクトのスタック上に残ります。ワールド空間モディファイヤを含むオブジェクトをメッシュに集約するには、snapshot()
メソッドを使用します。
snapshot <node> -- mapped
この関数は、3ds Max のスナップショット ツールと同様の機能を持ちます。スナップショットが作成されるときに、ソース <node
> のワールド状態メッシュのコピーを含む新しいノードを生成します。既存のモディファイヤはすべて新しいノードから集約され、メッシュ スナップショットには、現在適用されているすべてのスペース ワープが反映されます。
convertToMesh <node> -- mapped
該当するシーン オブジェクト タイプを編集可能メッシュに変換します。この関数は、存在するすべてのオブジェクト空間モディファイヤを削除する collapseStack()
に似ていますが、collapseStack()
とは異なり、たとえモディファイヤが存在しない場合でも、常に基本オブジェクトを編集可能メッシュに置き換えます。
この関数は、メッシュ編集モディファイヤが作用するジオメトリやシェイプなどのすべてのオブジェクトに適用できますが、ヘルパーやスペース ワープ、ライト、その他には適用できません。
convertTo <node> [ TriMeshGeometry | Mesh ] -- mapped
該当するシーン オブジェクト タイプを編集可能メッシュに変換します。この関数の操作方法は、convertToMesh()
と同じです。
コンストラクタ(TriMesh)
TriMesh()
空の TriMesh を作成します。以下に示すメソッドを使って、メッシュを作成します。
<node>.mesh
メッシュに変換可能な場合はノードのワールド状態のコピーを抽出します。
<editable_mesh_baseobject>.mesh
基本オブジェクトのメッシュのコピーを抽出します。
<trimesh>.mesh
もう 1 つの TriMesh のメッシュのコピーを抽出します。
演算子
以下の操作は、メッシュ上でブール値操作を実行します。これらの操作では、同じブール値の < node
> 操作のように、ブール値の結果を含むように最初のオペランド メッシュを完全に修正します。
<mesh> + <mesh> -- union
<mesh> - <mesh> -- difference
<mesh> * <mesh> -- intersection
プロパティ
<mesh>.numverts Integer
頂点の数を取得/設定します。numVerts
プロパティまたは setNumVerts
メソッドを使用して頂点の数を設定する場合は、新しい頂点が[0.,0.,0.].
<mesh>.numfaces Integer
面の数を取得/設定します。
3ds Max 7 以前のバージョンでは、update を呼び出す前に、メッシュを再度初期化して有効にする必要がありました。3ds Max 7 以上では、.numfaces
の値を設定するか setNumFaces
関数を呼び出すと自動的に再度初期化が行われます。
$.numfaces=300
--is equivalent to
setNumFaces $ 300 false
--The false argument means to not keep the existing topology
新しい面の場合は、すべてについて次のように設定されます。
スムージング グループが 1 に設定されます
頂点は、[1,1,1]に設定されます(基数が 1。更新時に頂点数が 0 の場合はクラッシュします。このクラッシュは、この時点で予想される状況です)
マテリアル ID は 1 に設定されます(基数 1)
使用中のマップ チャネルは、それぞれ次のように設定されます
マップ面の頂点は、[1,1,1]に設定されます
既存のトポロジを保持しない場合、マップの頂点数は 1 に設定され、頂点は[1,1,1]に設定されます(基数 1)
<mesh>.numtverts Integer
テクスチャ頂点の数を取得/設定します。numTVerts
プロパティまたは setNumTVerts
メソッドを使用してテクスチャ頂点の数を設定する場合は、新しい頂点が[0.,0.,0.].
<mesh>.numcpvverts Integer
頂点ごとのカラーを持つ頂点の数を取得/設定します。numCPTVerts
プロパティまたは setNumCPVVerts
メソッドを使用して CPV 頂点の数を設定する場合は、新しい頂点が[0.,0.,0.].
<mesh>.mesh TriMesh
このプロパティを読み込むと、モディファイヤが適用済みでスペース ワープが適用される前のメッシュのコピーが生成されます。このプロパティを割り当てると、メッシュに所定の TriMesh 値が設定されます。このプロパティを copy()
および <node_or_baseobject>.mesh
プロパティとともに使用して、他のオブジェクトのメッシュから TriMesh を構築できます。
<mesh>.selectedVerts VertexArray
編集可能メッシュオブジェクトの現在選択されている頂点を取得します。「VertexSelection 値」を参照してください。
<mesh>.verts VertexArray
編集可能メッシュ オブジェクトのすべての頂点を取得します。「VertexSelection 値」を参照してください。
<mesh>.selectedFaces FaceArray
編集可能メッシュ オブジェクトの現在選択されている面を取得します。「FaceSelection 値」を参照してください。
<mesh>.Faces FaceArray
編集可能メッシュ オブジェクトのすべての面を取得します。「FaceSelection 値」を参照してください。
<mesh>.selectedEdges EdgeArray
編集可能メッシュ オブジェクトの現在選択されているエッジを取得します。「EdgeSelection 値」を参照してください。
<mesh>.Edges EdgeArray
編集可能メッシュ オブジェクトのすべてのエッジを取得します。「EdgeSelection 値」を参照してください。
<mesh>.displacementMapping Boolean
編集可能メッシュ オブジェクトのディスプレイスメント マッピングを実行するかどうかを取得/設定します。このプロパティに対応するユーザ インタフェース要素はありません。
<mesh>.subdivisionDisplacement Boolean
編集可能メッシュ オブジェクトのサブディビジョン ディスプレイスメントを実行するかどうかを取得/設定します。このプロパティは、[サーフェス プロパティ](Surface Properties)ロールアウトの[サブディビジョンでディスプレイスメント](Subdivision Displacement)チェックボックスに相当します。
<mesh>.splitMesh Boolean
サブディビジョン ディスプレイスメント中にメッシュを分割するかどうかを取得/設定します。このプロパティは、[サーフェス プロパティ](Surface Properties)ロールアウトの[メッシュを分割](Split Mesh)チェックボックスに相当します。このプロパティを設定すると、subdivisionDisplacement
が有効になります(false
に設定した場合)。
VertexSelection、FaceSelection、または EdgeSelection を返すプロパティ以外の上記のプロパティでは、読み込みと割り当ての両方を行えます。これらのプロパティに、頂点や面のの空間を追加するために数を割り当てると、メッシュを最初から作成するものとみなされ、メッシュは現在のトポロジ/ジオメトリ(頂点、面、エッジ)をすべて消失します。現在のトポロジ/ジオメトリを維持する場合は、以下に説明する setNumVerts()
、setNumTVerts()
および setNumFaces()
メソッドを使用します。
N までの頂点座標は、N がメッシュ内の頂点数である編集可能オブジェクトのプロパティとして使用できます。コントローラが頂点に割り当てられると、頂点はプロパティとして使用できます。コントローラは「頂点およびコントロール ポイントのアニメーションのスクリプト」で説明されている animateVertex()
メソッドを使用して頂点に割り当てられます。たとえば、球オブジェクトが編集可能メッシュに集約し、頂点のいくつかがアニメートされている場合、頂点のプロパティは次のようになります。
$Sphere01.vertex_209 Point3 value:[7.9,-40.0,0.0] -- animatable
$Sphere01.vertex_210 Point3 value:[-7.8,-39.3,-7.9] -- animatable
$Sphere01.vertex_211 Point3 value:[0.0,-40.0,-7.9] -- animatable
次のメソッドは、オブジェクト スペース モディファイヤが存在しない場合に、ノードの基本オブジェクトに作用します。オブジェクト空間モディファイヤが存在する場合は、オブジェクト空間モディファイヤが適用された後に、メッシュの get
操作がワールド状態のメッシュにアクセスします。メッシュの設定操作 set
は、編集可能メッシュの基本オブジェクトにだけ作用し、オブジェクト スペース モディファイヤが存在する場合には、モディファイヤが存在するとメッシュを変更できないことをエラー メッセージで知らせます。オブジェクトは、collapseStack()
、snapshot()
、および convertToMesh()
メソッドを使用して、編集可能メッシュに変換できます。オブジェクト スペース モディファイヤが存在しない場合、取得操作 get
および設定操作 set
は、いずれも編集可能メッシュ基本オブジェクトに作用します。
メッシュの取得操作 get
にはメッシュが必要であるため、基本オブジェクトとモディファイヤの組み合わせでモディファイヤ スタックの最上位にメッシュを生成する必要があります。たとえば、パッチ基本オブジェクトとベンドやツイストのような変形モディファイヤとの組み合わせは、メッシュではなくパッチ オブジェクトをスタックの上に送るので、これらの組み合わせはここには含まれません。メッシュ編集モディファイヤを適用すると、常にワールド状態のオブジェクトが強制的にメッシュに変換されます。
ワールド空間モディファイヤが存在する場合は、オブジェクト空間モディファイヤが適用済みでワールド空間モディファイヤが適用される前に、メッシュの get
操作がワールド状態のメッシュにアクセスします。ワールド空間モディファイヤに影響される頂点の位置にはアクセスできません。メッシュの set
操作は、ワールド空間モディファイヤがオブジェクトに適用される場合にだけ作用します。このような場合、頂点の位置を設定すると、その値はワールド空間モディファイヤが適用される前の位置に設定されます。ワールド空間モディファイヤの効果を反映させる snapshot()
メソッドを使って、新しいメッシュ オブジェクトを作成できます。
update()
メソッドは、メッシュ基本オブジェクトに対する記述上の変更を 3ds Max に認識させます。メッシュを修正した後には、3ds Max が有効なメッシュを認識できるようにするため、この関数を呼び出す必要があります。このメソッドは計算集中型操作であるため、これを個別の関数として使用して 1 つのメッシュに多数の変更を行い、その後で update を 1 回だけ呼び出してすべての変更を 3ds Maxに送ることができます。
頂点と面のインデックスは、いずれも 1 から始まり、MAXScript におけるインデックスに関するその他の規則に準拠します。使われる座標は、いずれも現在の作業座標系に対応しています。
update <mesh> [ geometry:<boolean> ] [ topology:<boolean> ] [ normals:<boolean> ] -- mapped
この 3 つのオプションのキーワード引数が、メッシュに対して行われる更新の種類をコントロールします。geometry:
引数が true
の場合は、ジオメトリ キャッシュ(法線およびエッジのリスト)が再構築され、メッシュのバウンディング ボックスが無効になります。topology:
引数が true
の場合は、エッジとストリップのデータベースが再構築されます。normals:
が true
の場合は、面の法線が計算されます。すべてのフラグの既定値は true
なので、update()
を呼び出すだけで、すべてのキャッシュが完全に再構成されます。
attach <mesh> <node>
これは、完全なオブジェクトをメッシュに追加してメッシュを構築する[編集可能メッシュ](Editable Mesh)[修正] (Modify)パネルのメッシュのアタッチ関数に相当します。この関数は <node>
からメッシュを(必要に応じてメッシュに変換してから)抽出し、それを編集可能メッシュ オブジェクト <mesh>
に追加してから <node>
を削除します。<node>
のマテリアルとマテリアル ID は、編集可能メッシュの[修正] (Modify)パネルでアタッチ操作の既定の設定を使って <node>
に合成されます。このメソッドは TriMesh には適用されません。
meshop.attach{<target_editable_mesh_node> | <target_mesh>} \
{<source_node> | <source_mesh>} \
targetNode:<node=unsupplied> \
sourceNode:<node=unsupplied> \
attachMat:<{#neither | #MatToID | #IDToMat}=#neither>\
condenseMat:<boolean=true> \
deleteSourceNode:<boolean=true>
ソース メッシュをターゲット メッシュにアタッチします。ターゲットまたはソースが、ノードではなくメッシュとして指定される場合、メッシュのローカル座標系を使用してメッシュがアタッチされ、マテリアル補正は実行されません。これを回避するため、ターゲットまたはソースがメッシュの場合は、対応する targetNode
または sourceNode
という名前が付いたパラメータを確認して、ノードが指定されているかどうかを確認します。ノードが指定されている場合は、そのノードの変換およびマテリアルを使用します。ソースまたはターゲットがノードとして指定されている場合、対応する targetNode
または sourceNode
という名前が付いたパラメータは確認されません。attachMat
および condenseMat
オプションは、編集可能メッシュのアタッチ オプションに対応します。
condenseMat
は、attachMat:#IDToMat
が指定されている場合にのみ適用されます。ソースがノードまたはメッシュとして指定されており、sourceNode
が指定されているときに、deleteSourceNode:false
を指定しない場合は、アタッチ後にソース ノードが削除されます。
例
meshop.attach $.baseobject $sphere02 targetNode:$ meshop.attach $box01 $box02 attachMat:#IDToMat \ condenseMat:true deleteSourceNode:false
meshopgetUIParam. <mesh> <param_name>
meshop.getUIParam <node> [ <modifier_or_index> ] <param_name>
meshop.setUIParam <mesh> <param_name> { <float> | <boolean> }
meshop.setUIParam <node> [ <modifier_or_index> ] <param_name> { <number> | <boolean> }
ユーザ インタフェース値を取得/設定します。オプションの <modifier_or_index>
は、指定されたシーン オブジェクト上のメッシュ編集モディファイヤを識別して、パラメータ値を設定します。これらのメソッドは UI 依存型です。使用する場合は、指定された編集可能メッシュまたは Edit Mesh モディファイヤが[修正] (Modify)パネルに現在表示されている必要があります。有効な param_name
値、それらの意味、およびパラメータ値タイプは、次のとおりです。
#SelByVert
選択 - 頂点別(ブール値)
#IgBack
選択 - 背面を無視(ブール値)
#IgnoreVis
選択 - 可視エッジを無視(ブール値)
#PolyThresh
選択 - 平面のしきい値(数値)
#SoftSel
ソフト選択 - ソフト選択を使用(ブール値)
#SSUseEDist
ソフト選択 - エッジの距離(ブール値)
#SSEDist
ソフト選択 - エッジの距離(数値) [注: 値が変更されていない場合は、0 の値が返されます]
#SSBack
ソフト選択 - 背面を無視(ブール値) [注: これは UI 要素の逆です]
#Falloff
ソフト選択 - フォールオフ(数値)
#Pinch
ソフト選択 - ピンチ(数値)
#Bubble
ソフト選択 - バブル(数値)
#WeldDist
連結 - 距離(数値)
#WeldBoxSize
連結 - ピクセル単位のボックス サイズ(数値)
#ExtrudeType
押し出し/面取り(ブール値) [注: true の場合グループ、false の場合ローカル]
#ShowVNormals
頂点法線を表示(ブール値)
#ShowFNormals
面法線を表示(ブール値)
#NormalSize
法線スケール(数値)
<float>mesh_weld_overlapping_vertices <TriMesh>mesh
TriMesh のオーバーラップ頂点を連結します。3ds Max 2017 以降で使用可能です。
例:
s = sphere segs:128 --create a sphere with 128 segments
--> $Sphere:Sphere001 @ [0.000000,0.000000,0.000000]
convertToMesh s --convert to Editable Mesh
--> $Editable_Mesh:Sphere001 @ [0.000000,0.000000,0.000000]
s.numverts --check the number of vertices
--> 8066
s1 = copy s --clone the sphere as a copy
--> $Editable_Mesh:Sphere002 @ [0.000000,0.000000,0.000000]
attach s s1 --attach the copy to the original
--> OK
s.numverts --check number of vertices again – it is doubled
--> 16132
mesh_weld_overlapping_vertices s.mesh --weld the overlapping vertices
--> 0.888889
s.numverts --check the number of vertices again...
--> 8066
その他のメッシュ関連トピック:
マッピング メソッド - 一般 (meshop struct)
サブディビジョン ディスプレイスメント サーフェス プロパティのメソッド