接着上次的二维面和三维面功能,在借助了高亮插件的点缀之后,能够达到一个让人满意的三维线效果。

最近研究了一下对Unity自身的地形做高度控制的一些东西,有一点小小的成果,现在就分享给大家。

其实在很久以前我就研究过在Unity里如何对模型进行顶点控制的一些东西,并能够实现点筛选和挖坑。只是很大程度上挖坑的精确度取决于模型网格的疏密程度。如果网格顶点过于密集的话,就会影响运算的效率。关于挖模型的东西以后有机会再整理一下发上来吧。

先上图:

1.点选多边形区域,用的是上次的那个三维线,加上了高亮插件的效果。还不错吧。

2.点击执行塌陷,多边形区域内的地形向下塌陷。

先说一下我大体上的思路吧:

1.在画多边形区域的时候,把所有顶点(Vector3)都记录在一个list里。

2.执行塌陷,遍历地形中所有的像素点判断是否在多边形区域内,如果在区域内,变化顶点高度,如果不在区域内,不予处理。

3.在这里我的筛选用了一个点是否在多边形内的算法。就是从这个点向多边形发射线,如果交点的个数是基数,则表示这个点在多边形内部,如果交点的个数是偶数,则表示该点在多边形外部。这个算法对于凸多边形和凹多边形同样成立。

4.在做高度控制的时候,还需要对地形的API有所了解。

5.对了,里边还有一个根据高度数据生成地貌的东东,大致的内容就是读取TXT,然后根据TXT里的高度信息,给地形赋值。

大致的核心内容就这些吧,至于一些具体的处理细节,看代码吧。

Digging脚本:

using UnityEngine;

using System.Collections;

using System.Collections.Generic;

public class Digging : MonoBehaviour

{

public DrawMeshLine meshline;

Terrain ter;

void Start ()

{

ter = GetComponent();

}

void Update ()

{

}

void OnGUI ()

{

if(GUILayout.Button("塌陷"))

{

TerDigging(meshline.LinePointContainer,ter);

}

}

//地形塌陷

void TerDigging (ListPoints,Terrain ter)

{

float[,] tempHeight = new float[1,1];

float[,,] tempAlpha = new float[1,1,1];

tempAlpha[0,0,0] = 1.0f;

tempHeight[0,0] = 0.0f;

for(int i = 0 ; i < ter.terrainData.heightmapWidth ; i ++)

{

for(int j = 0 ; j < ter.terrainData.heightmapHeight ; j ++)

{

float terHeight = ter.terrainData.GetHeight(i,j);

Vector3 terPointPos = new Vector3(i,terHeight,j);

if(isPointInPolygon(terPointPos,Points))

{

ter.terrainData.SetHeights(i,j,tempHeight);

ter.terrainData.SetAlphamaps(i,j,tempAlpha);

}

}

}

}

//判断点是否在一个多边形内

bool isPointInPolygon (Vector3 Point,ListPoints)

{

int j=0, cnt = 0;

for (int i = 0; i < Points.Count; i++)

{

j = (i == Points.Count - 1) ? 0 : j + 1;

if ((Points[i].z!=Points[j].z)&&(((Point.z >= Points[i].z) && (Point.z < Points[j].z)) || ((Point.z >= Points[j].z) && (Point.z < Points[i].z))) && (Point.x < (Points[j].x - Points[i].x) * (Point.z - Points[i].z) / (Points[j].z - Points[i].z) + Points[i].x)) cnt++;

}

return (cnt%2>0)?true:false;

}

}

高度控制代码里的Alphamap是为了以后改进用的,在当前并没有用到。

TerrainCreate脚本:

using UnityEngine;

using System.Collections;

using System.Collections.Generic;

using System.IO;

public class TerrainCreate : MonoBehaviour

{

Terrain ter;

int mapWidth;

int mapHeight;

StreamReader sr;

void Start ()

{

//获取当前地形实例

ter = GetComponent();

//获取地形的宽和高的分辨率

mapWidth = ter.terrainData.heightmapWidth;

mapHeight = ter.terrainData.heightmapHeight;

print(mapWidth + " " + mapHeight);

//地形高度二维数组

float[,] heights = new float[mapWidth,mapHeight];

ListtempHeight = new List();

//读取TXT坐标点

print(Application.dataPath);

sr = File.OpenText(Application.dataPath + @"\dx.asc");

//TODO...

int ncols = int.Parse(sr.ReadLine().Replace("ncols","").Trim());

int nrows = int.Parse(sr.ReadLine().Replace("nrows","").Trim());

//print(ncols + " " + nrows);

for(int i = 0 ; i < 4 ; i ++)

{

sr.ReadLine();

//TODO...

}

//遍历地形上的每个像素点

for(int i = 0 ; i < nrows ; i ++)

{

string lineInfo = sr.ReadLine();

string[] lineString = lineInfo.Split(new char[]{' '});

for(int j = 0 ; j < ncols ; j ++)

{

if(lineString[j].Trim() != "")

{

float temp = 0.0f;

float.TryParse(lineString[j],out temp);

if(temp == -9999)temp = 200.0f;

heights[i,j] = temp;

tempHeight.Add(temp);

}

}

}

tempHeight.Sort();

for(int ii = 0 ; ii < nrows ; ii ++)

{

for(int jj = 0 ; jj < ncols ; jj ++)

{

heights[ii,jj] = heights[ii,jj] / NormalHeight(tempHeight[tempHeight.Count - 1]);

}

}

//地形高度赋值

ter.terrainData.SetHeights(0,0,heights);

}

//给高度一个标准的数量级,避免因为高度过大超出地形的高度限制

int NormalHeight (float temp)

{

int num = 0;

while(temp > 1)

{

num ++;

temp = temp / 10;

}

return (int)Mathf.Pow(10,num);

}

}

当然,现在做的这个只是个雏形,东西太简陋,算法还没有经过优化,只是能够勉强实现这个功能,但是在效率和实用性方面还达不到要求。

代码写的也是漏洞百出,不过我相信,只要思路是对的,稍加改进,一定是个很好的功能。

工程:http://www.vdisk.cn/down/index/12784387

unity如何往下挖地形_Unity3D地形挖坑相关推荐

  1. unity如何往下挖地形_Unity3D分割地形Terrain

    在制作地形的时候通常是直接刷出整个地形,但是在实际使用中也许地形过大,我们不能直接把整个地形完全加载,这样对内存的消耗很高,所以有时需要一小块一小块的加载地形.这时就需要把制作好的地形分割成几块后, ...

  2. unity如何往下挖地形_如何在unity地形上挖坑?

    其实在很久以前我就研究过在Unity里如何对模型进行顶点控制的一些东西,并能够实现点筛选和挖坑.只是很大程度上挖坑的精确度取决于模型网格的疏密程度.如果网格顶点过于密集的话,就会影响运算的效率.关于挖 ...

  3. unity如何往下挖地形_Unreal Engine地形系统辨析(一)

    Unreal Engine的地形系统称之为Landscape,每个level里面可以存放多个Landscape的Actor(但不能对它们进行连续编辑,也就是说相邻两个landscape是不能被同一个b ...

  4. Unity三维真实地形离线地形实时刷新,模拟飞行

    三维地形下载资源使用了WorldComposer工具,推荐使用正版,具体使用流程不再多说,网上资料一大堆. 实现方式主要有几个步骤: 1)下载地图,并渲染地形,这个对内存有一定的要求,下载300公里- ...

  5. 基于cesium的地形开挖地形剖切

            基于cesium地形开挖结合示例以及官方代码修改后封装TerrainClipPlan.js文件,在代码引入即可使用,详细介绍请往下看 一.地形剖切效果图 :  图一 图二   二.核心 ...

  6. UNITY编辑器模式下static变量的坑

    UNITY编辑器模式下static变量的坑 在unity中写编辑器扩展工具,如在编辑器中加个菜单,点击这个菜单项时执行打包功能. 类如下,其中的静态变量,如果每次进来不清空,则LIST会越来越大,打包 ...

  7. Unity Android平台下插件/SDK开发通用流程

    本文主要面向对Android开发不甚了解的Unity开发者,介绍了基于最新的Android Studio的标准Android开发环境与项目结构的配置流程,在此基础上,开发者可以快速的进行SDK的接入与 ...

  8. unity游戏引擎下的UGUI(2)

    unity游戏引擎下的UGUI(1)unity游戏引擎下的UGUI_m0_57997518的博客-CSDN博客 4.Image Source Image(放图片)(图片要转换为2D and UI) C ...

  9. 【Unity】Dropdown下拉按钮的一些基本操作 获取值与添加选项

    自己的老帖子,移植过来 原地址: http://www.manew.com/home.php?mod=space&uid=95681&do=blog&view=me&f ...

最新文章

  1. Mmseg中文分词算法解析
  2. hadoop免密钥配置
  3. Docker 使用Dockerfile构建Docker(三)
  4. esc键没反应_有机人名反应——Brown 硼氢化反应(Brown Hydroboration)
  5. 职称计算机承诺书,职称申报承诺书范本
  6. 《经济学人》报道Tether:在纽约被监管机构罚款
  7. 05:整数序列的元素最大跨度值
  8. js控制隐藏或显示table的某一行
  9. 汇编跳转指令(转载)
  10. Oracle恢复某个时间之前的数据
  11. 2021年井冈山中学高考成绩查询入口,【高考成绩】2019年高考成绩揭晓,井冈山中学取得好成绩!...
  12. pr中小人国微缩世界,速度快门的变化,动态地图,手写文字效果,打字机输入文字,照片定格效果
  13. Texstudio + sumatraPDF 正反向搜索关联设置
  14. Gartner发布2021年人工智能技术成熟度曲线
  15. 战神引擎mud2没有mysql文件_战神引擎架设不要(MongoDB)芒果数据库配置教程
  16. 题目 1018: 有规律的数列求和
  17. Google Android SDK开发范例大全
  18. python中find函数是什么意思_find函数什么意思
  19. Raft 算法详解(一)领导者选举
  20. 苦瓜炒鸡蛋怎么做 夏日降火家常菜

热门文章

  1. 数据结构与算法基础(王卓)(19):遍历二叉树算法的实现
  2. 我们是一群坚定的青年,从未向时间屈服
  3. from matplotlib import pyplot as plt 的基本用法
  4. python 生存分析_生存分析之KM法
  5. 刷屏的变脸软件,火一把就死?
  6. markdown入门3--数学符号希腊字母等
  7. Fatal Python error: Aborted
  8. 2022年A特种设备相关管理(电梯)复训题库及答案
  9. 海量日志存储和查询方法及系统
  10. windows10 局域网共享