【问题标题】:MeshCollider on a procedurally generated Spherical mesh is not working properly程序生成的球形网格上的 MeshCollider 无法正常工作
【发布时间】:2020-09-29 07:08:33
【问题描述】:

我目前正在研究程序生成天体。计划是尽可能多地覆盖,但目前我只为恒星、行星、卫星和小行星准备好配置。

无论如何,回到主要点。我希望能够在随机生成的行星上四处走动,为此,我需要为用于地形生成的 Sphere 网格分配一个网格对撞机。

我确保在将网格分配给网格过滤器后添加 MeshCollider 组件,以防万一。在所有的噪波层都通过该网格的顶点“雕刻”完成之后,我将碰撞器网格设置为 meshfilter 网格。

    terrainMeshFilter.sharedMesh = shapeSettings.CreateTerrain(origin);
    if(terrainSphere.GetComponent<MeshCollider>() == null) terrainSphere.AddComponent<MeshCollider>();
    terrainSphere.GetComponent<MeshCollider>().sharedMesh = null;
    terrainSphere.GetComponent<MeshCollider>().sharedMesh = terrainMeshFilter.sharedMesh;

我对此进行了测试,但没有产生预期的结果。出于某种原因,播放器处于浮动状态。我确保施加“重力”,将玩家拉向地球,如下所示:

        Rigidbody rb = player.GetComponent<Rigidbody>();
        Transform playerTransform = player.GetComponent<Transform>();
        Vector3 gravityDirection = (playerTransform.position - origin).normalized;

        if(rb != null){
            rb.useGravity = false;
            rb.isKinematic = true;
            rb.AddForce(gravityDirection * gravity);
        }

但是玩家被困在“半空中”。它不会粘在地上。正在发生的另一件奇怪的事情是,如果我让玩家在半空中“奔跑”在地球上,并撞到一些非常高的山,那么与山的碰撞会被正确记录。这表明 MeshCollider 被正确分配,但如果是这样,为什么玩家漂浮在半空中?

感谢任何帮助。提前谢谢你。

注意:我还在下面分配了一些图片,从玩家的星球视角和星球外的第三人称视角(太空舱就是玩家)描绘了问题。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    没有看到网格线框是不可能给你一个正确的答案,但从你分享的小代码来看,我会说你的网格与你的实际网格数据不一致。这很可能是因为您使用的是 sharedMesh 而不是 mesh:尤其是在程序生成的对象上,这些数据可能根本不匹配,写入它们可能会导致不良影响。

    另外,关于重力,你的方法太简单了。看看this video about faux gravity systems and attractors 在行星上行走。

    ~皮诺

    【讨论】:

    • 好的,我看过那个视频,它和我已经在做的没什么不同。我在其他地方处理玩家轮换,我没有在这里包括它。但这一点有效。至于主要问题。 MeshCollider 组件没有“网格”变量。只有一个sharedMesh。这就是我使用它的原因。如果你想查看网格的线框,这里是:prnt.sc/upu1ys 谢谢你的时间。
    • 您好,图片不是很清晰:您可以用播放器进行正交线框拍摄吗?此外,您的变量gravityDirection 实际上是Gravity Up 方向,因为您是从行星中心减去玩家,而不是相反。
    • 是的,但是“重力”是一个负值,所以我猜这与获得正确的方向是一回事吗?我也使用重力方向向量来计算围绕行星的旋转,这就是为什么如果你想知道我为什么要这样做,我会得到相反的方向。 Image1:prnt.sc/upvomg Image2:prnt.sc/upvoyb 另外,您是否认为 CharacterController 组件正在搞乱刚体物理并阻止施加重力?我过去曾遇到过这样的问题,但不是这种性质的问题。
    • 好的,是的,这绝对是 CharacterController。我禁用了它,玩家倒在了地上。我想我将不得不编写自己的玩家移动脚本。我想知道 CharacterController 出了什么问题,它弄乱了 Force 应用程序。很烦人。不过,感谢您抽出宝贵时间。
    • 不客气!所以你正在使用 Unity 角色控制器?这恐怕是众所周知的不善于与他人相处,尤其是物理方面。
    猜你喜欢
    • 1970-01-01
    • 2015-08-31
    • 2013-09-30
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多