チュートリアル > スクリプト Geometry プラグインの作成 |
MAXScript によって、手続き型のメッシュ オブジェクトをその場で生成するスクリプト Geometry プラグインを通常の C++ プラグインと同様に作成することができます。
ここでは、「チュートリアル - カスタム メッシュ オブジェクトの作成」で作成した単純なメッシュ コードを使用して、それをスクリプト プラグインに拡張します。
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 と固有の classID を指定する必要があります。
シーンをロードするときにプラグインを識別するために、 classID が 3ds Max によって使用されます。新しい固有の ID を生成するには、リスナー内で GenclassID() メソッドを使用し、結果をスクリプト内にコピーすることができます。
このプラグインのすべてのバージョンが常に互換性を保つようにするには、この classID をコピーすることをお勧めします。
このスクリプト プラグインは、パラメータ ブロックにそのパラメータを格納します。ParamBlock2 形式は 3ds Max 3 で導入されており、プロパティとトラックの簡単な管理、UI での自動アニメーション ブラケットなどができるようになっています。この例では、最初のメッシュ スクリプトで使用したのと同じ値(平面の数、2 つの半径、幅 (オフセット))を ParamBlock に格納します。
ブロック内のすべてのパラメータには、UI のプラグイン ロールアウトに対応するものがあります。ロールアウト名を提供することで、ParamBlock が内部的な値と UI 要素との間に自動接続を確立できるようにします。
num_faces オブジェクト プロパティは、オブジェクト内の「光線」の数、実際には平面数をコントロールします。これは整数であり、UI 内の同じ名前のスピナーに対応しています。平面の既定の数は 10 です。
radius1 オブジェクト プロパティは、オブジェクトの外側の半径をコントロールします。これは浮動小数点値であり、UI 内の同じ名前のスピナーに対応しています。作成時の既定の半径は 10 です。オブジェクトを MAXScript を使用してコンストラクタ antiStar(), を呼び出すことにより作成した場合、オブジェクトはこの値を既定値の外側の半径として使用します。
radius2 オブジェクト プロパティは、オブジェクトの内側の半径をコントロールします。これは浮動小数点値であり、UI 内の同じ名前のスピナーに対応しています。作成時の既定の半径は 0 です。
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 から取得されます。
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 メソッドを受け入れます。
tool create は、オブジェクト作成時のマウス コントロールを処理します。
on mousePoint ハンドラは、ユーザがビューポート内でマウスをクリックするごとに呼び出されます。変数 click で、クリック数をカウントします。
ユーザが初めてクリックした場合に、オブジェクトのノード変換行列の変換部分を、ユーザが指定したグリッド ポイントに設定することができます。これで、アクティブなグリッド内のクリックされた位置にオブジェクトの中心が再配置されます。
on mouseMove ハンドラは、ユーザがビューポート内でマウスを動かすたびに呼び出されます。変数 click で、クリック数をカウントします。
case 式で、指定された変数の値に応じてオプションを選択することができます。この式は、同じ変数を複数の値と比較する複数の if ステートメントを使用する場合と似ています。
ユーザが 2 回クリックした場合は、外側の半径をオブジェクトの中心から現在のマウス位置までの Y 距離に設定します。
ユーザが 3 回クリックした場合は、内側の半径をオブジェクトの中心から現在のマウス位置までの Y 距離に設定します。
ユーザが 4 回クリックしている場合は、オブジェクトの中心から現在のマウス位置までの X 距離を計測することで、オフセットを外側の頂点に設定します。
これはスクリプト プラグインであり、3ds Max によって本物の C++ プラグインと同様に処理されます。
使用中のシステムに永久にインストールするには、このファイルを ¥plugins フォルダまたはプラグイン パスに表示されているその他の任意のフォルダにコピーします。
永久インストールを行わずにこのプラグンを試してみるには、コードを評価して、[作成](Create)パネル > [ジオメトリ](Geometry) > [HowTo]カテゴリを選択して表示されるドロップダウン リストを調べます。このプラグインは 1 つのセッションでのみ利用可能であり、3ds Max を再起動した後は利用できません。
シーン内でこのプラグインとともに保存された MAX ファイルを正しくロードするには、スクリプトがインストールされ、評価されている必要があります。
このプラグインを使用するには、[作成](Create)パネル > [ジオメトリ](Geometry) > [HowTo]をクリックして表示される[AntiStar]ボタンをクリックします。ビューポート内をクリックして中心を定義し、ドラッグして外側の半径を定義します。再度クリックおよびドラッグして内側の半径を定義し、もう一度クリックおよびドラッグして幅を定義します。クリックして終了するか、右クリックしてキャンセルします。
[修正](Modify)パネル内の UI のコントロールを使用して再生し、スクリプトによってメッシュがどれほど速く更新されるかを観察してください。