Unity云图渲染效果

需求

根据有限元分析后处理结果(应力等),将云图效果在Unity中复现同样的效果

需要准备的数据

从有限元分析软件(Abaqus、Ansys等)将模型结点数据进行导出

实现原理

Step1 通过C#根据结点(相当于模型顶点)数据大小将数据转化由红到蓝颜色区间的颜色(采用HSV色彩模型以便于获取纯色彩),获得一个模型顶点的Color数组;
Step2 将颜色传入着色器进行处理(AppToVert、VertToFrag),并通过纹理映射的方式从纹理贴图中获取相应的颜色值。

代码展示

1、C#代码。

public class CloudMapRendering
{
    public static Color[] CalculateModelVerticeColors(float[] physicsDatas)
    {
        colorDatas = new Color[physicsDatas.Length];
        float[] hueColorH = new float[physicsDatas.Length];
        float max = physicsDatas.GetMax();
        //当有限元网格结点值全为0时,颜色全为蓝
        if (max == 0)
        {
            for (int i = 0; i < physicsDatas.Length; i++)
            {
                colorDatas[i] = Color.blue;
            }
            return;
        }
        float min = physicsDatas.GetMin();
        float range = max - min;
        for (int i = 0; i < physicsDatas.Length; i++)
        {
            hueColorH[i] = 2.0f / 3 * (max - physicsDatas[i]) / range;
            colorDatas[i] = Color.HSVToRGB(hueColorH[i], 1, 1);
        }
        return colorDatas;
    }
}
public static class ArrayExtension
{
    public static float GetMax(this float[] vs)
    {
        float max = 0;
        for (int i = 0; i < vs.Length; i++)
        {
            if (vs[i] > max)
            {
                max = vs[i];
            }
        }
        return max;
    }
    public static float GetMin(this float[] vs)
    {
        float min = 0;
        for (int i = 0; i < vs.Length; i++)
        {
            if (vs[i] < min)
            {
                min = vs[i];
            }
        }
        return min;
    }
}

新建一个C#脚本挂在渲染模型上,调用上面的CalculateModelVerticeColors方法,并通过MeshFilter中的colors属性将计算值赋给colors属性。

2、着色器部分。

Shader "Custom/testCloudMapWireframeShader"
{
    Properties
    {
		_Texture("Main Tex",2D) = ""{}
	}
    SubShader
    {
		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag

			struct a2v {
				float4 vertex:POSITION;
				fixed4 color : COLOR;
				float4 texcoord:TEXCOORD0;
			};

			struct v2f {
				float4 position:SV_POSITION;
				float3 color:COLOR0;
				float4 uv:TEXCOORD1;
			};

			sampler2D _Texture;
			float4 _UVposition;
			//由于着色器用RGB进行计算,因此先转换为HSV
			float3 RGB2HSV(float3 c)
			{
				float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
				float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g));
				float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r));

				float d = q.x - min(q.w, q.y);
				float e = 1.0e-10;
				return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
			}
			//根据HSV颜色值映射到对应的纹理坐标进行纹理采样
			float3 ColorConvert(float3 originalHSVc)
			{
				return tex2D(_Texture, (1,(1 - originalHSVc.x) * 3) * step(2.0 / 3.0, originalHSVc.x) + (1,originalHSVc.x * 3 / 2) * step(originalHSVc.x, 2.0 / 3.0));
			}
			v2f vert(a2v v)
			{
				v2f f;
				f.position = UnityObjectToClipPos(v.vertex);
				f.color = v.color;
				f.uv = v.texcoord;
				return f;
			}

			fixed4 frag(v2f f) :SV_Target
			{
				float3 convertedColor = RGB2HSV(f.color);
				f.color = ColorConvert(convertedColor);
				return fixed4(f.color,1);
			}
			ENDCG
		}
		}
    FallBack "Diffuse"
}

纹理贴图

一张常见的颜色梯度图(左红右蓝)
在这里插入图片描述

后记

笔者第一次写文章,有很多地方都没有表述清楚,大家有问题或者意见也欢迎评论。

  • 11
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
### 回答1: Unity动态点云图是指在Unity引擎中,通过实时生成或更新点云数据来创建的三维模型。点云是由许多个点组成的,每个点都有三维坐标信息,并且可以拥有其他属性,如颜色、法线等。通过在Unity中加载点云数据并进行渲染,可以实现动态的点云图效果。 实现Unity动态点云图的基本步骤如下: 1. 读取点云数据:将点云数据导入Unity中,可以从本地文件或者其他数据源中读取。点云数据一般以文本或二进制格式存储,需要通过代码解析得到点的坐标、属性等信息。 2. 创建点云对象:根据解析得到的点云数据,可以在Unity中创建点云对象。可以使用Unity中的Mesh、PointRenderer等组件进行创建和渲染。 3. 更新点云数据:根据需要,可以在运行时动态更新点云数据。例如,可以从传感器或其他设备中获取实时点云数据,并将其合并或替换已有的点云对象中。 4. 实时渲染:在Unity中,可以使用渲染技术如Shader、GPU粒子系统等对点云进行渲染。可以根据点云的属性信息来对点进行着色,也可以根据相机的位置和角度来进行视图变换和裁剪,以实现真实感的渲染效果。 5. 交互与控制:可以添加用户交互和控制功能来改变点云的显示和行为。例如,可以通过鼠标或手势来移动相机或选取特定区域的点进行操作。 Unity动态点云图可以应用于许多领域,如三维重建、虚拟现实、增强现实等。通过实时更新点云数据和渲染,可以实现与用户的互动和环境的实时变化,为用户带来沉浸感和交互性。 ### 回答2: Unity 动态点云图是指在Unity引擎中创建和实时更新的动态点云图。点云是由许多三维点组成的集合,每个点都有坐标信息和可能的其他属性,如颜色和法线方向等。动态点云图是指这些点可以在实时场景中动态变化和移动。 在Unity中创建动态点云图,首先需要导入点云数据。可以通过多种方式导入,比如使用第三方库将点云数据从文件加载到Unity中,或者通过编程直接生成点云数据。导入完成后,可以利用Unity渲染技术将点云以真实感的方式呈现出来。 为了实现动态效果,可以通过改变点云数据来更新点云图。可以通过改变点的位置、颜色或其他属性来实现动态效果。可以通过编写脚本来实时更新点云数据,比如根据用户输入或游戏中的事件来改变点的位置或颜色等。 在渲染云图时,可以利用Unity的着色器和材质系统来实现更高级的渲染效果。可以使用着色器编写自定义的点云着色器,实现各种特效和样式,如光照、阴影、透明等。 总的来说,Unity提供了强大的工具和功能来创建和实时更新动态点云图。通过灵活使用这些工具和功能,可以实现各种各样的点云可视化效果,为用户带来更加沉浸和逼真的视觉体验。 ### 回答3: Unity是一款强大的游戏引擎,可以实现各种图形效果,包括动态点云图。动态点云图是一种以点云形式呈现的三维图形,点云中的每个点都有自己的位置和属性信息。 在Unity中创建动态点云图首先需要导入相关的点云数据。可以使用外部工具将点云数据转换为Unity支持的格式,如OBJ、FBX等。导入后,可以在Unity中创建一个空的游戏对象,并在其上添加Mesh Renderer和Mesh Filter组件。 接下来,需要将点云数据赋值给Mesh Filter组件的mesh属性。可以通过编写脚本来读取点云数据,并将其转换为Unity中的Mesh对象。然后,通过调用mesh.vertices属性将点云数据赋值给mesh,同时可以设置点云的颜色、大小、可见性等属性。 为了让点云图动态展示,可以使用Unity中的粒子系统,给每个点云添加一个粒子效果,并控制其移动、旋转、缩放等行为。可以通过编写脚本来控制粒子的行为,如通过修改粒子系统的速度、加速度、旋转角度等参数来实现动态效果。 此外,还可以通过添加脚本来实现与点云的交互效果,如点击、选中、拖拽等。可以通过捕捉鼠标或触摸事件,并根据用户的操作来改变点云的属性或行为。 总而言之,Unity提供了丰富的功能和工具,可以方便地创建和展示动态点云图。可以通过导入点云数据、设置点云的属性和效果、添加交互行为等方式来实现。利用Unity的强大功能和灵活性,可以创造出栩栩如生的、与用户互动的动态点云图
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值