【问题标题】:How to handle sand in unity3dunity3d如何处理沙子
【发布时间】:2017-11-14 19:30:41
【问题描述】:

我有 Crane Animation,它会(通过它的下颚)捡起沙子,然后把它扔到卡车上。我试图找到在 Unity 中处理沙子的方法,但不幸的是一无所获。 所以我在 max 中制作了自定义沙子对象(低多边形)并将它们带到 Unity3d 中,并将盒子对撞机和刚体应用于它们。但是当我玩游戏时,我的 FPS 下降并且玩家几乎没有移动。 Profiler 告诉我们物理学是如此沉重(它应该是太多的对撞机和太多的刚体)。我试图通过碰撞矩阵和层来优化物理,但它并没有提高性能。

这是处理沙子与起重机相互作用的正确方法吗?

【问题讨论】:

  • 你为什么要标记这个 C#?相关代码在哪里?同样进行完全“逼真”的沙子模拟通常是过大的 - 使用粒子模拟(显示沙子流动)然后将沙子从起重机移动到卡车通常就足够了
  • 嗨,还没有代码。我添加 C# 的原因可能是任何可用于处理此问题的编码解决方案。如果您有更好的选择,那么您可以回答。这就是为什么我还问了替代方法。
  • 我已经提出了一个替代方案 - 使用粒子模拟来显示沙流,并在达到某个阈值时将其移动。如果您需要更现实的解决方案,则必须编写大量代码(包括网格变形和网格动态生成等内容)才能获得不错的性能
  • 即使使用粒子系统似乎也很难。你能推荐任何好的tut或参考吗?无论如何感谢您的贡献。
  • 基本上你应该在地形上的沙子上寻找体素,并使用 GPU 粒子来获得效果

标签: c# unity3d


【解决方案1】:

您可以将沙子作为地形并使用 terrain.SetHeights() 方法来降低使用起重机的特定地形区域。

当你降低或升高地形时,它看起来就像那些经典的地形编辑工具。

然后,无论您从沙子上“落下”何处,都可以使该区域升高一点。

我发现这个线程有一些代码示例来帮助你开始: https://forum.unity.com/threads/edit-terrain-in-real-time.98410/

private void raiseTerrain(Vector3 point)
{
    int terX =(int)((point.x / myTerrain.terrainData.size.x) * xResolution);
    int terZ =(int)((point.z / myTerrain.terrainData.size.z) * zResolution);
    float[,] height = myTerrain.terrainData.GetHeights(terX - 4,terZ - 4,9,9);  //new float[1,1];

    for(int tempY = 0; tempY < 9; tempY++)
        for(int tempX = 0; tempX < 9; tempX++)
        {
            float dist_to_target = Mathf.Abs((float)tempY - 4f) + Mathf.Abs ((float)tempX - 4f);
            float maxDist = 8f;
            float proportion = dist_to_target / maxDist;

            height[tempX,tempY] += 0.001f * (1f - proportion);
            heights[terX - 4 + tempX,terZ - 4 + tempY] += 0.01f * (1f - proportion);
        }

    myTerrain.terrainData.SetHeights(terX - 4, terZ - 4, height);
}

【讨论】:

  • 这将是一个蹩脚的解决方法,在寻找现实主义时真的不能接受。体素 + GPU 粒子是实现真实感和性能的唯一途径。
  • 这个问题从来没有提到“现实主义”,因此我的答案是一个有效的选择
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多