2017-04-09 5 views
4

この講堂の座席エリアに椅子(エディター内)を記入し、すべて同じ焦点(舞台)に向けてください。私はその後、ランタイム中に異なる人で椅子をランダムに記入します。各ランの後、椅子は同じままにしておくべきですが、人々は次回のランニング中に群衆が違って見えるようにクリアする必要があります。ユニティ3Dの湾曲した空間を満たすためにオブジェクトを均等に配布する最良の方法は何ですか?

座席エリアには現在コライダーが取り付けられておらず、椅子も人もいません。

enter image description here

私は、彼らが同じ焦点をターゲットにして椅子を回転させるの世話をしている、このコードを発見しました。しかし、これを行うためのより良い方法があれば、私はまだ不思議です。あなたはwrite a editor script自動的に均等に配置することができます

//C# Example (LookAtPoint.cs) 
using UnityEngine; 
[ExecuteInEditMode] 
public class LookAtPoint : MonoBehaviour 
{ 
    public Vector3 lookAtPoint = Vector3.zero; 

    void Update() 
    { 
     transform.LookAt(lookAtPoint); 
    } 
} 

追加のスクリーンショット

enter image description here

enter image description here

enter image description here

答えて

3

。このスクリプトでは、

次のコードでは、世界およびローカル/モデルスペースは扱いません。必要なときにそれをすることを忘れないでください。

  1. グリッド内で+ yから-yまでの平行線を生成します。このグリッドのパッチサイズは、あなたの椅子とメッシュ(曲線空間)の大きさによって異なります。適切なパッチサイズを取得する。椅子(A)と曲面メッシュ(B)の境界ボックスを取得し、それらを分けて(B/A)、結果をパッチサイズとして使用します。

    Mesh chairMR;//Mesh of the chair 
    Mesh audiMR;//Mesh of the auditorium 
    var patchSizeX = audiMR.bounds.size.X; 
    var patchSizeZ = audiMR.bounds.size.Z; 
    var countX = audiMR.bounds.size.x/chairMR.bounds.size.x; 
    var countZ = audiMR.bounds.size.z/chairMR.bounds.size.z; 
    

    したがって、生成する必要がある光線の数は約countX*countZです。パッチサイズは(patchSizeX, patchSizeZ)です。

    その後、光線の原点を決定することができる。

    //Generate parallel rays that come form +y to -y. 
    List<Ray> rays = new List<Ray>(countX*countZ); 
    for(var i=0; i<countX; ++i) 
    { 
        var x = audiMR.bounds.min.x + i * sizeX + tolerance /*add some tolerance so the placed chairs not intersect each other when rotate them towards the stage*/; 
        for(var i=0; i<countZ; ++i) 
        { 
         var z = audiMR.bounds.min.z + i * sizeZ + tolerance; 
         var ray = new Ray(new Vector3(x, 10000, z), Vector3.down); 
         //You can also call `Physics.Raycast` here too. 
        } 
    } 
    
  2. は椅子を配置するpostionsを取得します。

    1. は、それは(あなたは椅子が置かれていません場所にいくつかの障害物を置くことができます。これらの障害物のためspecial layerを設定してください。)Physics.Raycast、あなたのメッシュに一時的に
    2. のforeach線をMeshColliderを添付
    3. ポイントを打撃を受けますヒットポイントにチェアを作成してステージに向かって回転させます。
  3. 実行時にこれらのヒットポイントを再利用してください。

    それぞれをモデル/ローカル空間点に変換します。後で実行時に使用するために、シリアライザを使用してjsonまたはassetに保存します。ランダムに人を配置します。

+0

xy平面またはzy平面で光線を生成することをお勧めしますか?私が示した写真は、半円形のレイアウトの一部です。人口を増やす必要がある3つのライザーがあります。また、どのように密度を決定するかわからない、椅子の境界ボックスと曲面メッシュベクトルはありますか?私は本当にあなたの助けに感謝します、これは本当に難しいです。 – johnny117

+0

すべての曲面メッシュを表示するスクリーンショットを提供できますか? – zwcloud

+0

私は椅子を置いている表面にコライダーがいません(そうすべきですか?)私の最終目標は人を椅子にランダムに配置し、定義されたポイントを持つことが理想的であるためです。私が使ったスプライン方法(新しいスクリーンショット参照)は面倒です。 – johnny117

関連する問題