ModelsUnderLayについて補足。
modelsUnderRay
シンタックス
member(キャストメンバー).modelsUnderRay(位置ベクトル, 方向ベクトル {, モデルの最大数, レベルオブディテール})
解説
3D コマンド。レイが当たるモデルのリストを返します。レイの開始位置を位置ベクトルに、レイの方向を方向ベクトルに指定します。どちらのベクトルもワールド座標で指定します。
オプションの maxNumberOfModels パラメータを指定すると、返されるリストの長さを制限できます。このパラメータを指定しない場合、指定されたレイが当たる、全モデルの参照を含むリストを返します。
オプションの levelOfDetail パラメータは、返される情報のレベルオブディテールを指定できます。levelOfDetail パラメータは、以下の値を取ります。
#simple。そのポイントから見つかったモデルへの参照を含むリストを返します。これはデフォルト設定です。
#detailed。交差するモデルを表すプロパティリストのリストを返します。各プロパティリストには以下のプロパティがあります。
#model。交差するモデルオブジェクトへの参照です。
#distance。locationVector で指定されるワールド位置から、モデルの交差ポイントへの距離です。
#isectPosition。交差ポイントのワールドスペースを表すベクトルです。
#isectNormal。交差ポイントのメッシュへのワールドスペース法線ベクトルです。
#meshID。交差するメッシュのメッシュ ID です。この ID は、meshDeform モディファイアのメッシュリストのインデックスとして使用できます。
#faceID。交差するフェイスのフェイス ID です。この ID は、meshDeform モディファイアのフェイスリストのインデックスとして使用できます。
#vertices。交差するフェイスの頂点のワールドスペース位置を表す、ベクトルの 3 つのエレメントリストです。
#uvCoord。フェイスの u および v の重心座標を表す、#u プロパティおよび #v プロパティを持つプロパティリストです。
返されたリストにある最初のモデルは、位置ベクトルで指定された位置に最も近いモデルで、最後にあるモデルは、その位置から最も遠いモデルです。
モデルごとに 1 つの交差 (最も近い交差) のみが返されます。
指定されたレイからモデルが見つからない場合は、空のリストを返します。
例文
次のステートメントは、ベクトル (0, 0, 300) の位置から Z 軸の方向を指すレイが当たるモデルの詳細情報を表示します。
put member("3d").modelsUnderRay(vector(0, 0, 300), vector(0, 0, -1), 3, #detailed)
-- [[#model: model("mSphere"), #distance: 275.0000, #isectPosition: vector( 0.0000, 0.0000, 25.0000 ), #isectNormal: vector( -0.0775, 0.0161, 0.9969 ), #meshID: 1, #faceID: 229, #vertices: [vector( 0.0000, 0.0000, 25.0000 ), vector( -3.6851, 1.3097, 24.6922 ), vector( -3.9017, 0.2669, 24.6922 )], #uvCoord: [#u: 0.0000, #v: 0.0000]]]
#isectNormalはけっこう使える。あとこれ、坂道の検出とかにも使えるっぽい。
衝突判定用ワールドを置く場合は、
member(キャストメンバー).modelsUnderRay(位置ベクトル, 方向ベクトル {, モデルの最大数, レベルオブディテール})
member(キャストメンバー).の部分を表示用ワールドではなくて判定用ワールドに書き換える。