【问题标题】:What is the best way to evenly distribute objects to fill a curved space in Unity 3D?在 Unity 3D 中均匀分布对象以填充弯曲空间的最佳方法是什么?
【发布时间】:2017-09-04 07:56:13
【问题描述】:

我想用椅子(在编辑器中)填充这个礼堂座位区,并让它们都面向同一个焦点(舞台)。然后我将随机地用不同的人填充椅子(在运行时)。每次跑步后,椅子应该保持不变,但应该让人离开,以便在下一次跑步时人群看起来不同。

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

我发现这段代码负责旋转椅子,使它们瞄准同一个焦点。但是我仍然很好奇是否有更好的方法来做到这一点。

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

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

其他截图

【问题讨论】:

    标签: unity3d distribute placement evenly


    【解决方案1】:

    您可以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 ray, Physics.Raycast it(你可以在没有椅子的地方放置一些障碍物。为这些障碍物设置special layer。)
      3. 获取生命值并在生命值处创建一把椅子并将其朝向舞台旋转
    3. 重用这些生命值,让您的人员处于运行时。

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

    【讨论】:

    • 好的,您建议在 xy 平面或 zy 平面生成光线吗?我展示的图片是半圆形布局的一部分。还有 3 个其他立管需要填充。另外,我不确定如何确定密度,椅子的边界框和弯曲的空间网格矢量?非常感谢您的帮助,这真的很难。
    • 您能否提供一张显示您所有弯曲空间网格的屏幕截图?
    • 我放置椅子的表面没有对撞机(应该吗?)我喜欢你的方法,因为我的最终目标是随机将人放在椅子上并定义点将是理想的。我用过的样条法(见新截图)很乱。
    • 是的,要使用光线投射,网格应该附加一个碰撞器。但我认为你需要更多地描述你想要什么以及在什么样的环境中。两个重要方面: 1. 这些椅子/人什么时候放置?在运行时还是仅在编辑器中? 2. 会再次随机放置吗?如果是这样,椅子和人是否都被清理并重新放置?在运行时?请编辑您的问题向我们展示更多信息。
    • 好的。如果需要任何其他信息,请告诉我。
    猜你喜欢
    • 2023-03-22
    • 2019-10-28
    • 2021-12-07
    • 1970-01-01
    • 2015-12-18
    • 2023-03-20
    • 2020-10-14
    • 2022-08-11
    • 2010-10-10
    相关资源
    最近更新 更多