我的游戏有一个绘图工具 - 一个循环线渲染器,用作标记来操纵线条形状的地形区域 . 一旦玩家停止绘制线条,这一切都会在运行时发生 . 到目前为止,我已经设法提升了与线条渲染器点的坐标相匹配的地形椎体,但是我很难提高落在标记形状内的点 . 这是描述我目前所拥有的图像:
我尝试使用"Polygon Fill Algorithm"(http://alienryderflex.com/polygon_fill/),但是一次将一个线提升到地形顶点是太有用了(即使算法缩小到仅围绕标记区域的矩形) . 此外,我的标记的轮廓点之间存在间隙,这意味着我需要在引发地形的线上添加半径,但这可能会使结果变得邋..
也许我应该丢弃绘图机制并使用带网格对撞机的网格作为标记?
如何将地形操作为与标记完全相同的形状,我们对任何想法都表示赞赏 .
当前代码:我使用this script来创建直线 - 第一个和最后一个直线点具有相同的坐标 . 当单击GUI按钮时,当前触发了用于操纵地形操纵的代码:
using System;
using System.Collections;
using UnityEngine;
public class changeTerrainHeight_lineMarker : MonoBehaviour
{
public Terrain TerrainMain;
public LineRenderer line;
void OnGUI()
{
//Get the terrain heightmap width and height.
int xRes = TerrainMain.terrainData.heightmapWidth;
int yRes = TerrainMain.terrainData.heightmapHeight;
//GetHeights - gets the heightmap points of the tarrain. Store them in array
float[,] heights = TerrainMain.terrainData.GetHeights(0, 0, xRes, yRes);
if (GUI.Button(new Rect(30, 30, 200, 30), "Line points"))
{
/* Set the positions to array "positions" */
Vector3[] positions = new Vector3[line.positionCount];
line.GetPositions(positions);
/* use this height to the affected terrain verteces */
float height = 0.05f;
for (int i = 0; i < line.positionCount; i++)
{
/* Assign height data */
heights[Mathf.RoundToInt(positions[i].z), Mathf.RoundToInt(positions[i].x)] = height;
}
//SetHeights to change the terrain height.
TerrainMain.terrainData.SetHeights(0, 0, heights);
}
}
}
1 回答
感谢Siim的个人帮助,得到了解决方案,感谢文章:How can I determine whether a 2D Point is within a Polygon? .
最终结果在这里可视化:
首先是代码,然后是解释:
使用的方法是一次填充一行形状 - “射线投射方法” . 事实证明,只有当给定的形状作为很多方面时,这种方法才开始占用更多的资源 . (形状的一侧是连接形状轮廓中两个点的线 . )当我发布这个问题时,我的线条渲染器有134个点定义线条 . 这也意味着形状具有需要通过光线投射检查的相同数量的边 . 当我将点数缩小到42时,方法变得足够快,而且形状几乎没有丢失任何细节 . 此外,我计划使用一些方法使轮廓更平滑,因此可以用更少的点来定义形状 .
简而言之,您需要以下步骤才能获得结果:
创建形状轮廓;
找到标记形状周围边界框的4个点;
开始射线投射盒子;
检查光线与形状边相交的次数 . 奇数的点位于形状内:
将属性分配给在形状中找到的所有点 .