RayMeshGridIntersect : ReferenceTarget
 
 
 
RayMeshGridIntersect - superclass: ReferenceTarget; super-superclass:MAXWrapper - 1:0 - classID: #(930131240, 656216840) 	 

均一のボクセル グリッドをアクセラレーション方法として使用して、レイからメッシュへの高度な交差メソッドを提供します。

プロパティ

   

<RayMeshGridIntersect>.nodeList ArrayParameter default: #() -- node array; Node_List   

RayMeshGridIntersect インタフェース:

Interface: rayMeshGridIntersectOps 

メソッド:

<void>initialize <integer>gridSize 

ボクセル グリッドを指定されたグリッド サイズで初期化します。グリッド サイズの値は、3 軸すべてに沿ったボクセルの数を定義します。ボクセルの実際のサイズは、処理されるノードのバウンディング ボックスに依存します。

   

<void>addNode <node>addNode 

ノード リストにノードを追加します。

   

<void>buildGrid () 

ボクセル グリッドにデータを入力します。

   

<void>free () 

ボクセル グリッドからすべてのデータを削除します。

   

<integer>intersectBox <point3>min <point3>max 

指定されたワールド スペースの最小ポイント数と最大ポイント数を使用して、ボックス交差を実行します。

   

<integer>intersectSphere <point3>center <float>radius 

指定された中心と半径を使用して、球の交差を実行します。

   

<integer>intersectRay <point3>p <point3>dir <boolean>doubleSided 

指定された位置と方向を使用して、レイの交差を実行します。

doubleSided 引数が false の場合は、法線がレイに向かっている面との交差のみが収集されます。true の場合、法線がレイの方向に向かっているときでも、面は両面と見なされ、交差します。

結果は、交差が検出されなかった場合は 0、検出された場合は交差している面の数を表す正の数です。

   

<integer>intersectSegment <point3>p1<point3>p2 <boolean>doubleSided 

指定された 2 つのワールド位置を使用して、セグメントの交差を実行します。これは intersectRay に似ていますが、ポイントと方向の代わりに、スペース内の 2 つの絶対位置を使用して交差レイが定義されます。p1 は原点、方向は p1 から p2 です。

doubleSided 引数が false の場合は、法線がレイに向かっている面との交差のみが収集されます。true の場合、法線がレイの方向に向かっているときでも、面は両面と見なされ、交差します。

結果は、交差が検出されなかった場合は 0、検出された場合はヒットしている面の数を表す正の数です。

   

<integer>getHitFace <integer>index 

インデックスで指定されたヒットの TriMesh 面のインデックスを返します。インデックスには、1 から最後の交差メソッドによってレポートされたヒット数までの正の数を指定できます。

   

<point3>getHitBary <integer>index 

インデックスで指定されたヒットの TriMesh 面の重心座標を返します。インデックスには、1 から最後の交差メソッドによってレポートされたヒット数までの正の数を指定できます。

   

<point3>getHitNormal <integer>index 

ワールド スペース内のインデックスで指定されたヒットの TriMesh 面の面法線を返します。インデックスには、1 から最後の交差メソッドによってレポートされたヒット数までの正の数を指定できます。

   

<float>getHitDist <integer>index 

インデックスで指定されたヒットまでの距離を返します。インデックスには、1 から最後の交差メソッドによってレポートされたヒット数までの正の数を指定できます。

   

<integer>intersectSegmentDebug <point3>p1 <point3>p2 <boolean>doubleSided <integer>gridID 

このメソッドはデバッグ専用です。

   

<integer>getClosestHit () 

最も近いヒットのインデックスを返します。

   

<integer>getFarthestHit () 

最も遠いヒットのインデックスを返します。

   

<integer>closestFace <point3>p 

指定されたワールドポイントからすべての面との交差を実行し、ヒットの数を整数で返します。指定されたワールド ポイントに最も近い面と最も遠い面を決定するには getClosestHit() および getFarthestHit()、すべての面までの距離を決定するには getHitDist()、ポイントまでの垂直距離を決定するには getPerpDist() を使用できます。

   

<float>getPerpDist <integer>index 

インデックスで指定されたヒットまでの垂直距離を返します。インデックスには、1 から最後の交差メソッドによってレポートされたヒット数までの正の数を指定できます。

   

<void>ClearStats () 

すべての統計をクリアします。

   

<void>PrintStats () 

面の数および実行された検索の数を含む現在の統計を出力します。

次の例では、球と天球体を作成し、球をボクセル グリッドで登録して、各天球体からレイを当て、これらのレイがヒットした球の面を選択します。

(
resetMaxFile #noprompt --シーンをリセットします。
theSphere = Sphere radius:40 segs:50 pos:[100,200,300] --球を作成します。
theGeoSphere = Geosphere radius:100 segs:3 pos:[100,200,300] --天球体を作成します。
theFacesArray = #() --  選択されている面を収集するための配列を初期化します。
 
rm = RayMeshGridIntersect () --参照ターゲットのインスタンスを作成します。
rm.Initialize 10 --  グリッドのサイズを 10x10x10 に初期化します。
rm.addNode theSphere --球をグリッドに追加します。
rm.buildGrid () --グリッド データを構築します (グリッドのボクセルに面を収集します)
theGSMesh = snapshotasmesh theGeoSphere --天球の TriMesh を取得します。
for v = 1 to theGSMesh.numverts do --天球のすべての頂点を巡回します。
(
thePos = getVert theGSMesh v --頂点の位置を取得します。
theNormal = -(getNormal theGSMesh v) --頂点の法線を取得して、方向を逆転させます。
theHitsCount = rm.intersectRay thePos theNormal false --レイを球と交差させます。
if theHitsCount > 0 then --何かにヒットした場合は...
(
 theIndex = rm.getClosestHit () --レイによる最も近いヒットのインデックスを取得します。
 theFace = rm.getHitFace theIndex --そのインデックスで指定されたヒットに対応する面のインデックスを取得します。
 append theFacesArray theFace --面の配列に追加して、面を選択します...
)
else
 format "The Ray % Missed\n" v
)
 
ms = mesh_select() --メッシュ選択モディファイヤを作成します。
addModifier theSphere ms --球の最上部に追加します。
select theSphere --球を選択します。
max modify mode --[修正]パネルに移動します。
setFaceSelection theSphere 1 theFacesArray --MeshSelect 内で選択を設定します。
subObjectLevel = 3 --面選択レベルに移動します。
)
関連事項