ノード ユーティリティ

isDeleted <MAXWrapper_object>

オブジェクトが既に削除されている場合、この関数は true を返し、オブジェクトがまだシーン内に存在している場合は、false を返します。この関数の使用は、3ds Max オブジェクトへの参照が変数や配列内に保持される場合や、パラメータとして渡され、オブジェクトがシーンから削除されているかどうかを判断したい状況でのみ役立ちます。変数や配列で参照された削除済みの 3ds Max オブジェクトで演算が実行されると、他の方法で例外が発生します。シーン オブジェクト、モディファイヤ、コントローラ、マテリアルなど、どの種類の 3ds Max オブジェクトもこの方法でテストすることができます。

例:

sel = selection as array-- snapshot selection
--...
-- <one or more objects in the selection are deleted,
-- by the user or other scripts>
--...
for obj in sel
where not isDeleted obj do
move obj [10,0,0]

ノードが削除されている場合、

== undefined は false を返します

!= undefined は true を返します。

例:

if mynode != undefined and not isdeleted myNode do...
distance <node> <node>

指定した 2 つのノードの基点間の距離を計算します。

intersectRay <node> <ray>

レイと指定したノードのサーフェスのもっとも近い交差を計算します。3D スペースにおいて交差の位置を定義する別のレイと、その点におけるサーフェスの法線ベクトルを返します。交差のテストではノード面の法線が考慮されます。面の法線がレイのソースとは離れた方向を指している場合には、その面に対しては交差のテストは実行されません。 intersectRay() は、ノードのワールド状態(ノード スタックの最上位にあるノードの状態)に、編集可能メッシュ、標準プリミティブ、拡張プリミティブ、合成プリミティブ、パッチ、または NURBS サーフェス オブジェクトのようなサーフェスがある場合に機能します。スプラインおよび NURBS カーブにはサーフェスはありません。レイがノードと交差しない場合、レイが交差する面がレイの位置とは離れた方向を指している場合、またはノードにサーフェスがない場合は、undefined が返されます。

intersectRayEx <node> <ray>

レイをとって、所定のノードのサーフェスから最も近い交差点を計算します。次の 3 つの要素を持つ配列を返します。

  1. 3D スペースにおける交差点の位置を定義するレイと、その点におけるサーフェスの法線ベクトルを返します。

  2. レイが交差する面のインデックス

  3. ヒットした面の重心座標

ノードがもともと編集可能メッシュであったか、ノードをメッシュに変換するモディファイヤが適用されているために、ノードのワールド状態がメッシュとなっている場合にのみ、このメソッドは機能します。intersectRay() とは異なり、このメソッドはノードが標準プリミティブまたは拡張プリミティブである場合には機能しません。ノードのスタックは、メッシュに対して評価する必要があります。交差のテストではノード面の法線が考慮されます。面の法線がレイのソースとは離れた方向を指している場合には、その面に対しては交差のテストは実行されません。レイがノードと交差しない場合、レイが交差する面がレイの位置とは離れた方向を指している場合、またはノードがメッシュでない場合、undefined が返されます。

重心座標とは

重心座標は、三角形の面に相対的な座標です。三角形に相対的なポイント p の重心座標は、そのポイントを三角形の頂点の重量合計として記述します。

重心座標が b0b1b2 の場合、次のようになります。

p = b0*p0 + b1*p1 + b2*p2

ここで、p0p1p2 は三角形の頂点の位置を示しています。

このメソッドによって返される Point3 では、3 つの座標に格納された重心座標があります。これらの座標は、交差する三角形の面に相対的な座標です。

これらの重心座標は、三角形の頂点における量の値がわかっている場合には、どの量を補完するためにでも使用できます。

次に、交差点における UV 座標を見つける例を示します。

例:

s = geosphere material:(standardMaterial diffuseMap:(checker()))
showTextureMap s.material s.material.diffuseMap on
--
-- Add a normal modifier to make the sphere into a mesh
addModifier s (normalModifier())
r = ray [-100,5,0] (s.center-[-100,5,0])
--
-- Get the Intersection details
arr = (intersectRayEx s r)
--
-- Create a dummy at the point of intersection
dummy pos:(arr[1]).pos
--
-- Get the texture face
tf = getTVFace s arr[2]
--
-- Get the UVW verts of the face
tv1 = getTVert s tf.x
tv2 = getTVert s tf.y
tv3 = getTVert s tf.z
--
-- Calculate the texture vertices at point of intersection from
-- the barycentric coordinates
tv = tv1*arr[3].x + tv2*arr[3].y + tv3*arr[3].z
--
-- Delete the modifier
deleteModifier s 1
intersectRayScene <ray>

シーン内のすべてのノード上で intersectRay を実行します。

ノード ヒットあたり 1 エントリの結果の配列を返します。各エントリは、ノードおよびそのノードに対する intersectRay の結果が含まれている 2 要素配列です。

この交差は、非表示のオブジェクトを含む、すべてのジオメトリ オブジェクトに対して実行されます。

3ds Max 2008 以降 で使用可能です。従来、Avguard 機能拡張として提供されていた機能です。

(
local r = ray [0,0,0] [1,0,0]--define a ray along X
for i = 0 to 4 do--loop 5 times
(
 box pos:[i * 30, 0,0]--create a box
)
local hits = intersectRayScene r--intersect withscene
print hits --Misses box 1 because ray originates inside the box
)

-- output

--> #($Box:Box02 @ [30.000000,0.000000,0.000000], (ray [17.5,0,0] [-1,0,0]))
--> #($Box:Box03 @ [60.000000,0.000000,0.000000], (ray [47.5,0,0] [-1,0,0]))
--> #($Box:Box04 @ [90.000000,0.000000,0.000000], (ray [77.5,0,0] [-1,0,0]))
--> #($Box:Box05 @ [120.000000,0.000000,0.000000], (ray [107.5,0,0] [-1,0,0]))
--> OK
intersects <node> <node>

指定した 2 つのノードのバウンディング ボックスが重なる場合は true、重ならない場合は false を返します。

printStack <node>

指定されたノードに対する現在のモディファイヤ スタックの表示を出力します。

getLastMergedNodes()

前回の合成操作(mergeMAXFile() など)によってロードされたノードの配列を返します。