unity如何往下挖地形_Unity3D地形挖坑
接着上次的二维面和三维面功能,在借助了高亮插件的点缀之后,能够达到一个让人满意的三维线效果。
最近研究了一下对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地形挖坑相关推荐
- unity如何往下挖地形_Unity3D分割地形Terrain
在制作地形的时候通常是直接刷出整个地形,但是在实际使用中也许地形过大,我们不能直接把整个地形完全加载,这样对内存的消耗很高,所以有时需要一小块一小块的加载地形.这时就需要把制作好的地形分割成几块后, ...
- unity如何往下挖地形_如何在unity地形上挖坑?
其实在很久以前我就研究过在Unity里如何对模型进行顶点控制的一些东西,并能够实现点筛选和挖坑.只是很大程度上挖坑的精确度取决于模型网格的疏密程度.如果网格顶点过于密集的话,就会影响运算的效率.关于挖 ...
- unity如何往下挖地形_Unreal Engine地形系统辨析(一)
Unreal Engine的地形系统称之为Landscape,每个level里面可以存放多个Landscape的Actor(但不能对它们进行连续编辑,也就是说相邻两个landscape是不能被同一个b ...
- Unity三维真实地形离线地形实时刷新,模拟飞行
三维地形下载资源使用了WorldComposer工具,推荐使用正版,具体使用流程不再多说,网上资料一大堆. 实现方式主要有几个步骤: 1)下载地图,并渲染地形,这个对内存有一定的要求,下载300公里- ...
- 基于cesium的地形开挖地形剖切
基于cesium地形开挖结合示例以及官方代码修改后封装TerrainClipPlan.js文件,在代码引入即可使用,详细介绍请往下看 一.地形剖切效果图 : 图一 图二 二.核心 ...
- UNITY编辑器模式下static变量的坑
UNITY编辑器模式下static变量的坑 在unity中写编辑器扩展工具,如在编辑器中加个菜单,点击这个菜单项时执行打包功能. 类如下,其中的静态变量,如果每次进来不清空,则LIST会越来越大,打包 ...
- Unity Android平台下插件/SDK开发通用流程
本文主要面向对Android开发不甚了解的Unity开发者,介绍了基于最新的Android Studio的标准Android开发环境与项目结构的配置流程,在此基础上,开发者可以快速的进行SDK的接入与 ...
- unity游戏引擎下的UGUI(2)
unity游戏引擎下的UGUI(1)unity游戏引擎下的UGUI_m0_57997518的博客-CSDN博客 4.Image Source Image(放图片)(图片要转换为2D and UI) C ...
- 【Unity】Dropdown下拉按钮的一些基本操作 获取值与添加选项
自己的老帖子,移植过来 原地址: http://www.manew.com/home.php?mod=space&uid=95681&do=blog&view=me&f ...
最新文章
- Mmseg中文分词算法解析
- hadoop免密钥配置
- Docker 使用Dockerfile构建Docker(三)
- esc键没反应_有机人名反应——Brown 硼氢化反应(Brown Hydroboration)
- 职称计算机承诺书,职称申报承诺书范本
- 《经济学人》报道Tether:在纽约被监管机构罚款
- 05:整数序列的元素最大跨度值
- js控制隐藏或显示table的某一行
- 汇编跳转指令(转载)
- Oracle恢复某个时间之前的数据
- 2021年井冈山中学高考成绩查询入口,【高考成绩】2019年高考成绩揭晓,井冈山中学取得好成绩!...
- pr中小人国微缩世界,速度快门的变化,动态地图,手写文字效果,打字机输入文字,照片定格效果
- Texstudio + sumatraPDF 正反向搜索关联设置
- Gartner发布2021年人工智能技术成熟度曲线
- 战神引擎mud2没有mysql文件_战神引擎架设不要(MongoDB)芒果数据库配置教程
- 题目 1018: 有规律的数列求和
- Google Android SDK开发范例大全
- python中find函数是什么意思_find函数什么意思
- Raft 算法详解(一)领导者选举
- 苦瓜炒鸡蛋怎么做 夏日降火家常菜