前段时间有一个小需求,模拟汽车烟尘烟尘尾迹仿真的算法,其中有一部分是需要判断汽车行驶的地形材质,根据地形材质来实现不同的效果,感觉这个功能还不错,于是拿出来给大家分享与交流。

其中借鉴了一个大佬的方法:http://answers.unity3d.com/questions/34328/terrain-with-multiple-splat-textures-how-can-i-det.html;

因为公路马路等一些地形是用的模型,于是最开始我的思路是在汽车轮胎下面发出射线,将模型设定标签,来进行检测。但是由于还有地形(Terrain)刷的草地、沙漠等地形通过射线无法判断,冥思苦想之后,终于在网上找到了一个很好的方法。

 public Terrain terrain; // 定义一个指定地形//在当前的地形上返回一个指定点的相对混合的纹理的一个数组//返回的数组中的长度将等于已经添加到地形的材质数组//worldPos 目标的坐标,在项目里指汽车坐标public float[] GetTextureMix(Vector3 worldPos){TerrainData terrainData = terrain.terrainData;Vector3 terrainPos = terrain.transform.position;//Debug.Log(terrainData);//计算指定的worldpos的网格贴图细节(忽略Y值)int mapX = (int)(((worldPos.x - terrainPos.x) / terrainData.size.x) * terrainData.alphamapWidth);int mapZ = (int)(((worldPos.z - terrainPos.z) / terrainData.size.z) * terrainData.alphamapHeight);//Debug.Log("mapX :" + mapX + " maxZ:" + mapZ);//当运动物体的坐标超出地形时返回nullif (mapZ < 0 || mapZ > terrainData.size.z || mapX < 0||mapX>terrainData.size.x){return null;}//以1x1xN 3d数组的形式获取此单元格的splat数据 (其中N =纹理数量)float[,,] splatmapData = terrainData.GetAlphamaps(mapX, mapZ, 1, 1);//Debug.Log("splatmapData+ "+splatmapData[0,0,0].ToString());// 将三维数组数据提取到一维数组中:float[] cellMix = new float[splatmapData.GetUpperBound(2) + 1];for (int n = 0; n < cellMix.Length; ++n){cellMix[n] = splatmapData[0, 0, n];}return cellMix;}

此方法用来返回汽车在地形上(忽略Y轴)的一个材质数组。(Terrain在此位置上可能出现的一个或者多个材质混合的数组)。

​//此方法用来返回在上述方法中获取的材质数组中权重最大的索引 public int GetMainTexture(Vector3 worldPos){float[] mix = GetTextureMix(worldPos);//运动目标超出地形范围if (mix==null){//错误return 100001;} // 返回最主要纹理的从零开始的索引// 在这个地形上。float maxMix = 0;int maxIndex = 0;// 循环遍历每个混合值并找到最大值//循环找到最大的那个就是当前贴图的indexfor (int n = 0; n < mix.Length; ++n){if (mix[n] > maxMix){maxIndex = n;maxMix = mix[n];}}return maxIndex;}​

此时已经获取到了当先运动物体(汽车)所处地形的材质索引。接下来我们来获取地形中材质的名称。

//获取地形材质的名称
public string GetTextureName (Vector3 WorldPos) {TerrainData td = terrain.terrainData;//获取地形使用的样条纹理SplatPrototype[] sp = td.splatPrototypes;//当前地形材质贴图数量为0,返回nullif(sp.Length==0){return null;    }//获取地形中材质混合最高的材质索引int index = GetMainTexture(transform.position);//发生运动物体(汽车)超出地形范围。if (index==100001){Debug.Log("100001");return "100001";}return sp[index].texture.name;}

此时我们已经拿到运动物体(汽车)在地形上的材质名称,通过材质名称来设置我们想要的效果。

总结:第一步先通过射线检测Collider的方式来进行第一层筛选(铺在地形上方的公路等材质),第二步进行地形材质的判断,通过这两步,基本能满足运动物体在地形上的判断。

unity识别地形材质相关推荐

  1. Unity地形材质贴图随高度变化

    地形材质贴图随高度变化 1. 导入Amplify Shader Editor插件 2. 进行可视化Shader编写 3. 给地形赋值材质球进行测试 4. 继续编写Shader 5. 最终效果 PS. ...

  2. FX粒子(Niagara系统)、顶点法线材质函数、材质参数集——雪和简单地形材质积雪效果

    雪 一.利用FX--Niagara系统创建粒子,模板选择 喷泉粒子模板      二.删除不需要的模块 球体位置发射.初始的向上速度.拖拽等和雪无关的模块删除. 三.添加需要的模块并设置 需要大范围降 ...

  3. Unity程序化地形教程 第一期 噪波图的制作

    Unity程序化地形教程 第一期 前言:最近在准备作品集,想吧Blender里面利用shader实现的程序化地形导入Unity中,发现我弄不了,于是转向了直接在Unity中实现程序化地形的新途径,但是 ...

  4. Unity 模型导入材质丢失解决方案

    Unity 模型导入材质丢失解决方案 1.模型导入材质丢失解决方案 步骤如下: 1.打开材质球 2.,反射率和法线贴图分别赋值,即下面的两个物体对号入座 3.渲染成功 2.3d人物模型材质丢失 步骤如 ...

  5. UE4--材质地形篇——地形材质的运用(混合材质)

    引言 我们所做的的地形材质都是多种多样的,有的地形是山地,其中可能有植被与岩石:有的地形是荒漠,它就包括了泥土与沙子.总之,其中材质远不止一种,那么我们如何创建多个材质组成的混合体呢? 我们创建材质的 ...

  6. Unity中利用材质自发光实现物体闪烁效果

    Unity中利用材质自发光实现物体闪烁效果 补充:这种方法有一点问题,在测试(Windows平台)的时候发现,要想在Build出来的游戏中实现闪烁效果,就必须在 Project 窗口中将源材质的自发光 ...

  7. 小功能⭐️Unity中利用材质自发光实现物体闪烁效果

    文章目录 本文基于VDer的文章<Unity中利用材质自发光实现物体闪烁效果>延伸开发 在实现了具有一个Material的物体闪烁发光之后,延伸开发了具有多个Material的自闪烁效果, ...

  8. Unity程序化地形教程集合

    Unity程序化地形教程集合 Unity程序化地形教程 第一期 Unity程序化地形教程 第二期

  9. ue4网格转地形_UE4教程:创建地形材质

    文件夹设置 完成地形的造型后即可为其添加材质,使其与现实世界中的地形相似. 在执行操作之前应先对文件夹进行设置,以便存储创建和迁移的内容. 在教程的此部分中,我们将创建以下四个文件夹. 如需了解在虚幻 ...

最新文章

  1. coba mysql_在Android Studio中将数据从MySQL数据库显示到TextView中-问答-阿里云开发者社区-阿里云...
  2. java 视频预览_java在上传视频时生成预览图
  3. 使用PyCharm创建Django项目及基本配置
  4. SQL Server2005完全卸载
  5. tensorflow-Inception-v3模型训练自己的数据代码示例
  6. Android 开发中常用小技巧
  7. hashmap中的hash扰动函数
  8. jmp、JE、JZ、JNE、JNT指令
  9. 利用SoapHeader验证web service调用的合法性(dwonmoon)
  10. ATL-CComCreator(CComCoClass的使用)
  11. 肌电信号的包络matlab程序_基于matlab的肌电信号处理程序
  12. [概率论与数理统计] 常用定义与公式
  13. html字母间距属性,html – 是否可以相对于font-size具有字母间距并正确继承?
  14. ZMQ == 服务端创建,接受请求的过程
  15. DEVONthink Pro作为浏览器插件脚本,如何使用
  16. python3.7.2怎么用不了pillow_python怎么加载Pillow包
  17. julia: ubuntu下安装
  18. b站安卓手机下载视频后使用matlab自动转为mp4文件并归档
  19. 数仓建模—表设计规范
  20. C#读取xml节点数据方法小结

热门文章

  1. mongodb aggregate中,使用$unwind对数组中的字典对象求和
  2. 伺服驱动器-速度环设计
  3. Facebook 面试 FAQ
  4. java JSON转String
  5. java sleep 失效_java:Thread.sleep()导致同步失效
  6. 教育基础知识与基本能力(知识点)
  7. 九个帮你修炼内功的设计师心法口诀
  8. PAT——1099 性感素数
  9. a标签js阻止跳转_js阻止a标签href跳转的方法
  10. 虚拟机上网及静态IP配置