SimpleObject は、ボックス、球、円錐などのトライメッシュによって定義されたジオメトリ プリミティブ オブジェクトの一種です。つまり、simpleObject プラグインは、3ds Max のすべての標準および拡張プリミティブに類似しています。
SimpleObject プラグインでは、このメッシュを構築するためのハンドラを指定すると、3ds Max によってシーンの表示、ヒット テスト、レイの交差、レンダリング、モディファイヤの適用性などが自動的に処理されます。
スクリプト SimpleObject プラグインを宣言するには、<superclass>を
simpleObject
として指定します。
スクリプト SimpleObject プラグインには
create
ツールが必要です。
シーン ノードの作成やモディファイヤ スタックの構築などのシーン関連のアクションを、SimpleObject プラグインによって実行しないでください。基本的に、このプラグインではマウス ツール ハンドラにおけるパラメータの調節および
buildMesh
ハンドラにおけるメッシュの構築だけを行います。SimpleObject プラグインでシーン ノードを作成しようとしたりモディファイヤを適用したりすると、進行中のシーン ノード作成ですべての種類の未知の相互作用が発生します。
SimpleObject プラグインには、定義済みのローカル変数
mesh
があります。この変数には、作成されたオブジェクトの元になるメッシュが含まれています。
mesh
ローカル変数はどのプラグイン ハンドラでもアクセス可能ですが、一般に
buildMesh
ハンドラ内にだけ構築されます。TriMesh メソッドを使って、既存の TriMesh 値を適切に修正するか、または新しい TriMesh 値を作成し、それを
mesh
プラグイン ローカル変数に代入できます。TriMesh メソッドとプロパティについては、「Editable_Mesh: GeometryClass および TriMesh: Value」を参照してください。
スクリプト:
|
plugin simpleObject tower_plugin_def
name:"Tower"
classID:#(145345,543211)
category:"Scripted Primitives"
(
parameters main rollout:params
(
height type:#worldUnits ui:height default:0
width type:#worldUnits ui:width default:0
depth type:#worldUnits ui:depth default:0
)
rollout params "Two Faces Parameters"
(
spinner height "Height" type:#worldunits range:[-1000,1000,0]
spinner width "Width" type:#worldunits range:[-1000,1000,0]
spinner depth "Depth" type:#worldunits range:[-1000,1000,0]
)
on buildMesh do
(
setMesh mesh \
verts:#([0,0,0],[width,0,0],[width,depth,0],[0,depth,0]) \
faces:#([3,2,1], [1,4,3])
extrudeFace mesh #(1,2) (height * 0.5) 40 dir:#common
extrudeFace mesh #(1,2) (height * 0.5) 50 dir:#common
)
tool create
(
on mousePoint click do
case click of
(
1: nodeTM.translation = gridPoint
3: #stop
)
on mouseMove click do
case click of
(
2: (width = gridDist.x; depth = gridDist.y)
3: height = gridDist.z
)
)
)
|
このスクリプトでは、Tower という新しいプリミティブが定義されています。これにより、ごく簡単なタワー フォームが作成されます。最初のドラッグでベースが設定され、次のドラッグで高さが設定されます。これには、3 つのアニメート可能なロールアウト
パラメータ
height
、
width
、および
depth
が含まれており、オブジェクトの基本的な範囲が設定されます。ここでのキー コンポーネントは
create
ツールと
on buildMesh
ハンドラで、これらは一緒に単純な動作をします。
create
ツールによってパラメータの値が設定され、
on buildMesh
ハンドラによってこのパラメータ値に基づいたメッシュが構築されます。
create
ツールでは、定義済みマウス ツールのローカル変数
nodeTM
内の Matrix3 値を使って、新しいオブジェクトを含むように作成されるノードの位置にアクセスし、設定することもできます。この場合、ノードの TM の位置は、初めてマウスをクリックしたときのワールド位置に設定されます。
on mouseMove
ハンドラでは、2 度目のクリックで幅と長さを、3 度目のクリックで高さを設定します。
on buildMesh
ハンドラは、TriMesh 値の任意のメッシュを、定義済みプラグインのローカル変数
mesh
に作成します。通常は、ハンドラが呼び出されるたびにメッシュをゼロから作成します。上記の例では、メッシュは初め単純な 2 面矩形の平面に(
setMesh()
を介して)設定され、次に 2 面が上に押し出されて、2 回スケールダウンし単純なタワーになります。
mesh
プラグイン ローカル変数はどのプラグイン ハンドラでもアクセス可能ですが、一般に
on buildMesh
ハンドラ内にだけ構築されます。TriMesh メソッドを使って、既存の TriMesh 値を適切に修正するか、または新しい TriMesh 値を作成し、それを
mesh
プラグイン ローカル変数に代入できます。作成した TriMesh は有効でなければなりません。無効な場合は 3ds Max がクラッシュすることがあります。割り当てられたすべての面、頂点、マテリアル ID、およびテクスチャ頂点配列は、ハンドラで入力される必要があります。
スクリプト化された SimpleObject に実行できる追加イベント ハンドラには、以下の 3 つがあります。
on OKtoDisplay do <boolean_expr>
OKtoDisplay
イベント ハンドラが実行されている場合、
<boolean_expr>
は、現在のメッシュを表示してもよいかどうかによって
true
または
false
を返します。これは、メッシュが特定のパラメータ設定で再生成状態にあり、ビューポートに表示されてない場合に使用すると便利です。既定値は
true
です。空のメッシュを表示してもよいことに注意してください。
on hasUVW do <boolean_expr>
hasUVW
イベント ハンドラが実装されている場合、
<boolean_expr>
は、UVW 座標がメッシュに表示されるかどうかによって
true
または
false
を返します。プリミティブ オブジェクトの多くには、ユーザが UVW 座標の生成を制御するための[マッピング座標を生成]チェックボックスが備わっています。
hasUVW
ハンドラ式によって、このチェックボックスの状態が返されます。既定値では、メッシュがテクスチャ頂点を表示するかどうかによって、
true
または
false
が返されます。現在のところ、1 つのマップ チャンネルのみがサポートされています。
on setGenUVW <onOff> do <expr>
setGenUVW
イベント ハンドラは、マッピング座標ではなくマテリアルを適用したオブジェクトを最初にレンダリングする場合など、3ds Max がプラグインで自動的にマッピング座標を生成するときに呼び出されます。これは、スイッチ引数
<onOff>
とともに呼び出され、このスイッチ引数が
true
または
false
になることによって、マッピング座標がオンまたはオフになります。使用するプラグインによってマッピング座標が管理されている場合は、
true
で呼び出してこのハンドラを実行し、マッピング座標を作成する必要があります。
例:
|
plugin simpleObject TexturePlane
name:"TexturePlane"
classID:#(0x19a75166, 0x83e3a1c7)
category:"MAXScript Examples"
(
parameters main rollout:params
(
Size type:#worldUnits ui:size default:0
genMapCoords type:#boolean ui:gen_Map_Coords default:false animatable:false
u_tile type:#float default:1.0 ui:u_step
v_tile type:#float default:1.0 ui:v_step
)
rollout params "TexturePlane"
(
group "Geometry"
(
spinner size "Size:" type:#worldunits range:[0,1000,1]
)
group "Mapping"
(
spinner u_step "U Tiling" scale:0.01
spinner v_step "V Tiling" scale:0.01
checkbox gen_Map_Coords "Generate Mapping Coords."
)
) -- ロール終了
-- Max がオブジェクトに UV 座標が存在するかどうかを確認する場合、
-- genMapCoords に保存されている値を返して、
-- プラグインの現在の UV の状態を通知します。
on hasUVW do genMapCoords
-- 3ds Max からプラグインに対して、UV 座標をオンにするように通知する場合
-- (たとえば、テクスチャに[ビューポート内でマップを表示]が
--オンになった状態を適用する場合)
-- このハンドラは、自動的に、genMapCoords と呼ばれる
-- パラメータに接続したチェックボタンをオンにします。
-- また、ユーザがチェックボックスを変更した場合、
-- 変数によって builMesh に座標を生成するように指示されます。
-- ハンドラは手動の設定を上書きすることに注意してください。
-- たとえば、テクスチャで[ビューポート内でマップを表示]がオンになっている場合、
-- マウスによって[マッピング座標を生成]のチェックボックスを
-- オフにすることはできません。
on setGenUVW bool do genMapCoords = bool
on buildMesh do (
-- 単純なクアッドを生成します。
local vertex_array = #()
append vertex_array [-size/2,-size/2,0]
append vertex_array [size/2,-size/2,0]
append vertex_array [size/2,size/2,0]
append vertex_array [-size/2,size/2,0]
face_array = #( [1,2,3], [1,3,4] )
setMesh mesh verts:vertex_array faces:face_array
-- チェックボックスがオンになっていて、
-- 座標を生成したい場合には、次のようにします。
if genMapCoords then
( --define the texture vertices
local uvw_array = #()
append uvw_array [0.0,0.0,0.0]
append uvw_array [u_tile ,0.0,0.0]
append uvw_array [u_tile ,v_tile ,0.0]
append uvw_array [0.0,v_tile ,0.0]
-- 頂点の数を設定します。
setNumTVerts mesh uvw_array.count
-- すべての頂点を設定します。
for v = 1 to uvw_array.count do
setTVert mesh v uvw_array[v]
-- テクスチャの面を構築します。
buildTVFaces mesh false
-- すべてのテクスチャの面を設定します(この場合、メッシュの面を使用。
-- これは、たまたま頂点とテクスチャ頂点が 1 対 1 で
-- 対応しているからです。
-- 常にこうなるとは限りません。
for f = 1 to face_array.count do
setTVFace mesh f face_array[f]
)
)-- buildMesh 終了
tool create
(
on mousePoint click do
case click of
(
1: ( nodeTM.translation = gridPoint )
2: ( #stop)
)
on mouseMove click do
case click of
(
2: (Size= abs gridDist.x)
)
)
)-- プラグイン終了
|
ここでは、まず別のテンポラリのオブジェクトを作成し、メッシュのブール値を使って最終的なメッシュを作成するもう 1 つの例を示します。
スクリプト:
|
plugin simpleObject squareTube
name:"SquareTube"
classID:#(63445,55332)
category:"Scripted Primitives"
(
local box1, box2
parameters main rollout:params
(
length type:#worldUnits ui:length default:1E-3
width type:#worldUnits ui:width default:1E-3
height type:#worldUnits ui:height default:1E-3
)
rollout params "SquareTube"
(
spinner height "Height" type:#worldUnits range:[1E-3,1E9,1E-3]
spinner width "Width" type:#worldUnits range:[1E-3,1E9,1E-3]
spinner length "Length" type:#worldUnits range:[-1E9,1E9,1E-3]
)
on buildMesh do
(
if box1 == undefined do
(box1 = createInstance box; box2 = createInstance box)
box1.height = height; box2.height = height
box1.width = width; box2.width = width * 2
box1.length = length; box2.length = length * 2
mesh = box2.mesh - box1.mesh
)
tool create
(
on mousePoint click do
case click of
(
1: nodeTM.translation = gridPoint
3: #stop
)
on mouseMove click do
case click of
(
2: (width = abs gridDist.x; length = abs gridDist.y)
3: height = gridDist.z
)
)
)
|
この例で、パラメータとロールアウトは最初の例と同じように処理されていますが、
buildMesh
ハンドラはメッシュを間接的な方法で生成します。最終的なオブジェクトは、矩形パイプのフォームで、中心に穴の空いたボックスで表します。2 つのプラグイン ローカル(
box1
および
box2
)には、プラグイン パラメータに従ってサイズ パラメータが設定される Box 基本オブジェクトが入っています。
box2
は外側のボックスで、
box1
は穴です。最後のメッシュは、
box1
の
box2
からの論理減算によって作成されます。この場合、独立した新しいメッシュが作成され、
mesh
プラグイン ローカル変数に代入されます。これは、オブジェクトの元のメッシュを直接修正した最初の例とは対照的です。どちらの方法を使用しても構いません。
createInstance()
メソッドは、Box 基本オブジェクトを直接作成するために使用します。このメソッドは、指定されたオブジェクトに関連するジオメトリを作成しますが、ノードは作成しません。シーン ノードの作成やモディファイヤ スタックの作成などに関連するシーンは、SimpleObject
プラグインで操作できないため、このメソッドを使用します。