2017-04-09 32 views
4

我想用椅子填满礼堂座位区(在编辑器中),让他们都面临同一焦点(舞台)。然后我将随机填充椅子(在运行时)。每次运行后,椅子应该保持不变,但人员应该清理干净,以便在下次运行时人群看起来不同。在Unity 3D中均匀分布对象以填充曲面空间的最佳方式是什么?

座位区域目前没有连接对撞机,椅子和人也没有。

enter image description here

我发现这个代码用了那么他们的目标相同的焦点旋转椅的照顾。但我仍然很好奇,如果有更好的方法来做到这一点。

//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

可以write a editor script自动放置均匀。在这个脚本中,

我不处理下面的代码中的世界和本地/模型空间。记住要做到这一点,当你需要。

  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. 获取志愿服务岗位放置椅子。

    1. 附加MeshCollider到您的网暂时
    2. 的foreach射线,Physics.Raycast它(你可以把上不会有放了一把椅子的地方一些障碍。设置special layer那些障碍。)
    3. 获得击中点并在生命值创建椅子并将其转向舞台
  3. 重复使用这些生命值将您的人员置于运行时。

    将它们中的每一个转换为模型/局部空间点。并通过序列化将它们保存到json或资产中,以便以后在运行时使用:随机放置人员。

+0

好的,你会推荐在xy平面或zy平面生成光线吗?我所展示的图片是半圆形布局的一部分。还有3个其他立管需要填充。另外,我不确定如何确定密度,是椅子的边界框和曲面空间网格矢量?我非常感谢你的帮助,这真的很难。 – johnny117

+0

你能提供一个显示你所有曲线空间网格的截图吗? – zwcloud

+0

我放置椅子的表面没有碰撞器(应该吗?)我喜欢你的方法的声音,因为我的最终目标是随机将人放在椅子上,并且定义的点将是理想的。我用过的样条方法(见新截图)很混乱。 – johnny117

相关问题