【Unity】简单实现生成式电子围栏

【Unity】简单实现生成式电子围栏

三维电子围栏是一种通过使用三维技术和电子设备来建立虚拟围栏,用于监控和控制特定区域的系统。它可以通过使用传感器和摄像头来检测任何越界行为,并及时发出警报。这种技术可以应用于安防领域以及其他需要对特定区域进行监控和防护的场合。

示例下载
实现效果

动态生成

区域标识

警报效果

实现方法

方法很简单下面附上全部代码。通过坐标位置、高度和颜色参数动态生成电子围墙。自由组合,生成多组多样式围栏。

实现代码:

使用两个点的坐标和它们的高度来构建基本网格,然后将其拼接起来形成一整列墙。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;public class ElectronicWallControl : MonoBehaviour
{public GameObject[] WallPiont;Vector3[] WallPos;Dictionary<string, GameObject> WallDic = new Dictionary<string, GameObject>();GameObject WallFa;// Start is called before the first frame updatevoid Start(){WallPos = new Vector3[WallPiont.Length];for (int i = 0; i < WallPiont.Length; i++){//提取gameobjct的坐标WallPos[i] = WallPiont[i].transform.position+new Vector3(0,0.5f,0);}CreateWallMesh("Wall_1", WallPos, 5, Color.blue, 1);}public Material WallMat;//参考材质public void CreateWallMesh(string id, Vector3[] pos, float high, Color colorNew, float intensity = 0.5f){if (!WallDic.ContainsKey(id)){GameObject area = new GameObject(id);if (!WallFa){WallFa = new GameObject();WallFa.name = "AreaFa";}MeshFilter filter = area.AddComponent<MeshFilter>();MeshRenderer renderer = area.AddComponent<MeshRenderer>();filter.mesh = CreateMesh(pos, high,out float uvy);//创建网格Material material = new Material(WallMat);//float factor = Mathf.Pow(2, intensity);//material.color = new Color(colorNew.r * factor, colorNew.g * factor, colorNew.b * factor);material.SetFloat("_UVy", uvy);material.SetFloat("_High", high);renderer.sharedMaterial = material;renderer.receiveShadows = false;renderer.shadowCastingMode = ShadowCastingMode.Off;area.transform.parent = WallFa.transform;WallDic.Add(id, area);}else{WallDic[id].SetActive(true);}}Mesh CreateMesh(Vector3[] pos, float high,out float dis){int length = pos.Length;int triLength = length * 6;Vector3[] vertices = new Vector3[length * 2];for (int i = 0; i < length; i++){vertices[i] = pos[i];vertices[i + length] = new Vector3(pos[i].x, pos[i].y + high, pos[i].z);}Vector2[] UV = new Vector2[length * 2];dis = 0;for (int i = 0; i < length; i++){if (i != 0){dis += Vector3.Distance(vertices[i], vertices[i - 1]);}UV[i] = new Vector2(0, dis);UV[i + length] = new Vector2(high, dis);}int[] NewTriangles = new int[triLength];for (int i = 0; i < length - 1; i++){NewTriangles[i * 6 + 0] = i + length;NewTriangles[i * 6 + 1] = i + 1;NewTriangles[i * 6 + 2] = i;NewTriangles[i * 6 + 3] = i + length + 1;NewTriangles[i * 6 + 4] = i + 1;NewTriangles[i * 6 + 5] = i + length;}Mesh newMesh = new Mesh();newMesh.vertices = vertices;newMesh.triangles = NewTriangles;newMesh.uv = UV;return newMesh;}
}

围栏shader:

Shader "Unlit/EWall"
{Properties{_MainTex ("Texture", 2D) = "white" {}[HDR] _Color("Color",Color) = (1,1,1,0)  _Speed("Speed",float) = 1  //幅度_UVy("UVy",float) = 0  //UV的y值}SubShader{Tags { "RenderType" = "TransparentCutout" "IgnoreProjector" = "True" "Queue" = "Transparent" }LOD 100Cull Off  //关闭剔除Blend SrcAlpha OneMinusSrcAlphaPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;float alpha : TEXCOORD1;};sampler2D _MainTex;float4 _MainTex_ST;fixed4 _Color;float _Speed;float _High;float     _UVy;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.alpha = v.vertex.y / _High;return o;}fixed4 frag (v2f i) : SV_Target{fixed2 uv = fixed2(i.uv.x - _Speed * _Time.y,i.uv.y );fixed4 col = tex2D(_MainTex, uv)* _Color;fixed speed = _Speed*5 * _Time.w+ uv.y;//围栏生成动画float lerpVauel;if (_UVy> speed){lerpVauel = 0;}else{lerpVauel = 1;}fixed4 newcol = lerp(fixed4(1, 1, 1, 0), fixed4(col.xyz, 1-i.alpha), lerpVauel);return newcol;}ENDCG}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

股票交易信息实时大屏(Kafka+storm+Redis+DataV)

目录 引言 需求分析&#xff1a; 思路 数据源&#xff1a; 数据传输&#xff1a; 数据处理&#xff1a; 数据统计&#xff1a; 数据可视化&#xff1a; 数据提取&#xff1a; 技术栈 技术实现 前端界面搭建 布局: ​ 组件&#xff1a; 通信&#x…

Netty常见的设计模式

简介 设计模式在软件开发中起着至关重要的作用&#xff0c;它们是解决常见问题的经过验证的解决方案。而Netty作为一个优秀的网络应用程序框架&#xff0c;同样也采用了许多设计模式来提供高性能和可扩展性。在本文中&#xff0c;我们将探讨Netty中使用的一些关键设计模式&…

修改yocto容量和编译

方法1&#xff1a; 1、修改bitbake.conf cd /home/yocto_build/axxia_support/yocto_build/poky/meta/conf/ vi bitbake.conf修改倍数参数&#xff0c;1.3为5G&#xff0c;13为50G IMAGE_OVERHEAD_FACTOR修改这个参数容量&#xff0c;大于initramfs&#xff0c;不然会报错 I…

目标检测图片截取目标分类图片

如果要训练一个分类模型却没有特定的分类数据集怎么办呢&#xff1f;可以换一种思路&#xff0c;将带有该目标的图片对所有想要的目标进行画标注框然后进行截图&#xff0c;就能得到特定的分类数据了。这么做的目的是&#xff1a;带有该目标的图片可能不会少&#xff0c;但是带…

Go 与 Rust:现代编程语言的深度对比

在快速发展的软件开发领域中&#xff0c;选择合适的编程语言对项目的成功至关重要。Go 和 Rust 是两种现代编程语言&#xff0c;它们都各自拥有一系列独特的特性和优势。本文旨在深入比较 Go 和 Rust&#xff0c;从不同的角度分析这两种语言&#xff0c;包括性能、语言特性、生…

UG NX二次开发(C++)-库缺少需要的入口点的原因与解决方案

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、“库缺少需要的入口点”错误展示3、可能出现的原因与解决方案3.1 对于采用CTRL+U方式调用3.2 对于menu菜单下调用1、前言 在UG NX二次开发过程中,有时会遇到形形色色的bug,比如有个读…

使用React实现随机颜色选择器,JS如何生成随机颜色

背景 在标签功能中&#xff0c;由于有「背景色」属性&#xff0c;每次新增标签时都为选择哪种颜色犯难。因此&#xff0c;我们思考如何通过JS代码生成随机颜色&#xff0c;提取一个通用的随机颜色生成工具&#xff0c;并基于React框架封装随机颜色选择器组件。 实际效果 原理…

Leaflet.Graticule源码分析以及经纬度汉化展示

目录 前言 一、源码分析 1、类图设计 2、时序调用 3、调用说明 二、经纬度汉化 1、改造前 2、汉化 3、改造效果 总结 前言 在之前的博客基于Leaflet的Webgis经纬网格生成实践中&#xff0c;已经深入介绍了Leaflet.Graticule的实际使用方法和进行了简单的源码分析。认…

插头是什么

插头 电工电气百科 文章目录 插头前言一、插头是什么二、插头的类别三、插头的作用原理总结前言 插头的设计和结构会根据不同的国家和地区的标准和电源类型而有所不同。所以,在使用插头时,需要注意使用符合当地标准和规定的插头,以确保电气安全以及插入正确的电源插座 一、…

新钛云服助力爱达邮轮·魔都号首航,保驾护航,共创辉煌

随着2024年1月1日的临近&#xff0c;中国首艘国产大型邮轮——爱达邮轮魔都号即将迎来激动人心的首航时刻。作为爱达邮轮的IT系统运维和安全服务伙伴&#xff0c;新钛云服有幸提前登船体验&#xff0c;并为魔都号即将到来的航行提供全面的技术支持与保障。 爱达魔都号&#xff…

如何提升数据结构方面的算法能力?

谈及为什么需要花时间学算法&#xff0c;我至少可以列举出三个很好的理由。 (1)性能&#xff1a;选择正确的算法可以显著提升应用程序的速度。仅就搜索来说&#xff0c;用二分查找替 换线性搜索就能为我们帶来巨大的收益。 (2)安全性&#xff1a;如果你选用了错误的算法&…

深入理解 hash 和 history:网页导航的基础(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…