チュートリアル > オブジェクトのサーフェスへの移動 |
ここでは、ユーザが Z 軸に沿ってオブジェクトを移動させ、指定されたサーフェスに合わせる方法について説明します。このスクリプトを使用して、地面の上に樹木やポールなどを自動的に配置することができます。
macroScript は MoveToSurface と呼ばれます。スクリプトを使用する場合は、[カスタマイズ](Customize)に移動してスクリプトを[HowTo]カテゴリからツールバー、メニュー、またはクアッド メニューにドラッグするか、キーボード ショートカットを割り当てることができます。
このカスタム関数は、ジオメトリ オブジェクトに対するフィルタとして使用されます。この関数はパラメータとしてオブジェクトを受け取り、そのオブジェクトが Geometry スーパークラスの場合は true、それ以外の場合は false を返します。
このカスタム関数は、実際のレイの交差を行います。この関数はパラメータとしてオブジェクトを受け取り、そのオブジェクトが Geometry スーパークラスの場合は true、それ以外の場合は false を返します。
ここで、移動されるオブジェクトの開始位置と -Z 軸に沿った方向で、カスタムの Ray 値を定義します。
次に、レイの Z 位置を交差するサーフェスの最も高い Z 位置よりやや上に移動します。このようにして、レイが -Z 軸に沿ってサーフェスにヒットする機会があることを確認します。
組み込み intersectRay 関数は、ノードとレイ (開始ポイントと方向付きの間隔ベクトル) を指定され、レイがノードのサーフェスをヒットしたときはスペース内のそのポイントを返し、交差がない場合は undefined を返します。この交差の結果も、計算された最後の値であるため、関数の戻り値です。
少なくとも 1 つのオブジェクトが選択されている場合にのみ、このスクリプトには意味があります。シーン内に選択されたオブジェクトがない場合、スクリプトは無効になります。'on isEnabled' ハンドラは、'return' ステートメントの後の式を評価して、有効状態をコントロールします。結果が false の場合、スクリプトのボタン応答メニュー項目は淡色表示され、アクティブにすることはできません。
Macroscript_Body_Event_Handlers
このスクリプトの本体は、「on Execute」ハンドラに含まれています。これは、ボタンを押したり、メニュー項目を選択したり、割り当てられているショートカット キーを押したりすることでスクリプトが起動すると実行されます。
Macroscript_Body_Event_Handlers
pickObject 関数によって、ユーザがシーン内でオブジェクトを選択できるようになります。ここに提供したフィルタ関数によって、Geometry オブジェクトのみを選択できるようにします。マウスが Lights、Helpers などの他のオブジェクトの上に移動しても、それらのオブジェクトは登録されません。結果は、ユーザ変数の target_mesh に書き出されます。選択が取り消された場合、この変数には選択したノードまたは undefined のいずれかが含まれます。
選択されたオブジェクトが有効なオブジェクトの場合(つまり、ユーザが実際にオブジェクトを選択して、取り消しのために[Esc]キーを押したり、マウスを右クリックしたりしなかった場合)
必要に応じてすべてのオブジェクトを元の状態に戻すことができるようにするアンドゥ コンテキストを定義します。
さらに、現在の選択内のすべてのオブジェクトを巡回するループを作成します。ループの反復ごとに、変数 i には選択からの別のオブジェクトが含まれます。
ここで、定義したユーザ関数を呼び出し、ユーザによって選択された target_mesh オブジェクトと、選択を巡回するループ内の現在のオブジェクトを渡します。結果は、undefined または交差のポイント、つまり -Z に沿ったターゲット オブジェクトのサーフェス上にあるオブジェクトの位置の投影です。
交差が実際に存在する場合は、現在のオブジェクトの位置をそのポイントに設定するだけです。存在しない場合、つまり交差が undefined の場合は、このステップをスキップします。