Zed-Unity插件代码注释——ZEDPointCloudManager.cs——点云显示

2023-11-04 22:38

本文主要是介绍Zed-Unity插件代码注释——ZEDPointCloudManager.cs——点云显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • Zed-Unity插件代码注释——ZEDPointCloudManager.cs
    • 引言
    • 基础环境
    • ZEDPointCloudManager.cs脚本介绍
    • 代码(注释后)

Zed-Unity插件代码注释——ZEDPointCloudManager.cs

引言

由于项目的需求,需要在混合现实里面获得现实世界中一些物品的位置。ZED相机的双目相机提供了点云的数据,因此自己需要在unity中获得这些数据并进行实际需求的操作。
上个礼拜基本上把ZED-unity插件的原生接口代码通读了一遍,一方面是对整个SDK有了系统的了解,一方面是对C# 语言、Unity语言、这类产品的代码架构有了一定的了解。 而接下来正式转移到实际任务中的代码实践。
插件中提供了一个点云的显示示例,这篇文章先对这个示例的了解做一个简单的记录。代码注释等,下一篇再来考虑如何通过自己的代码来获得自己想要的点云的数据。
由于时间精力的限制,有一些可能觉得自己以后不怎么用的到的 但是现在又不懂的东西,我没有去分析它,但是在相应地方会指出说自己不懂,如果有人会的话,麻烦顺带解答一下。

基础环境

略(2020-09-01 20.46)

ZEDPointCloudManager.cs脚本介绍

  • 脚本位置:
    在这里插入图片描述
  • 脚本功能:
    这个脚本是一个mono的子类,在里面有update()、Aware()等unity的函数。 是一个数据显示的示例脚本,是教开发者如何在unity中实时显示zed相机点云的。
    -脚本使用:
    这个脚本相当于一个脚本组件,需要放置在unity场景中的GameObject上才能运行,脚本对宿主(我自己把组件挂在的对象称为宿主)没有要求。
    脚本要求另外一个脚本组件“ZEDManager.cs”也挂在某个宿主身上。
  • 代码结构:
    在这里插入图片描述
    该脚本比较短,也就388行。内容比较少,这边就不详细说了。直接看代码里面的注释吧。

代码(注释后)

//======= Copyright (c) Stereolabs Corporation, All rights reserved. ===============using UnityEngine;/** Editor:Lance* 注释时间:初次  2020-09-01 17.18*/
/// <summary>
/// Displays the point cloud of the real world in front of the camera.
/// Can be attached to any GameObject in a scene, but requires a ZEDManager component to exist somewhere.
/// 镜头前显示现实世界的点云。
/// 可以附加到场景中的任何GameObject,但需要ZEDManager组件存在于某个地方。
/// </summary>
public class ZEDPointCloudManager : MonoBehaviour
{/// <summary>/// Set to a camera if you do not want that camera to see the point cloud./// 如果您不希望该摄像机看到点云,则设置为摄像机。/// 不希望这个相机看到点云/// Editor Lance:这个是什么意思呢,是说设置一个新的虚拟相机,这个相机看不到点云对象?/// </summary>[Tooltip("Set to a camera if you do not want that camera to see the point cloud. ")]public Camera hiddenObjectFromCamera;/// <summary>/// Instance of the ZEDManager interface/// ZEDManager界面的实例,后面应该是要将外部的zedmanager赋值给下面这个变量才对/// </summary>public ZEDManager zedManager = null;/// <summary>/// Material used to display the point cloud. Usually Mat_ZED_PointCloud./// 用于显示点云的材质。通常为Mat_ZED_PointCloud。/// </summary>public Material mat;/// <summary>/// Number of points displayed. Usually equal to the width * height of the ZED's resolution (eg. 1280 * 720)./// 显示的点数。通常等于ZED分辨率的宽度*高度(例如1280 * 720)。/// </summary>private int numberPoints = 0;/// <summary>/// zed Camera controller by zedManager/// zedManager的zed相机控制器/// </summary>private sl.ZEDCamera zed = null;/// <summary>/// Texture that holds the 3D position of the points./// 保持点的3D位置的纹理。/// </summary>private Texture2D XYZTexture; //Editor Lance:点云纹理,纹理数据与zed的点云数据格式不同,不是一个矩阵/// <summary>/// Texture that holds the colors of each point./// 保留每个点的颜色的纹理/// </summary>private Texture2D colorTexture; //Editor Lance:彩色图像的纹理/// <summary>/// Temporary copy/buffer of the XYZTexture to stop the point cloud in a defined moment./// XYZTexture的临时副本/缓冲区,用于在定义的时刻停止点云。/// </summary>private RenderTexture XYZTextureCopy = null; //Editor Lance:渲染的纹理对象是什么东西,就是一个临时的纹理变量吧/// <summary>/// Temporary copy/buffer of the ColorTexture to stop the point cloud in a defined moment./// ColorTexture的临时副本/缓冲区,用于在定义的瞬间停止点云。/// </summary>private RenderTexture ColorTextureCopy = null;/// <summary>/// Cached property index of _Position shader property, so we only look it up once. Do not use./// _Position shader属性的缓存属性索引,因此我们只查找一次。不使用。/// </summary>/// Editor Lance: int?用法  https://www.cnblogs.com/firstcsharp/archive/2011/12/11/2283797.htmlprivate static int? _positionid;/// <summary>/// Returns the property index of the _Position property, and looks it up if it hasn't been looked up yet./// 返回_Position属性的属性索引,如果尚未查找,则查找它。/// </summary>private static int positionID{get{if (_positionid == null){_positionid = Shader.PropertyToID("_Position"); //}return (int) _positionid;}}/// <summary>/// Cached property index of the _ColorTex shader property, so we only look it up once. Use colorTexID instead./// _ColorTex着色器属性的缓存属性索引,因此我们只查找一次。请改用colorTexID。/// </summary>private static int? _colortexid;/// <summary>/// Returns the property index of the _ColorTex property, which is the RGB color texture from the ZED./// 返回_ColorTex属性的属性索引,该属性索引是ZED中的RGB颜色纹理。/// </summary>private static int colorTexID{get{if (_colortexid == null){_colortexid = Shader.PropertyToID("_ColorTex");}return (int) _colortexid;}}/// <summary>/// Cached property index of _XYZTex shader property, so we only look it up once. Use xyzTexID instead./// _XYZTex着色器属性的缓存属性索引,因此我们只查找一次。请改用xyzTexID。/// </summary>private static int? _xyztexid;/// <summary>/// Returns the property index of the _XYZTex property, which is the XYZ position of each pixel relative to the ZED./// 返回_XYZTex属性的属性索引,该索引是每个像素相对于ZED的XYZ位置。/// </summary>private static int xyzTexID{get{if (_xyztexid == null){_xyztexid = Shader.PropertyToID("_XYZTex");}return (int) _xyztexid;}}/// <summary>/// Whether the point cloud should be visible or not./// 点云是否应该可见。/// </summary>[Tooltip("Whether the point cloud should be visible or not.点云是否应该可见。 ")]public bool display = true;/// <summary>/// Whether to update the point cloud./// If false, the point cloud will display the content of the temp textures from the last update./// 是否更新点云。 如果为false,则点云将显示上一次更新的临时纹理的内容。/// </summary>[Tooltip("Whether to update the point cloud. If false, the point cloud will display the content of the temp textures from the last update. " +"是否更新点云。 如果为false,则点云将显示上一次更新的临时纹理的内容。")]public bool update = true;/// <summary>/// Flag to check if the update has changed state./// 标记以检查更新是否已更改状态。/// </summary>private bool previousUpdate = true;void Start(){if (zedManager == null) //如果还没有实例化{zedManager = FindObjectOfType<ZEDManager>(); //找到ZEDManager组件if (ZEDManager.GetInstances().Count > 1 //如果这个组件的实例化不只一个,我的情况一般只有一个) //We chose a ZED arbitrarily, but there are multiple cams present. Warn the user. 我们任意选择一个ZED,但是有多个相机存在。所以需要警告用户。{Debug.Log("Warning: " + gameObject.name +"'s zedManager was not specified, so the first available ZEDManager instance was " +"assigned. However, there are multiple ZEDManager's in the scene. It's recommended to specify which ZEDManager you want to " +"use to display a point cloud.");}}if (zedManager != null) //实例化后的zed = zedManager.zedCamera; //相机设备赋值}// Update is called once per framevoid Update(){//Don't do anything unless the ZED has been initialized.// 除非ZED已初始化,否则请勿执行任何操作。if (zed.IsCameraReady){if (numberPoints == 0) //这个判断里面的内容只执行一次{//Create the textures. These will be updated automatically by the ZED.//创建纹理。这些将由ZED自动更新。//We'll copy them each frame into XYZTextureCopy and ColorTextureCopy, which will be the ones actually displayed.//我们将每帧将它们复制到XYZTextureCopy和ColorTextureCopy中,它们将是显示的。XYZTexture = zed.CreateTextureMeasureType(sl.MEASURE.XYZ);colorTexture = zed.CreateTextureImageType(sl.VIEW.LEFT);numberPoints = zed.ImageWidth * zed.ImageHeight; //点云的数目赋值//Load and set the material properties.//加载并设置材料属性。if (mat == null){mat = new Material(Resources.Load("Materials/PointCloud/Mat_ZED_PointCloud") as Material); //插件包中加载点云的材质}if (mat != null){//mat.SetTexture("_XYZTex", XYZTexture);mat.SetTexture(xyzTexID, XYZTexture); // 把点云的纹理图设置到材质里面//mat.SetTexture("_ColorTex", colorTexture);mat.SetTexture(colorTexID, colorTexture); //把图像的彩色纹理图设置到材质里面}}//If stop updated, create new render texture and fill them with the textures from the ZED.//如果停止更新,请创建新的渲染纹理,并使用ZED中的纹理填充它们。// These textures will be displayed as they are not updated//这些纹理将被显示,因为它们没有更新if (!update && previousUpdate != update) //Editor Lance:这个判断好奇怪,好像当previousUpdate为true的时候一定能通过// Editor Lance:这边的意思是说  当update为false的时候,这个函数还是被执行了一帧,但是第二帧的时候就不能执行了{if (XYZTextureCopy == null) //如果没有复制过之前的点云纹理{XYZTextureCopy = new RenderTexture(XYZTexture.width, XYZTexture.height, 0,RenderTextureFormat.ARGBFloat); //实例化临时纹理,浮点类型}if (ColorTextureCopy == null) // 如果没有临时的彩色纹理{ColorTextureCopy = new RenderTexture(colorTexture.width, colorTexture.height, 0,RenderTextureFormat.ARGB32); //实例化临时纹理,字符串类型}//Copy the new textures into the buffers.//将新纹理复制到缓冲区中。Graphics.Blit(XYZTexture, XYZTextureCopy); //Unity的函数 之后再了解Graphics.Blit(colorTexture, ColorTextureCopy);if (mat != null) //如果材质已经生成{//mat.SetTexture("_XYZTex", XYZTextureCopy);mat.SetTexture(xyzTexID, XYZTextureCopy); // 应用临时纹理//mat.SetTexture("_ColorTex", ColorTextureCopy);mat.SetTexture(colorTexID, ColorTextureCopy); //   应用临时纹理}}//Send the textures to the material/shader.//将纹理发送到材质/着色器。if (update && previousUpdate != update && mat != null) // 暂停后又重新开始的话能够进入,但是当update为false的时候是不进入的。当mat没有初始化的时候也是不能进入的。{//mat.SetTexture("_XYZTex", XYZTexture);mat.SetTexture(xyzTexID, XYZTexture);//mat.SetTexture("_ColorTex", colorTexture);mat.SetTexture(colorTexID, colorTexture);}previousUpdate = update;}}void OnApplicationQuit() //退出的时候释放内存{//Free up memory.mat = null;if (XYZTextureCopy != null){XYZTextureCopy.Release(); //释放临时纹理的内存}if (ColorTextureCopy != null){ColorTextureCopy.Release(); //释放临时纹理的内存}}void OnRenderObject(){if (mat != null) //如果材质已经实例化{if (hiddenObjectFromCamera == Camera.current) return; //如果我就不想看点云的话if (!display) return; //Don't draw anything if the user doesn't want to. 如果用户不想画任何东西。//mat.SetMatrix("_Position", transform.localToWorldMatrix);mat.SetMatrix(positionID, transform.localToWorldMatrix); //从局部转换到世界坐标系中,mat.SetPass(0); //这个是啥#if UNITY_2019_1_OR_NEWERGraphics.DrawProceduralNow(MeshTopology.Points, 1, numberPoints);
#elseGraphics.DrawProcedural(MeshTopology.Points, 1, numberPoints);
#endif}}
}

这篇关于Zed-Unity插件代码注释——ZEDPointCloudManager.cs——点云显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/345632

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

2、PF-Net点云补全

2、PF-Net 点云补全 PF-Net论文链接:PF-Net PF-Net (Point Fractal Network for 3D Point Cloud Completion)是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip