チュートリアル - スクリプト化されたジオメトリ プラグインの作成

MAXScript によって、手続き型のメッシュ オブジェクトをその場で生成するスクリプト化された Geometry プラグインを通常の C++ プラグインと同様に作成することができます。

ここでは、「チュートリアル - カスタム メッシュ オブジェクトの作成」で作成した単純なメッシュ コードを使用して、それをスクリプト化されたプラグインに拡張します。

関連トピック:

SimpleObject プラグインの定義

スクリプト化されたマウス ツール

マウス ツール句

全体の流れ

スクリプト化された simpleObject プラグインを定義します。

前のチュートリアルで作成したメッシュ オブジェクトの基本パラメータをパラメータ ブロック パラメータに変換します。

UI とパラメータ ブロック値へのリンクを定義します。

元のメッシュ コードをプラグインの buildMesh ハンドラに貼り付けます。

マウス ツールを作成してオブジェクトに配置し、パラメータを定義します。

MAXSCRIPT

plugin simpleObject AntiStar
name:"AntiStar"
category:"HowTo"
classID:#(0xe855567c, 0xbcd73b8b)
(
parameters main rollout:params
(
num_faces type:#integer ui:num_faces default:10
radius1 type:#float ui:radius1 default:0
radius2 type:#float ui:radius2 default:0
width type:#float ui:width default:1
)
rollout params "AntiStar"
(
spinner num_faces "# Faces"range:[2,100,10] type:#integer
spinner radius1 "Radius 1 "range:[0,10000,0]
spinner radius2 "Radius 2 "range:[0,10000,0]
spinner width "Width "range:[0,90,1]
)

on buildMesh do
(
--Note: The code below has been taken from the
--How To – Create Custom Mesh Object 
--topic and is identical.

vert_array = #()
face_array = #()
vert_count = 0
for a = 0 to 360 by 360.0/num_faces do
(
v1 = [radius1*cos(a+width), radius1*sin(a+width), 0]
v2 = [radius1*cos(a-width), radius1*sin(a-width), 0]
v3 = [radius2*cos(a),radius2*sin(a),0]
append vert_array v1
append vert_array v2
append vert_array v3

append face_array [vert_count+1,vert_count+3,vert_count+2]
vert_count += 3
)
setMesh mesh verts:vert_array faces:face_array
)--end buildMesh
tool create
(
on mousePoint click do
(
case click of
(
1: coordsys grid (nodeTM.translation = gridPoint)
)
)
on mouseMove click do
(
case click of
(
2: (radius1 = abs(gridDist.y))
3: (radius2 = abs(gridDist.y))
4: (width = abs(gridDist.x))
5: (#stop)
)
)
)--end create
)--end plugin

ステップごとの解説

plugin simpleObject AntiStar
name:"AntiStar"
category:"HowTo"
classID:#(0xe855567c, 0xbcd73b8b)
(

スクリプト化されたプラグインは、コンストラクタの plugin で始まり、その後にスクリプト化されたプラグインのスーパークラス(simpleObject)、プラグインの新しいクラス名(AntiStar)が続きます。さらに、効果リストに表示される name と固有の classID を指定する必要があります。

シーンをロードするときにプラグイン クラスを識別するために、3ds Max では classID が使用されます。新しい固有の ID を生成するには、リスナー内で GenclassID () メソッドを使用し、結果をスクリプト内にコピーすることができます。

このプラグインのすべてのバージョンが常に互換性を保つようにするには、この classID をコピーすることをお勧めします。

スクリプト化された SimpleObject プラグイン

classID

parameters main rollout:params
(

このスクリプト化されたプラグインのパラメータはパラメータ ブロックに格納されます。ParamBlock2 形式は 3ds Max 3 で導入されており、プロパティとトラックの簡単な管理、UI での自動アニメーション ブラケットなどができるようになっています。この例では、最初のメッシュ スクリプトで使用したのと同じ値(面の数、2 つの半径、幅 (オフセット))を ParamBlock に格納します。

ブロック内のすべてのパラメータには、UI のプラグイン ロールアウトに対応するものがあります。ロールアウト名を提供することで、ParamBlock が内部的な値と UI 要素との間に自動接続を確立できるようにします。

Parameter_block2

num_faces type:#integer ui:num_faces default:10

num_faces オブジェクト プロパティは、オブジェクト内の「光線」の数、実際には面の数をコントロールします。これは整数であり、UI 内の同じ名前のスピナーに対応しています。面の既定の数は 10 です。

radius1 type:#float ui:radius1 default:10

radius1 オブジェクト プロパティは、オブジェクトの外径をコントロールします。これは浮動小数点値であり、UI 内の同じ名前のスピナーに対応しています。作成時の既定の半径は 10 です。MAXScript を使用してオブジェクトを作成する操作を、コンストラクタ antiStar(), を呼び出して行った場合、オブジェクトはこの値を既定値の外径として使用します。

radius2 type:#float ui:radius2 default:0

radius2 オブジェクト プロパティは、オブジェクトの内径をコントロールします。これは浮動小数点値であり、UI 内の同じ名前のスピナーに対応しています。作成時の既定の半径は 0 です。

width type:#float ui:width default:1

width オブジェクト プロパティは、外側の頂点のオフセットをコントロールし、光線の幅を定義します。これは浮動小数点値であり、UI 内の同じ名前のスピナーに対応しています。作成時の既定の幅は 1 です。

)
rollout params "AntiStar"
(
spinner num_faces "# Faces" range:[2,100,10] type:#integer
spinner radius1 "Radius 1" range:[0,10000,0]
spinner radius2 "Radius 2" range:[0,10000,0]
spinner width "Width" range:[0,90,1]
)

これで、Parameter Block によって参照される UI 要素をロールアウトに提供することができます。UI 要素は、オプションの range: パラメータを使用して入力される値を制限できますが、既定値は ParamBlock2 から取得されます。

ロールアウト句

スピナー

on buildMesh do (

buildMesh は、スクリプト化された simpleObject プラグインのメイン ハンドラです。このハンドラは、ジオメトリの更新が必要になるたびに呼び出されます。ハンドラ内部では、他のチュートリアルから取り込んだ既存のメッシュ生成コードを使用し、メッシュの頂点と面を生成します。

vert_array = #()
face_array = #()
vert_count = 0
for a = 0 to 360 by 360.0/num_faces do
(
v1 = [radius1*cos(a+width),radius1*sin(a+width),0]
v2 = [radius1*cos(a-width),radius1*sin(a-width),0]
v3 = [radius2*cos(a),radius2*sin(a),0]
append vert_array v1
append vert_array v2
append vert_array v3
append face_array [vert_count+1,vert_count+3,vert_count+2]
vert_count += 3
)
setMesh mesh verts:vert_array faces:face_array

buildMesh ハンドラは、オブジェクトをその場で作成する高速ルーチンにメッシュ生成データを提供する setMesh メソッドを受け入れます。

)--end buildMesh
tool create
(

tool create は、オブジェクト作成時のマウス コントロールを処理します。

スクリプト化されたマウス ツール

on mousePoint click do
(

on mousePoint ハンドラは、ユーザがビューポート内でマウスをクリックするたびに呼び出されます。変数 click で、クリック数をカウントします。

Mouse_Tools_Event_Handlers

case click of
(
1: coordsys grid (nodeTM.translation = gridPoint)

ユーザが初めてクリックした場合に、オブジェクトのノード変換行列の変換部分を、ユーザが指定したグリッド ポイントに設定することができます。これで、アクティブなグリッド内のクリックされた位置にオブジェクトの中心が再配置されます。

Mouse_Tools_nodeTM

Mouse_Tools_gridPoint

)
)
on mouseMove click do
(

on mouseMove ハンドラは、ユーザがビューポート内でマウスを動かすたびに呼び出されます。変数 click で、クリック数をカウントします。

Mouse_Tools_Event_Handlers

Case click of
(

case 式で、指定された変数の値に応じてオプションを選択することができます。この式は、同じ変数を複数の値と比較する複数の if ステートメントを使用する場合と似ています。

Case 式

2: (radius1 = abs(gridDist.y))

ユーザが 2 回クリックした場合は、外径をオブジェクトの中心から現在のマウス位置までの Y 距離に設定します。

Mouse_Tools_gridDist

3: (radius2 = abs(gridDist.y))

ユーザが 3 回クリックした場合は、内径をオブジェクトの中心から現在のマウス位置までの Y 距離に設定します。

4: (width = abs(gridDist.x))

ユーザが 4 回クリックした場合は、オブジェクトの中心から現在のマウス位置までの X 距離を計測することで、オフセットを外側の頂点に設定します。

5: (#stop)

最後に、作成を終了します。新しいオブジェクトが作成されます。

)
)
)--end create
)--end plugin

スクリプトの使い方

これはスクリプト化されたプラグインであり、3ds Max によって本物の C++ プラグインと同様に処理されます。

使用中のシステムに永久にインストールするには、このファイルを ¥plugins フォルダまたはプラグイン パスに表示されているその他の任意のフォルダにコピーします。

永久インストールを行わずにこのプラグンを試してみるには、コードを評価して、[作成] (Create)パネル > [ジオメトリ] (Geometry) > [HowTo]カテゴリを選択して表示されるドロップダウン リストを調べます。このプラグインは 1 つのセッションでのみ利用可能であり、3ds Max を再起動した後は利用できません。

シーン内でこのプラグインとともに保存された MAX ファイルを正しくロードするには、スクリプトがインストールされ、評価されている必要があります。

このプラグインを使用するには、[作成] (Create)パネル > [ジオメトリ] (Geometry) > [HowTo]をクリックして表示される[AntiStar]ボタンをクリックします。ビューポート内をクリックして中心を定義し、ドラッグして外径を定義します。再度クリックおよびドラッグして内径を定義し、もう一度クリックおよびドラッグして幅を定義します。クリックして終了するか、右クリックしてキャンセルします。

[修正] (Modify)パネル内の UI のコントロールを使用して再生し、スクリプトによってメッシュがどれほど速く更新されるかを観察してください。

戻る

「チュートリアル」のインデックス ページ