基于贴花的热力图呈现方法参考

news2024/9/24 17:16:09

首先是热力图信息类:

using System;
using UnityEngine;

[Serializable]
public class HeatMapInfo
{
	public Rect rect = Rect.zero;
	public float pixelDensity = 1;
	public float valBase = 0;
	public float valRange = 1;
	public PercentColor[] ribbon;//色带
	public Color colorMulti = Color.white;
	public float influence = 100;//点影响范围
	public PosVal[] posVals;
}

[Serializable]
public class PercentColor
{
	public float percent = 0;
	public Color color = Color.clear;
	public PercentColor(float percent, Color color)
	{
		this.percent = percent;
		this.color = color;
	}
}

[Serializable]
public class PosVal
{
	public Vector3 pos;
	public float val;
	public PosVal(Vector3 pos, float val)
	{
		this.pos = pos;
		this.val = val;
	}
}

然后是热力图的实现代码:

using UnityEngine;
using UnityEngine.Rendering.Universal;

public class HeatMap : MonoBehaviour
{
	static public HeatMap instance;

	void Awake()
	{
		instance = this;
	}

	[SerializeField]
	DecalProjector decalProjector;

	void Start()
	{
		SceneLoader.instance.AddActBeforeActiveNewScene(CancelHeatMap);
	}

	HeatMapInfo info;
	public void SetHeatMap(HeatMapInfo info)
	{
		this.info = info;
		if (this.info == null) return;
		//
		decalProjector.gameObject.SetActive(true);
		decalProjector.pivot = new Vector3(this.info.rect.x + this.info.rect.width * 0.5f, this.info.rect.y + this.info.rect.height * 0.5f, 0);
		decalProjector.size = new Vector3(this.info.rect.width, this.info.rect.height, 2000);
		Texture2D tex2D = GetHeatMap(this.info);
		decalProjector.material.SetTexture("_MainTex", tex2D);
		decalProjector.material.SetColor("_Color", this.info.colorMulti);
	}

	public void CancelHeatMap()
	{
		info = null;
		decalProjector.gameObject.SetActive(false);
	}

	public void UpdateHeadMap(PosVal[] posVals)
	{
		if (info == null) return;

		info.posVals = posVals;
		Texture2D tex2D = GetHeatMap(this.info);
		decalProjector.material.SetTexture("_MainTex", tex2D);
	}

	public Texture2D GetHeatMap(HeatMapInfo info)
	{
		float pixelDensity = info.pixelDensity * 0.05f;
		int texW = (int)(info.rect.width * pixelDensity);
		int texH = (int)(info.rect.height * pixelDensity);
		Texture2D texHeatMap = new Texture2D(texW, texH);
		//
		float unitU = 1.0f / texW;
		float unitV = 1.0f / texH;
		Vector2 pos = new Vector2();
		float influence = info.influence;
		PercentColor[] ribbon = info.ribbon;
		Color colorOutHot = ribbon[ribbon.Length - 1].color;
		float sqrtInfluence = influence * influence;
		for (int i = 0; i < texW; i++)
		{
			pos.x = unitU * i * info.rect.width + info.rect.x;
			for (int j = 0; j < texH; j++)
			{
				Color color = colorOutHot;
				pos.y = unitV * j * info.rect.height + info.rect.y;
				foreach (PosVal pv in info.posVals)
				{
					float sqrtDist = (pos - new Vector2(pv.pos.x, pv.pos.z)).sqrMagnitude;
					if (sqrtDist > sqrtInfluence) continue;
					//
					float pointDensity = (pv.val - info.valBase) / (info.valRange);
					pointDensity = Mathf.Clamp01(pointDensity);

					float dist = Mathf.Sqrt(sqrtDist);
					float pe = dist / influence;
					float percent = pe + (1 - pe) * (1 - pointDensity);
					Color ribbonColor = Color.black;
					if (Mathf.Approximately(percent, 0))
					{
						ribbonColor = ribbon[0].color;
					}
					else if (Mathf.Approximately(percent, 1))
					{
						ribbonColor = ribbon[ribbon.Length - 1].color;
					}
					else
					{
						for (int k = 1; k < ribbon.Length; k++)
						{
							if (percent < ribbon[k].percent)
							{
								float p = (percent - ribbon[k - 1].percent) / (ribbon[k].percent - ribbon[k - 1].percent);
								ribbonColor = Color.Lerp(ribbon[k - 1].color, ribbon[k].color, p);
								break;
							}
						}
					}
					color += ribbonColor * (1 - pe);
				}
				texHeatMap.SetPixel(i, j, color);
			}
		}

		texHeatMap.Apply();
		return texHeatMap;
	}
}

最后是贴花Shader

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/798324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关联分析-Apriori

关联分析-Apriori 1. 定义 关联分析就是从大规模数据中&#xff0c;发现对象之间隐含关系与规律的过程&#xff0c;也称为关联规则学习。 2. 相关概念 2.1 事务、项与项集 订单号购买商品0001可乐、薯片0002口香糖、可乐0003可乐、口香糖、薯片 以上面的订单为例&#xf…

一套流程6个步骤,教你如何正确采购询价

采购询价&#xff08;RFQ&#xff09;是一种竞争性投标文件&#xff0c;用于邀请供应商或承包商就标准化或重复生产的产品或服务提交报价。 询价通常用于大批量/低价值项目&#xff0c;买方必须提供技术规格和商业要求&#xff0c;该文件有时也称为招标书或投标邀请书。询价流…

客户问题解决平台-帮助与支持中心

在现代企业中&#xff0c;帮助与支持中心扮演着至关重要的角色。随着市场的竞争日趋激烈&#xff0c;客户对于产品和服务的期望也越来越高。因此&#xff0c;建立一个高效的客户问题解决平台是企业成功的关键之一。本文将探讨帮助与支持中心的作用&#xff0c;介绍其功能和优势…

Linux(二)--Linux基础命令

我们在前面学习的Linux命令&#xff0c;其实它们的本体就是一个个的二进制可执行程序。 和Windows系统中的.exe文件&#xff0c;是一个意思。 一.Linux的目录结构 Linux的目录结构是一个树形结构。 Windows系统可以拥有多个顶级目录&#xff0c;称之为盘符&#xff0c;如C盘&…

Journal of Information Security and Applications (JISA) 投稿经验分享

Journal of Information Security and Applications (JISA) 投稿经验分享 基本情况: 中科院三区 JCR Q2 2023影响因子&#xff1a;5.6 老牌信息安全类期刊 投稿经验&#xff1a; With editor 周期&#xff1a; 1-2个月&#xff0c;稍微有点慢 Under review 周期&#xff1a; 2…

Nautilus Chain 即将发行治理通证 NAUT ,生态发展进程加速

独特且优势明显的 Nautilus Chain 目前&#xff0c;行业内首个模块化底层 Nautilus Chain 已经上线主网&#xff0c;并且即将有超过 70 个应用原生部署在 Nautilus Chain 上。Nautilus Chain 本身是一个以 Layer3 为定位的区块链系统&#xff0c;其通过 Celestia 模块化底层来获…

C++初阶之一篇文章让你掌握string类(模拟实现)

string类模拟实现 1.为什么要模拟实现string2.string的模拟实现需要注意哪些问题3.经典的string类问题4.写时拷贝5.传统版写法的String类&#xff08;参考&#xff09;6.现代版写法的String类&#xff08;参考&#xff09;7.string类的模拟实现&#xff08;讲解&#xff09;7.1…

Vue基础-综合案例(基于vue2)

一、目标 能够知道如何使用vue-cli创建vue项目能够知道如何在项目中安装与配置element-ui能够知道element-ui中常见组件的用法能够知道如何使用axios中的拦截器能够知道如何配置proxy接口代理 二、目录 vue-cli组件库axios拦截器proxy跨域代理用户列表案例 vue-cli 1.什么…

浅谈密码学的由来

目录 1.什么是密码学 2.密码学的发展 3.密码学的应用 4.密码学未来的发展趋势 1.什么是密码学 密码学是关于安全通信的科学研究&#xff0c;它研究如何在敌对环境中保护通信的机密性、完整性和身份验证。密码学涉及使用各种算法和技术来加密和解密信息&#xff0c;以确保只有…

C++基础算法⑤——递推算法(昆虫繁殖 过河卒 Pell数列 上台阶 流感传染 移动路线)

递推掌握核心&#xff1a; 递推公式(规律)递推边界(初始化条件) 分析题目意思&#xff1a;如下图 递推式&#xff1a;a[n] a[n-1]a[n-2]; 递推边界&#xff1a;a[1]1 a[2]2 #include<iostream> using namespace std; long long a[100],x,y,z; int main(){ //昆虫繁衍…

c++类和对象(拷贝构造、运算符重载、初始化列表、静态成员、友元等)

一、拷贝构造 拷贝构造函数的特征&#xff1a; 1、拷贝构造函数是构造函数的一个重载形式&#xff1b; 2、拷贝构造函数的参数只有一个且必须是同类类型对象的引用&#xff0c;使用传值方式编译器直接报错&#xff0c;因为会引发无穷递归调用。 在c中自定义类型传值传参的时…

vue中的.env文件分析

问题说明 有米有小伙伴&#xff0c; 在看一个新鲜的项目的时候&#xff0c; 会发现在项目中会有类似于下方的文件。 那这些文件是干什么的呢&#xff1f; 它们在项目中会有什么作用呢&#xff1f; 如何调用这些文件的呢 问题解答 0&#xff0c;对于vue中模式与环境变量的说…

专注:如何提高专注力和注意力的简要指南

专注力和集中力可能很难掌控的很好。大多数人都想学习如何提高注意力和注意力。但真的做到了&#xff1f;我们生活在一个嘈杂的世界里&#xff0c;不断的分心会使注意力难以集中。 此指南包含有关如何获得并保持专注的研究。我们将分解提升您的思维并关注重要事物背后的理论依…

平衡二叉树介绍

一、树的概念 1.1 空树和非空树 空树&#xff1a;结点数为0的树 非空树&#xff1a;有且仅有一个根节点。其中&#xff0c;没有后继的结点叫叶子结点&#xff0c;有后继的结点叫做分支结点。 如下图所示&#xff1a; 1.2树的属性 除了根结点外任何一个结点都有且仅有一个前…

阿里Java开发手册~应用分层

1. 【推荐】图中默认上层依赖于下层&#xff0c;箭头关系表示可直接依赖&#xff0c;如&#xff1a;开放接口层可以依赖于 Web 层&#xff0c;也可以直接依赖于 Service 层&#xff0c;依此类推&#xff1a; 开放接口层 &#xff1a;可直接封装 Service 方法暴露成 RP…

600就能用上7000MHz的DDR5内存,这套32GB的光威天策真是快又稳

大家都知道&#xff0c;DDR5内存性能提升很大&#xff0c;而且Intel 13代平台和AMD Zen 4平台都已经兼容了&#xff0c;可以带来更稳定的性能表现&#xff0c;之前因为DDR5内存价格高昂&#xff0c;许多消费者望而却步&#xff0c;而随着今年DDR5内存售价的逐渐下降&#xff0c…

css3的filter图片滤镜使用

业务介绍 默认&#xff1a;第一个图标为选中状态&#xff0c;其他三个图标事未选中状态 样式&#xff1a;选中状态是深蓝&#xff0c;未选中状体是浅蓝 交互&#xff1a;鼠标放上去选中&#xff0c;其他未选中&#xff0c;鼠标离开时候保持当前选中状态 实现&#xff1a;目前…

Docker的数据管理和Dockerfile的指令

Docker的数据管理 一、Docker数据的概念1、数据卷2、数据卷容器 二、端口映射三、容器互联&#xff08;使用centos镜像&#xff09;四、Docker 镜像的创建1、基于现有镜像创建&#xff08;1&#xff09;首先启动一个镜像&#xff0c;在容器里做修改&#xff08;2&#xff09;然…

经营在线业务的首选客服工具--SS客服

随着网购正在快速取代传统零售业&#xff0c;各行各业的企业都在大力发展电子商务以取悦客户。但是&#xff0c;有这么多可用的电子商务平台&#xff0c;选择一款符合自己发展的平台确实不容易。电子商务平台不仅是企业在线销售产品和服务的地方&#xff0c;也是他们管理日常运…

Vue2基础三、计算属性侦听器

零、文章目录 Vue2基础三、计算属性&侦听器 1、计算属性computed &#xff08;1&#xff09;基础语法 概念&#xff1a; 基于现有的数据&#xff0c;计算出来的新属性。 依赖的数据变化&#xff0c;自动重新计算。计算属性会对计算出来的结果缓存&#xff0c;再次使用…