如何展平游戏对象下的地形?


10

我有一个脚本,可以创建地形对象并用纹理对其进行绘制,但是我遇到了问题。当我尝试放置游戏对象(例如unity提供的简单水对象)时,我使用了射线投射来确定放置游戏对象的正确高度,但这只是确保将其正确放置在该特定点上。

我该如何平整游戏对象下方的地形,以使其在山丘的情况下不会进入地形或挂在稀薄的空气中?


3
找到在游戏对象下形成地形三角形的所有顶点。使所有这些顶点的y坐标相同。
MichaelHouse

Answers:


6

正如我在评论中所说,您将要查找组成游戏对象下三角形的所有顶点,并将其y值设置为相同的值。

我将通过更详细的步骤来扩展我的评论。我对Unity不太熟悉,所以我不知道要使用哪种最佳工具,但是我相信我可以帮助您正确地开始工作。

蛮力法:

  1. 从游戏对象直接投射一缕光线。网格应足够紧,以确保不会在地形表面遗漏任何三角形。
  2. 对于击中物体的每条光线,您可以使用以下内容在地形网格中获取三角形:

    RaycastHit hit;
    if (!Physics.Raycast(camera.ScreenPointToRay(Input.mousePosition), out hit))
        return;
    
    MeshCollider meshCollider = hit.collider as MeshCollider;
    if (meshCollider == null || meshCollider.sharedMesh == null)
        return;
    
    Mesh mesh = meshCollider.sharedMesh;
    Vector3[] vertices = mesh.vertices;
    int[] triangles = mesh.triangles;
    Vector3 p0 = vertices[triangles[hit.triangleIndex * 3 + 0]];
    Vector3 p1 = vertices[triangles[hit.triangleIndex * 3 + 1]];
    Vector3 p2 = vertices[triangles[hit.triangleIndex * 3 + 2]];
  3. p0,p1和p2是构成被命中三角形的三个顶点的所有位置。您想要将每个顶点位置调整为具有相同的y值。您可以收集所有顶点,然后将它们全部设置为平均值y,或者可以使用y放置游戏对象时发现的初始拾取值。

优化:

  • 您不仅可以投射光线网格,还可以将碰撞器从游戏对象上扫下,并收集游戏对象碰撞器与地形碰撞网格之间的碰撞接触点。然后,对于每个这些接触点,执行上面的步骤以获取要移动的顶点。

  • 以这样的方式创建地形,即每个顶点xz值与网格对齐,并且其y值仅变化。现在,您可以轻松获取游戏对象的边界,并更改这些边界内所有顶点的y值。

最后的优化实际上是一种可能易于实现且相当有效的替代方法。


据我所知,Terrain(docs.unity3d.com/Documentation/ScriptReference/Terrain.html)对象具有TerrainColliderdocs.unity3d.com/Documentation/ScriptReference/…)而不是MeshCollider(docs.unity3d.com/Documentation / ScriptReference /…),因此它缺少您在步骤2中尝试使用的sharedMesh属性。我假设我需要某种逻辑来修改terrainData属性存储的高度图。
Rapida 2013年

您可以在此处查看:forum.unity3d.com/threads/…此外,地形对象似乎具有规则的网格,因此第二个优化可能是您的最佳选择。
MichaelHouse

1

它通常要使对象下面的地面平坦,并使其周围的地面平滑。

如果土地是由网格制成的,并且建筑物是轴向对齐的,则这会容易得多。

在一般情况下,您可以将建筑物所在的三角形细分,然后将建筑物所在的三角形上的所有顶点的y设置为相同y,然后对一定距离内的所有顶点进行中点位移平滑而不是自己在建筑物下。

我已经使用这种方法将道路放到3D地形上。

通常,您希望在建筑物之间强制执行最小间隔,以便有足够的地面进行平滑处理。或者,您可以在放置之前临时运行算法,并查看是否超过了某些陡峭度阈值,从而监管用户可以放置建筑物的位置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.