位置: 编程技术 - 正文

Unity3D动态地形网格一(unity2018地形)

编辑:rootadmin
最近一直都在搞flash3D,好像有点对不起Unity3D的朋友们了。这次简单的写一个动态创建地形网&#;的脚本给大家分享一下。 这次是第一部分,仅仅实现了通过高度图动态生成地形的部分。假如以后有心情和时间,再来慢慢的补充多通道刷地形材质、动态刷地形和保存高度图等的功能吧。以前我都不喜欢公开脚本源码,都是一个个部分的单独讲解然后让朋友们自己去组合起来的,但最近时间实在是不多,所以还是直接提供源码,然后在源码上面写注释,大家自行的观看吧。源码在最下面。更多内容,请访问狗刨学习网 首先直接把脚本拖到某物体上面,运行,就会出现了上图所示的一个面片。这是因为为了方便大家测试,我在start里面调用了下面的SetTerrain方法。这个方法会创建一个默认的地形面板。长宽是*,段数是*,高度是-米到米的。 当然了,我们真正用的时候,是使用重载的SetTerrain方法自己制定长宽高和段数这些数&#;的,把start里面的方法注释掉就行了。现在由于没有指定默认的地面材质和高度图,所以我写了个警告提示。这两个变量就是材质和高度图了,大家可以自行想办法去赋&#;。我现在写成public只是为了方便赋&#;测试,最好还是写get/set方法赋&#;。还有一点,现在没有做地面的多通道材质,所以只是用了一个默认的shader。以后假如需要混合通道材质,改这个shader。好,先不管以后了,把一个有草地纹理的材质球付给脚本。出来了一个草地我随便的用黑白图刷了一个高度图,然后扔进脚本。注意的是,作为高度图的图片,是需要设置读写权限的,不然获取不到像素的颜色出现了一个小小的山坡了。其实我这个脚本并不是必须针对黑白图的,我随便拿了一张木箱子贴图,一样可以做高度图的,这是因为我是做了灰度处理的,最后获取的是该图片像素点上的灰度&#;。看,地形出来了。实际效果 功能是简单了点,这里提供了一点点的思路,有需要或者有兴趣的朋友可以参考一下做法,自行的扩展吧。源码:TerrainManager.csusing UnityEngine;using System.Collections;public class TerrainManager : MonoBehaviour { //材质和高度图 public Material diffuseMap; public Texture2D heightMap; //顶点、uv、索引信息 private Vector3[] vertives; private Vector2[] uvs; private int[] triangles; //生成信息 private Vector2 size;//长宽 private float minHeight = -; private float maxHeight = ; private Vector2 segment; private float unitH; //面片mesh private GameObject terrain;// Use this for initializationvoid Start () { //默认生成一个地形,如果不喜欢,注销掉然后用参数生成 SetTerrain(); } /// /// 生成默认地形 /// public void SetTerrain() { SetTerrain(, , , ,-,); } /// /// 通过参数生成地形 /// /// 地形宽度 /// 地形长度 /// 宽度的段数 /// 长度的段数 /// 最低高度 /// 最高高度 public void SetTerrain(float width, float height, uint segmentX, uint segmentY,int min,int max) { Init(width, height, segmentX, segmentY,min,max); GetVertives(); DrawMesh(); } /// /// 初始化计算某些&#; /// /// /// /// /// /// /// private void Init(float width, float height, uint segmentX, uint segmentY, int min, int max) { size = new Vector2(width, height); maxHeight = max; minHeight = min; unitH = maxHeight - minHeight; segment = new Vector2(segmentX, segmentY); if (terrain != null) { Destroy(terrain); } terrain = new GameObject(); terrain.name = "plane"; } /// /// 绘制网&#; /// private void DrawMesh() { Mesh mesh = terrain.AddComponent().mesh; terrain.AddComponent(); if (diffuseMap == null) { Debug.LogWarning("No material,Create diffuse!!"); diffuseMap = new Material(Shader.Find("Diffuse")); } if (heightMap==null) { Debug.LogWarning("No heightMap!!!"); } terrain.renderer.material = diffuseMap; //给mesh 赋&#; mesh.Clear(); mesh.vertices = vertives;//,pos); mesh.uv = uvs; mesh.triangles = triangles; //重置法线 mesh.RecalculateNormals(); //重置范围 mesh.RecalculateBounds(); } /// /// 生成顶点信息 /// /// private Vector3[] GetVertives() { int sum = Mathf.FloorToInt((segment.x &#; 1) * (segment.y &#; 1)); float w = size.x / segment.x; float h = size.y / segment.y; int index = 0; GetUV(); GetTriangles(); vertives = new Vector3[sum]; for (int i = 0; i < segment.y &#; 1; i&#;&#;) { for (int j = 0; j < segment.x &#; 1; j&#;&#;) { float tempHeight = 0; if (heightMap != null) { tempHeight = GetHeight(heightMap, uvs[index]); } vertives[index] = new Vector3(j * w, tempHeight, i * h); index&#;&#;; } } return vertives; } /// /// 生成UV信息 /// /// private Vector2[] GetUV() { int sum =Mathf.FloorToInt( (segment.x &#; 1) * (segment.y &#; 1)); uvs = new Vector2[sum]; float u = 1.0F / segment.x; float v = 1.0F / segment.y; uint index = 0; for (int i = 0; i < segment.y &#; 1; i&#;&#;) { for (int j = 0; j < segment.x &#; 1; j&#;&#;) { uvs[index] = new Vector2(j * u, i * v); index&#;&#;; } } return uvs; } /// /// 生成索引信息 /// /// private int[] GetTriangles() { int sum = Mathf.FloorToInt(segment.x * segment.y * 6); triangles = new int[sum]; uint index = 0; for (int i = 0; i < segment.y; i&#;&#;) { for (int j = 0; j < segment.x; j&#;&#;) { int role = Mathf.FloorToInt(segment.x) &#; 1; int self = j &#;( i*role); int next = j &#; ((i&#;1) * role); triangles[index] = self; triangles[index &#; 1] = next &#; 1; triangles[index &#; 2] = self &#; 1; triangles[index &#; 3] = self; triangles[index &#; 4] = next; triangles[index &#; 5] = next &#; 1; index &#;= 6; } } return triangles; } private float GetHeight(Texture2D texture, Vector2 uv) { if (texture != null) { //提取灰度。如果强制读取某个通道,可以忽略 Color c = GetColor(texture, uv); float gray = c.grayscale;//或者可以自己指定灰度提取算法,比如:gray = 0.3F * c.r &#; 0.F * c.g &#; 0.F * c.b; float h = unitH * gray; return h; } else { return 0; } } /// /// 获取图片上某个点的颜色 /// /// /// /// private Color GetColor(Texture2D texture, Vector2 uv) { Color color = texture.GetPixel(Mathf.FloorToInt(texture.width * uv.x), Mathf.FloorToInt(texture.height * uv.y)); return color; } /// /// 从外部设置地形的位置坐标 /// /// public void SetPos(Vector3 pos) { if (terrain) { terrain.transform.position = pos; } else { SetTerrain(); terrain.transform.position = pos; } }}

推荐整理分享Unity3D动态地形网格一(unity2018地形),希望有所帮助,仅作参考,欢迎阅读内容。

Unity3D动态地形网格一(unity2018地形)

文章相关热门搜索词:unity动态加载地图,unity动态场景,unity动态场景,unity动态场景,unity3d 地形,unity动态加载地图,unity动态加载地图,unity3d 地形,内容如对您有帮助,希望把文章链接给更多的朋友!

Unity3D技术之资源数据库 (AssetDatabase)详解 【狗刨学习网】资源数据库(AssetDatabase)资源数据库(AssetDatabase)是允许您访问工程中的资源的API。此外,其提供方法供您查找和加载资源,还可创建、删

Unity3D游戏开发之多线程及使用多线程 Unity3D游戏开发之多线程及使用多线程Unity3D中的多线程。线程是一个相当复杂的话题,但如果掌握了它,就可以从容的使用多个硬件处理器或处理很难划

unity3d游戏开发之我见 游戏引擎想必大家都有所耳闻吧,比如当你在喝着可乐,盯着电脑屏幕,看到游戏场景内的角色在自己键盘鼠标的控制之下,享受着这种游戏的操作感

标签: unity2018地形

本文链接地址:https://www.jiuchutong.com/biancheng/373037.html 转载请保留说明!

上一篇:unity3D游戏开发之边锋(杭州)聘:游戏策划/设计/U3D/测评/文案等(Unity3D游戏开发培训课程大纲)

下一篇:Unity3D技术之资源数据库 (AssetDatabase)详解(unity 3d资源)

  • 一般纳税人暂未开具发票
  • 房地产公司自用房屋销售土地增值税计算
  • 捐赠劳务支出可在企业所得税前扣除吗
  • 软件研发阶段和开发阶段如何区分
  • 会展服务费怎么开票
  • 增值税发票跨年抵扣新政策
  • 非居民企业出租境内不动产
  • 向境外分配股息
  • 工资核算方式
  • 销售应税消费品应交的消费税
  • 计提企业所得税怎么计算
  • 一次性收到跨期租赁费会计分录
  • 个人独资企业所得税税率表最新
  • 预缴的附加税还可以扣减吗
  • 分支机构享受了税收优惠,是由总机构备案还是分支机构备案?
  • 应交税费借方余额填列资产负债表
  • 购买方已抵扣
  • 开发票征收品目怎么填
  • 合同签订中,可以撤销吗
  • 利润表里的其他业务利润怎么形成的
  • 其他应付款包括应付职工薪酬吗
  • 建设项目投资中的预备费包括
  • 华为鸿蒙双击背面打开健康码
  • 系统日志在哪里打开
  • 虚拟机安装苹果系统全过程
  • 增值税发票的进项和出项要一致吗
  • 公司增资怎么做
  • linux中gedit命令
  • PHP:get_meta_tags()的用法_url函数
  • PHP:base64_encode()的用法_url函数
  • php数组函数,选班长
  • 企业所得税直接法和间接法
  • 最早的滑盖手机,摄像头可以自动旋转
  • uniapp相关面试题
  • 基于php技术
  • 未按规定采取预防措施,导致发生严重突发事件的
  • php数组求最大值
  • 购买方收到的违约金计入
  • php正则表达式匹配字符串
  • 内资企业
  • 小规模企业做账表格
  • 网络安全工具大全图片
  • ecshop功能
  • 没有发票的支出可以扣除企业所得税么
  • 流动比率取值是取期末
  • 企业职工生活费
  • 财务费用税前扣除标准是多少
  • 裁员补偿金如何合理避税
  • 阿里云ecs重装
  • sql server 2008数据库
  • 增值税专用发票怎么开
  • 平价转让股权怎么做账
  • 买一赠一税务局答复
  • 公司捐赠给个人公司要交税吗
  • 甲供材料怎么记账
  • 外币折算会计思维导图
  • 政府补贴的装修费是免税的吗
  • 其他应付现金流量表
  • 会计事务所给的发票
  • 单据 凭证
  • 收到货款会计分录怎么写
  • 股权变更产生的税费
  • 出纳和记账会计哪个好
  • Windows10安装包下载
  • w10预览版新功能
  • xp系统弹出广告怎么处理
  • linux下xhost命令报错:unable to open display的解决办法
  • 怎么关闭获取手机信息
  • win8适用的pr
  • python基本用法
  • 一不小心做错事男朋友就开始说我
  • python3中raw_input的用法
  • python 解析
  • 2000元工资交多少党费
  • 广东省地方税务局
  • 吉林省工伤保险咨询电话
  • 汽车销售流程有哪些环节?每个环节的主要内容是什么?
  • 房产税纳税义务时间
  • 河北省房产评估机构排名
  • 预先支付货款
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设