Unity3d绘制标量场云图/Contour Map/Fringe

名词约定:

云图/Contour Map/Fringe——CFD/FEM名词,用颜色来表示某个节点(Node)或者网格(Cell)上的物理量。就像下图这样:

Grid——CFD/FEM名词,用来对物体/场等进行离散的网格;

Cell——CFD/FEM名词,Grid的最小单位,单个网格,常见的三维Cell有六面体、四面体,二维Cell有四边形、三角形;

Node——CFD/FEM名词,Cell的顶点,称为节点;

Mesh——计算机图形学名词,Unity3d/3dMax等用来进行三维建模的三角形网格;

Triangle——计算机图形学名词,Mesh的最小单位,单个三角形面片;

Vertice——计算机图形学名词,Triangle的顶点;

正文:
最近遇到个需求,就是用Unity来展示空间内的物理量,需要绘制标量场的云图。
网上找了找别人有的方案是写shader,网友御雪飞舞给我提供的方案是动态生成纹理图片,这两个方案应用前提是物理场可以由简单函数描述出来(shader一共传递不了几个参数,动态生成纹理也是事先给了分布函数)。
但是实际工程中的标量场复杂的多,不可能用简单函数来描述。比如说CFD计算结果是给出一堆离散点位置上的物理量的值。翻了翻乐乐同学的Unity shader入门,我发现了较为简单、CPU压力也低(因为活基本都丢给了GPU)的方案,概括起来就是:
指定一张颜色纹理,将要绘制的云图平面离散成Grid,按照Nodes坐标复制Vertices构建Mesh,根据Node的物理量计算对应的Vertice在纹理图片中的uv值,把uv值传给每一个Triangle进行渲染。

听起来像天书,实际操作一下很简单。
1: 指定颜色纹理
拿PhotoShop做了一张图片,导入Unity3d。


2:将要绘制的云图平面离散成Grid,按照Nodes坐标复制Vertices构建Mesh
我希望绘制两个声源产生的直达声声压级的云图,于是按照下图建模。黄色小方块是声源,一个距地面2.6m,一个距离地面2.2m,云图平面位于距地面1.5m处,直接用的Unity提供的Plane。


3:根据Node的物理量计算对应的Vertice在纹理图片中的uv值,把uv值传给每一个Triangle进行渲染。
给Plane挂脚本,传三个参数进去:ColorMapUpperLimit(色谱图上限值),ColorMapLowerLimit(色谱图下限值),ColorMap(色谱图纹理)。

核心功能代码如下,利用for循环遍历Mesh中每一个Vertice,前面是根据Vertice的全局坐标计算当地A加权声压,结果保存在float变量_sp中,从倒数第5行开始根据_sp计算纹理的uv值

public void DisplayDirectSoundPressure(){
        Mesh _mesh = GetComponent<MeshFilter> ().mesh;
        Matrix4x4 L_W_M = transform.localToWorldMatrix;
        Vector3[] _vertices = _mesh.vertices;
        int _count = _mesh.vertexCount;
        Vector2[] _uvs = new Vector2[_count];
        for (int i = 0; i < _count; i++) {
            Vector3 worldc = L_W_M.MultiplyVector (_vertices [i]);
            AcousticSound _s = new AcousticSound ();
            foreach (AcousticSource item in _sources) {
                _s += item.DirectSound (worldc);
            }
            float _sp = (float)_s.AWeightSoundPressure; 
            float u = (_sp - ColorMapLowerLimit) / (ColorMapUpperLimit - ColorMapLowerLimit);
            _uvs [i] = new Vector2 (u, 0);
        }
        _mesh.uv = _uvs;
    } 

纹理图片是从左到右的,只需要用线性插值计算u值,v值无关紧要随便给一个
float u = (_sp - ColorMapLowerLimit) / (ColorMapUpperLimit - ColorMapLowerLimit);
然后把uv值存进去
_uvs [i] = new Vector2 (u, 0);
最后把uv数组赋给mesh
 _mesh.uv = _uvs;
最终效果:


  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Unity3D热力分布图是一种基于图像颜色来表示游戏物体热度分布的技术。它可以将不同游戏物体的热度值在图像上进行热力分布展示,从而帮助开发者更好地了解游戏中物体的使用情况。此外,Unity3D热力分布图还可以帮助开发者优化游戏性能,通过分析图像来找到游戏中的性能瓶颈。 在Unity3D热力分布图中,每个游戏物体都会被分配一个颜色值,颜色值表示该物体的热度值。热度值越高,颜色越接近红色,热度值越低,颜色越接近蓝色。通过颜色的变化,开发者可以直观地了解到游戏中哪些物体最受玩家欢迎,哪些物体的使用率较低。 使用Unity3D热力分布图可以为开发者带来许多优势。首先它可以帮助开发者深入了解游戏中物体的使用情况,以便针对性地进行优化。其次,它可以节省开发者的时间,减少开发过程中的盲猜,从而更加高效地进行游戏性能优化。最后,它可以提高游戏质量和玩家的游戏体验。 综上所述,Unity3D热力分布图是一项非常有用的工具,可以帮助开发者更好地了解游戏中物体的使用情况,并为游戏性能优化提供有力的支持。 ### 回答2: Unity3D热力分布图C#是一种开发工具,旨在提供一个直观的方式来可视化分析Unity3D场景的性能瓶颈。Unity3D是一种跨平台游戏开发引擎,可用于开发游戏,仿真程序,虚拟现实和增强现实程序,等等。Unity3D热力图C#插件可用于分析代码和资源的影响,与CPU、GPU和内存资源的使用情况相关、并帮助开发人员从中优化其程序。它提供了一个实时热力图,可以通过色彩区分出哪些区域和代码或资源受到了最大的压力。这使得Unity3D开发人员能够诊断性能问题的根本原因,并加入适当的修复和调整。 Unity3D热力图C#还提供了附加的功能,例如一个在场景中跟踪物体数量及单个物体中各个组件的性能开销的模块。它也提供了与规则分析器的集成,以便能够通过自动化规则来分析场景中产生的瓶颈。Unity3D热力图C#是一个功能强大的工具,可以帮助Unity3D开发人员优化他们的程序,提高性能,并在设备上实现流畅酣畅的游戏体验。 ### 回答3: Unity 3D是一种非常流行的跨平台游戏引擎,它可以用来创建三维游戏、模拟器和其他交互式内容。Unity 3D具有非常完善的功能,可通过其功能丰富的编辑器和脚本 API 进行高度自定义的开发。其中,热力分布图(Heatmap)是Unity 3D中的一种运用图像表达数据的展示方式。 热力分布图常用于可视化位置和流量数据,通过颜色深浅的变化表现数据的项集中程度。对于游戏开发者而言,热力分布图非常有用。通过对玩家的行为、战斗、场景等数据进行可视化,能够展现游戏玩法的成功与失败之处。利用热力分布图的技术,游戏开发者可以更清楚地认识游戏特性的受欢迎程度和弊端,为后续的升级和改进提供有价值的参考意见。 当然,热力分布图不仅仅只在游戏开发中有用。其他领域如数据分析、推荐系统、商业应用中也有应用。总之,热力分布图只是我们在可视化数据时的一种方法,我们可以根据不同需求应用不同的可视化技术、创新可视化方式,让数据更加直观和易于理解。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值