PICO+Unity MR空间锚点

官方链接:空间锚点 | PICO 开发者平台
注意:该功能只能打包成APK在PICO 4 Ultra上真机运行,无法通过串流或PICO developer center在PC上运行。使用之前要开启视频透视。
在 Inspector 窗口中的 PXR_Manager (Script) 面板上,勾选 Spatial Anchor 选框,为应用开启空间锚点能力。然后,你可以调用空间锚点相关接口,在应用内实现空间锚点功能。

新建一个空物体名为SpatialAnchor,添加SpatialAnchor组件(指定地方放置物体)、SeethroughManager代码(开启透视)

编写代码SpatialAnchor
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Unity.XR.PXR;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;public class SpatialAnchor : MonoBehaviour
{public GameObject prerefAnchor;public GameObject anchorPreview;public GameObject firePoint;public Text textPrompt;public Button btnLoadAllAnchors;public Button btnClearAllAnchors;[SerializeField]private InputActionReference rightGrip;public Dictionary<ulong, AnchorInfo> anchorList = new Dictionary<ulong, AnchorInfo>();// Start is called before the first frame updatevoid Start(){btnLoadAllAnchors.onClick.AddListener(OnBtnPressedLoadAllAnchors);btnClearAllAnchors.onClick.AddListener(OnBtnPressedClearAllAnchors);StartSpatialAnchorProvider();}private void OnEnable(){rightGrip.action.started += OnRightGripPressed;rightGrip.action.canceled += OnRightGripReleased;}private void OnDisable(){rightGrip.action.started -= OnRightGripPressed;rightGrip.action.canceled -= OnRightGripReleased;}//called on action.startedprivate void OnRightGripPressed(InputAction.CallbackContext callback){ShowAnchorPreview();}//called on action.releaseprivate void OnRightGripReleased(InputAction.CallbackContext callback){CreateAnchor();}private void ShowAnchorPreview(){//Show anchoranchorPreview.SetActive(true);}private async void StartSpatialAnchorProvider(){var result0 = await PXR_MixedReality.StartSenseDataProvider(PxrSenseDataProviderType.SpatialAnchor);Debug.unityLogger.Log($"StartSenseDataProvider: {result0}");} private async void CreateAnchor(){anchorPreview.SetActive(false);//Use Spatial Anchor Api to create anchor//This will trigger AnchorEntityCreatedEventvar result1 = await PXR_MixedReality.CreateSpatialAnchorAsync(firePoint.transform.position, firePoint.transform.rotation);if (result1.result == PxrResult.SUCCESS){GameObject anchorObject = Instantiate(prerefAnchor);anchorObject.SetActive(true);anchorObject.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);anchorObject.transform.rotation = firePoint.transform.rotation;anchorObject.transform.position = firePoint.transform.position;AnchorInfo info = anchorObject.GetComponent<AnchorInfo>();var result2 = await PXR_MixedReality.PersistSpatialAnchorAsync(result1.anchorHandle);if (result2 == PxrResult.SUCCESS){info.ShowSaveIcon(true);}else{info.ShowSaveIcon(false);}anchorList.Add(result1.anchorHandle, info); // 添加到锚点列表}}// 异步加载所有锚点private async void OnBtnPressedLoadAllAnchors(){anchorList.Clear();var result = await PXR_MixedReality.QuerySpatialAnchorAsync(); // 查询所有空间锚点//SetLogInfo("LoadSpatialAnchorAsync:" + result.result.ToString() + result.anchorHandleList.Count); // 记录日志if (result.result == PxrResult.SUCCESS) // 成功查询{int i = 0;foreach (var key in result.anchorHandleList) // 遍历锚点句柄{if (!anchorList.ContainsKey(key)) // 如果锚点列表中不存在该锚点{i++;PXR_MixedReality.LocateAnchor(key, out var position, out var orientation);GameObject anchorObject = Instantiate(prerefAnchor);anchorObject.SetActive(true);anchorObject.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);anchorObject.transform.rotation = orientation;anchorObject.transform.position = position;AnchorInfo anchor = anchorObject.GetComponent<AnchorInfo>(); // 获取锚点组件anchor.SetAnchorHandle(key); // 设置锚点句柄// 定位锚点anchorList.Add(key, anchor); // 添加到锚点列表anchorList[key].ShowSaveIcon(true); // 显示保存图标}else{textPrompt.text = "无法加载:" + i.ToString();}}}else{textPrompt.text = "查询失败...";}}// 异步删除所有锚点private async void OnBtnPressedClearAllAnchors(){List<ulong> keys = anchorList.Keys.ToList();for(int i = 0; i < keys.Count; i++){ulong key = keys[i];await PXR_MixedReality.UnPersistSpatialAnchorAsync(anchorList[key].anchorHandle);textPrompt.text = "正在删除..."+i.ToString();DestroyImmediate(anchorList[key].gameObject);}anchorList.Clear();textPrompt.text = "删除完成";}
}
锚点信息类
using System.Collections;
using System.Collections.Generic;
using Unity.XR.PXR;
using UnityEngine;
using UnityEngine.UI;public class AnchorInfo : MonoBehaviour
{public Text text;public GameObject savedIcon;[HideInInspector]public ulong anchorHandle;// 设置锚点句柄并更新 UI 显示public void SetAnchorHandle(ulong handle){anchorHandle = handle;text.text = "ID: " + anchorHandle;}// 显示保存图标public void ShowSaveIcon(bool show){savedIcon.SetActive(show);}private void LateUpdate(){// 尝试定位空间锚点var result = PXR_MixedReality.LocateAnchor(anchorHandle, out var position, out var rotation);if (result == PxrResult.SUCCESS){// 如果成功,更新当前对象的位置和旋转transform.position = position;transform.rotation = rotation;}}
}
rightGrip输入赋值



相关文章:
PICO+Unity MR空间锚点
官方链接:空间锚点 | PICO 开发者平台 注意:该功能只能打包成APK在PICO 4 Ultra上真机运行,无法通过串流或PICO developer center在PC上运行。使用之前要开启视频透视。 在 Inspector 窗口中的 PXR_Manager (Script) 面板上,勾选…...
electron 中 contextBridge 作用
1. 安全地实现渲染进程和主进程之间的通信 在 Electron 应用中,主进程和渲染进程是相互隔离的,这是为了安全和稳定性考虑。 然而,在很多情况下,渲染进程需要访问主进程中的某些功能,例如系统级别的操作或者一些应用级…...
15分钟学 Go 第 42 天:RESTful API设计
第42天:RESTful API设计 目标:理解RESTful API的设计原则 在现代Web开发中,RESTful API(Representational State Transfer)已经成为了标准的架构风格,用于实现客户端与服务器之间的通信。通过遵循REST的设…...
如何安全的中断一个运行中的线程?
文心快码进入3.0时代, 最新发布的代码问答、编码、Debug、单测、安全智能体, 分别在开发的设计、编码、构建、测试验证全流程通过AI赋能,让效率更高、效果更好。可以通过自然语言对话,独立为你完成一项编码任务。 👉点…...
【121. 买卖股票的最佳时机】——贪心算法/动态规划
121. 买卖股票的最佳时机 一、题目难度 简单 三、题目描述 给定一个数组 prices,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获…...
LLMs之Calculate:利用大语言模型技术基于文本内容实现数字计算能力的简介、常用方法、代码实现之详细攻略
LLMs之Calculate:利用大语言模型技术基于文本内容实现数字计算能力的简介、常用方法、代码实现之详细攻略 导读:在基于大语言模型(LLM)技术实现数字计算能力的背景下,文本内容的理解和计算过程涉及多个领域的交叉技术,包括自然语言处理(NLP)、机器学习、以及数值计算。…...
LeetCode题练习与总结:判断子序列--392
一、题目描述 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一…...
json数据结构的转换
# json可用于赌徒与原件数据的转换(json以字符串的形式储存数据,在通过json进行两种语言的转换时,应先将数据类型转换成列表或字典,再由列表或字典转换成json字符串,最后由json字符串转换成另一种语言的列表或字典数据…...
mysql删除语句:@Update(“TRUNCATE TABLE employee“)讲解
这个 SQL 语句: TRUNCATE TABLE employee是一个 SQL DDL(数据定义语言) 操作,用于清空数据库表中的所有记录,但不会删除表结构(即列和索引等)。 逐部分解释: TRUNCATE:…...
如何修改浏览器指纹?
网络安全日益重要,我们的上网行为变得越来越容易被追踪和分析。其中,浏览器指纹就是一种强大的技术手段,它可以说是你上网的身份象征。 一、浏览器指纹是什么 浏览器指纹是网站和在线平台用来收集关于你的浏览器、设备和网络的详细信息的一…...
实现3D热力图
实现思路 首先是需要用canvas绘制一个2D的热力图,如果你还不会,请看json绘制热力图。使用Threejs中的canvas贴图,将贴图贴在PlaneGeometry平面上。使用着色器材质,更具json中的数据让平面模型 拔地而起。使用Threejs内置的TWEEN&…...
GEE ui界面实现:用户自画多边形, 按面积比例在多边形中自动生成样点,导出多边形和样点shp,以及删除上一组多边形和样点(有视频效果展示)
零、背景 这几天在选样点,发现GEE有强大的ui功能,于是应用在我的工作上。 下述代码实现了几个功能: ①用户可以自己勾勒多边形,随后程序会按面积比例在多边形中自动生成样点,同时根据改多边形的区域生成区域平均月N…...
React diff算法和Vue diff算法的主要区别
React和Vue都是流行的前端框架,它们各自实现了diff算法来优化虚拟DOM的更新过程。以下是React diff算法和Vue diff算法的主要区别: 1. diff策略 React diff算法: React的diff算法主要采用了同层级比较的策略,即它不会跨层级比较节…...
WSL 2 中 FastReport 与 FastCube 的设置方法与优化策略
软件开发人员长期以来一直在思考这个问题:“我们如何才能直接在 Windows 中运行 Linux 应用程序,而无需使用单独的虚拟机?” WSL 技术为这个问题提供了一个可能的答案。WSL 的历史始于 2016 年。当时,其实现涉及使用 Windows 内核…...
《线性代数》学习笔记
列向量无关 上个星期继续学线性代数,一个矩阵,如何判断它是的列向量有几个是线性无关呢?其实有好几个方法。第一个就是一个一个判断。 先选定一个,然后看下这两个,怎么看呢?如果两个列向量线性相关&#…...
Redis三种集群模式:主从模式、哨兵模式和Cluster模式
目录标题 1、背景及介绍2、 Redis 主从复制2.1、主从复制特点2.2、Redis主从复制原理2.3 PSYNC 工作原理2.3.1、启动或重连判断:2.3.2、第一次同步处理:2.3.3、断线重连处理:2.3.4、主节点响应2.3.5、全量同步触发条件:2.3.6、复制…...
CDH大数据平台部署
二、CDH简介 全称Cloudera’s Distribution Including Apache Hadoop。 hadoop的版本 (Apache、CDH、Hotonworks版本) 在公司中一般使用cdh多一些(收费的)、也有公司使用阿里云大数据平台、微软的大数据平台。 国内也有一些平台:星环大数…...
7.4、实验四:RIPv2 认证和触发式更新
源文件 一、引言:为什么要认证和采用触发式更新? 1. RIP v2 认证 RIP(Routing Information Protocol)版本 2 添加了认证功能,以提高网络的安全性。认证的作用主要包括以下几点: 防止路由欺骗 RIP v1 是不…...
【一步步开发AI运动小程序】二十一、如果将AI运动项目配置持久化到后端?
**说明:**本文所涉及的AI运动识别、计时、计数能力,都是基于云智「Ai运动识别引擎」实现。云智「Ai运动识别」插件识别引擎,可以为您的小程序或Uni APP赋于原生、本地、广覆盖、高性能的人体识别、姿态识别、10余种常见的运动计时、计数识别及…...
LED和QLED的区别
文章目录 1. 基础背光技术2. 量子点技术的引入3. 色彩表现4. 亮度和对比度5. 能效6. 寿命7. 价格总结 LED和 QLED都是基于液晶显示(LCD)技术的电视类型,但它们在显示技术、色彩表现和亮度方面有一些关键区别。以下是两者的详细区别ÿ…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...
