PICO 4與Unity MR開(kāi)發(fā):5分鐘實(shí)現(xiàn)空間網(wǎng)格掃描與物理交互
1. 項(xiàng)目概述為什么PICO 4與Unity MR是絕配如果你正在關(guān)注混合現(xiàn)實(shí)MR開(kāi)發(fā)尤其是手頭有一臺(tái)PICO 4那么“空間網(wǎng)格掃描與交互”絕對(duì)是你入門和進(jìn)階路上必須啃下的硬骨頭。這不僅僅是讓虛擬物體“粘”在現(xiàn)實(shí)世界那么簡(jiǎn)單它關(guān)乎整個(gè)MR體驗(yàn)的沉浸感和可信度。我最近用PICO 4 Ultra配合Unity完成了一個(gè)快速原型核心目標(biāo)就是在5分鐘內(nèi)讓開(kāi)發(fā)者能跑通從掃描現(xiàn)實(shí)空間到與虛擬物體進(jìn)行物理交互的完整流程。聽(tīng)起來(lái)有點(diǎn)挑戰(zhàn)但實(shí)測(cè)下來(lái)只要工具鏈選對(duì)、流程理順這個(gè)目標(biāo)完全可以實(shí)現(xiàn)。PICO 4 Ultra作為一款消費(fèi)級(jí)VR/MR一體機(jī)其內(nèi)置的彩色透視See-Through功能和空間錨定Spatial Anchor能力為Unity開(kāi)發(fā)者提供了一個(gè)絕佳的移動(dòng)端MR試驗(yàn)場(chǎng)。而Unity引擎憑借其強(qiáng)大的跨平臺(tái)能力和成熟的XR交互框架是目前連接PICO硬件與MR創(chuàng)意最順暢的橋梁。這個(gè)項(xiàng)目不涉及復(fù)雜的算法推導(dǎo)重點(diǎn)在于實(shí)戰(zhàn)串聯(lián)如何利用官方SDK快速激活設(shè)備能力并實(shí)現(xiàn)一個(gè)直觀、可交互的MR演示。無(wú)論是想驗(yàn)證一個(gè)MR游戲點(diǎn)子還是為行業(yè)應(yīng)用做技術(shù)預(yù)研這套“五分鐘腳手架”都能幫你省下大量摸索環(huán)境配置和基礎(chǔ)交互的時(shí)間。2. 核心工具鏈與項(xiàng)目初始化2.1 環(huán)境準(zhǔn)備Unity版本與PICO SDK的選擇工欲善其事必先利其器。第一步的選型直接決定了后續(xù)開(kāi)發(fā)的順暢程度。Unity版本強(qiáng)烈推薦使用Unity 2022.3 LTS或更新版本。LTS長(zhǎng)期支持版本穩(wěn)定性高對(duì)URP通用渲染管線和XR插件的支持也最為成熟。本項(xiàng)目基于URP因?yàn)樗鼘?duì)移動(dòng)端性能更友好且與PICO SDK的兼容性經(jīng)過(guò)充分測(cè)試。PICO Unity Integration SDK這是核心中的核心。你需要前往PICO開(kāi)發(fā)者官網(wǎng)下載最新版本的SDK。注意SDK版本最好與你的PICO設(shè)備系統(tǒng)版本保持大致同步以避免兼容性問(wèn)題。下載后它是一個(gè).unitypackage文件。開(kāi)發(fā)機(jī)要求一臺(tái)性能尚可的Windows PC用于Unity開(kāi)發(fā)以及PICO 4 Ultra設(shè)備。務(wù)必確保設(shè)備已開(kāi)啟開(kāi)發(fā)者模式并通過(guò)USB數(shù)據(jù)線連接電腦。同時(shí)在PICO設(shè)備系統(tǒng)設(shè)置中確?!安噬敢暋焙汀翱臻g追蹤”權(quán)限已開(kāi)啟。2.2 創(chuàng)建項(xiàng)目與基礎(chǔ)配置打開(kāi)Unity Hub使用3DURP模板創(chuàng)建一個(gè)新項(xiàng)目。項(xiàng)目創(chuàng)建后按順序進(jìn)行以下操作導(dǎo)入PICO SDK將下載的.unitypackage直接拖入U(xiǎn)nity的Project窗口或使用Assets - Import Package - Custom Package導(dǎo)入。導(dǎo)入時(shí)建議全選所有模塊特別是XR、Spatial Mapping、Input相關(guān)的包。配置XR Plug-in Management在菜單欄進(jìn)入Edit - Project Settings。在XR Plug-in Management中確保PICO選項(xiàng)被勾選。這會(huì)讓Unity在構(gòu)建時(shí)自動(dòng)包含必要的PICO運(yùn)行時(shí)庫(kù)。切換到Android標(biāo)簽頁(yè)因?yàn)镻ICO 4基于Android同樣勾選PICO。配置URP與渲染由于PICO的彩色透視需要特殊的渲染處理我們需要使用PICO SDK提供的URP渲染配置。在Project窗口找到Assets/PICO Unity Integration/Runtime/Rendering/URP路徑下的PICO_URP_Asset。將它拖拽到Project Settings - Graphics - Scriptable Render Pipeline Settings中。同樣在Project Settings - Quality中將各個(gè)質(zhì)量等級(jí)下的Rendering - Render Pipeline Asset也指向這個(gè)PICO_URP_Asset。注意很多開(kāi)發(fā)者卡在第一步的渲染黑屏或透視不正常90%的原因就是URP配置不正確。務(wù)必確保PICO_URP_Asset被正確應(yīng)用到Graphics和Quality設(shè)置中。場(chǎng)景基礎(chǔ)設(shè)置刪除場(chǎng)景中自帶的Main Camera。從PICO Unity Integration/Prefabs文件夾中將PICO XR Origin預(yù)制體拖入場(chǎng)景。這個(gè)預(yù)制體已經(jīng)集成了頭盔和手柄的追蹤、輸入系統(tǒng)是我們MR體驗(yàn)的起點(diǎn)。完成以上步驟基礎(chǔ)環(huán)境就搭建好了。你可以嘗試連接設(shè)備點(diǎn)擊Unity編輯器上的播放按鈕如果一切正常應(yīng)該能在Game窗口看到來(lái)自PICO設(shè)備的彩色透視畫面。3. 空間網(wǎng)格掃描的實(shí)現(xiàn)原理與核心代碼空間網(wǎng)格掃描專業(yè)術(shù)語(yǔ)叫空間映射Spatial Mapping。其原理是設(shè)備利用前置攝像頭和深度傳感器PICO 4 Ultra具備實(shí)時(shí)掃描周圍環(huán)境的幾何形狀并生成一個(gè)由三角形網(wǎng)格Mesh構(gòu)成的虛擬表面。這個(gè)表面代表了物理空間的邊界是虛擬物體進(jìn)行碰撞、遮擋和放置的基礎(chǔ)。3.1 啟用與配置空間映射在Unity中PICO SDK通過(guò)PXR_SpatialMapping組件來(lái)管理這一切。我們不需要從零開(kāi)始寫掃描算法而是學(xué)會(huì)配置和驅(qū)動(dòng)它。添加管理器在場(chǎng)景中創(chuàng)建一個(gè)空GameObject命名為“SpatialMappingManager”。為其添加PXR_SpatialMapping組件。關(guān)鍵參數(shù)解析Update Frequency掃描更新頻率。對(duì)于動(dòng)態(tài)環(huán)境可以設(shè)為High對(duì)于靜態(tài)環(huán)境Medium或Low足以節(jié)省性能。Mesh Prefab指定掃描生成的網(wǎng)格使用哪個(gè)預(yù)制體來(lái)渲染。SDK通常自帶一個(gè)SpatialMesh預(yù)制體你也可以自定義材質(zhì)比如改成半透明的藍(lán)色以便觀察。Physics Layer為生成的網(wǎng)格設(shè)置一個(gè)物理層如“SpatialMesh”。這至關(guān)重要后續(xù)虛擬物體與真實(shí)世界的碰撞檢測(cè)就靠這個(gè)層。Max Mesh Size限制生成的單個(gè)網(wǎng)格的最大尺寸防止一個(gè)網(wǎng)格過(guò)大影響性能。Mesh Culling Distance相機(jī)多遠(yuǎn)以外的網(wǎng)格會(huì)被剔除優(yōu)化渲染。3.2 核心控制腳本我們需要一個(gè)腳本來(lái)控制掃描的啟動(dòng)、停止以及處理掃描完成的事件。下面是一個(gè)最精簡(jiǎn)但功能完整的控制器腳本SpatialMappingController.csusing Pico.Platform; using Pico.Platform.Models; using Pico.Platform.Space; using UnityEngine; public class Spatialmappingcontroller : MonoBehaviour { // 引用PXR_SpatialMapping組件 public PXR_SpatialMapping spatialMapping; // 用于顯示狀態(tài)的UI文本需自行在場(chǎng)景中配置 public UnityEngine.UI.Text statusText; private bool isScanning false; void Start() { if (spatialMapping null) { spatialMapping FindObjectOfTypePXR_SpatialMapping(); } UpdateStatus(就緒按下手柄A鍵開(kāi)始掃描); } void Update() { // 監(jiān)聽(tīng)右手柄A鍵按下開(kāi)始或停止掃描 if (PXR_Input.GetControllerState(PXR_Input.Controller.Right).AX) { ToggleSpatialMapping(); } } void ToggleSpatialMapping() { if (!isScanning) { StartScanning(); } else { StopScanning(); } } void StartScanning() { if (spatialMapping null) return; // 開(kāi)始空間映射 spatialMapping.StartSpatialMapping(); isScanning true; UpdateStatus(掃描中... 移動(dòng)頭部掃描環(huán)境。再次按下A鍵結(jié)束。); // 注冊(cè)網(wǎng)格更新完成回調(diào)可選用于高級(jí)處理 // spatialMapping.onMeshUpdated OnMeshUpdated; } void StopScanning() { if (spatialMapping null) return; // 停止空間映射SDK會(huì)完成最后一幀網(wǎng)格的生成和提交 spatialMapping.StopSpatialMapping(); isScanning false; UpdateStatus(掃描完成。網(wǎng)格已就緒。); // 在實(shí)際項(xiàng)目中這里可以觸發(fā)保存錨點(diǎn)、分析網(wǎng)格等后續(xù)操作 // StartCoroutine(SaveSpatialAnchorAfterDelay(1.0f)); } void UpdateStatus(string message) { if (statusText ! null) { statusText.text $[狀態(tài)] {message}; } Debug.Log($[SpatialMapping] {message}); } // 示例網(wǎng)格更新后的回調(diào) // private void OnMeshUpdated() // { // Debug.Log(新的網(wǎng)格數(shù)據(jù)已生成。); // } }將這個(gè)腳本掛載到SpatialMappingManager或另一個(gè)管理器對(duì)象上并將場(chǎng)景中的PXR_SpatialMapping組件和你的UI Text對(duì)象拖拽賦值。實(shí)操要點(diǎn)掃描時(shí)你需要緩慢地轉(zhuǎn)動(dòng)頭部讓設(shè)備的傳感器覆蓋你希望建立交互的區(qū)域比如桌面、沙發(fā)和墻面。掃描質(zhì)量與環(huán)境光線和紋理豐富度直接相關(guān)在光線充足、紋理清晰的房間效果最好。4. 基于掃描網(wǎng)格的物理交互實(shí)現(xiàn)掃描得到的網(wǎng)格不僅是視覺(jué)參考更是物理交互的基石。我們要實(shí)現(xiàn)的是投擲一個(gè)虛擬小球讓它能在真實(shí)的桌面彈跳并最終停在真實(shí)的地面上。4.1 配置物理世界首先確保掃描生成的網(wǎng)格參與物理碰撞在之前PXR_SpatialMapping組件的Mesh Prefab中確保其上的Mesh Collider組件被啟用。PICO_SpatialMesh預(yù)制體默認(rèn)已配置好。檢查該預(yù)制體所在的物理層如SpatialMesh并確保后續(xù)創(chuàng)建的虛擬物體所在的層如Default能與SpatialMesh層發(fā)生碰撞。在Edit - Project Settings - Physics中查看碰撞矩陣。4.2 創(chuàng)建可交互的虛擬物體在場(chǎng)景中創(chuàng)建一個(gè)Sphere球體命名為“MR Ball”。為其添加以下組件和設(shè)置Rigidbody啟用Use Gravity讓其受重力影響。調(diào)整Mass和Drag以獲得合適的手感。Sphere Collider調(diào)整半徑。創(chuàng)建一個(gè)新材質(zhì)賦予它鮮艷的顏色如紅色以便在透視畫面中清晰可見(jiàn)。4.3 實(shí)現(xiàn)抓取與投擲交互PICO SDK提供了完善的手柄輸入檢測(cè)。我們寫一個(gè)腳本MRBallController.cs讓小球能被“抓起”和“投擲”。using UnityEngine; public class MRBallController : MonoBehaviour { private Rigidbody rb; private bool isGrabbed false; private Transform currentController; // 當(dāng)前抓住它的手柄 private Vector3 previousPosition; private float throwForce 3.0f; // 投擲力度系數(shù) void Start() { rb GetComponentRigidbody(); rb.isKinematic false; // 確保物理生效 } void Update() { // 檢測(cè)右手柄扳機(jī)鍵Index Trigger按下 if (PXR_Input.GetControllerState(PXR_Input.Controller.Right).trigger 0.9f) { if (!isGrabbed) { // 簡(jiǎn)單距離檢測(cè)判斷手柄是否靠近小球 float distance Vector3.Distance(transform.position, GetRightControllerPosition()); if (distance 0.2f) // 抓取距離閾值 { GrabBall(PXR_Input.Controller.Right); } } } else { if (isGrabbed) { ReleaseBall(); } } // 如果被抓取讓小球跟隨手柄運(yùn)動(dòng) if (isGrabbed currentController ! null) { // 計(jì)算手柄本幀移動(dòng)的速度用于投擲 Vector3 controllerVelocity (GetRightControllerPosition() - previousPosition) / Time.deltaTime; previousPosition GetRightControllerPosition(); // 讓小球運(yùn)動(dòng)到手柄位置但為了手感可以加一點(diǎn)彈性偏移 Vector3 targetPosition GetRightControllerPosition(); rb.MovePosition(Vector3.Lerp(rb.position, targetPosition, Time.deltaTime * 20f)); // 記錄速度為投擲做準(zhǔn)備這里簡(jiǎn)化處理實(shí)際可更精細(xì) if (controllerVelocity.magnitude 0.1f) { rb.velocity controllerVelocity * 0.5f; // 給予一個(gè)跟隨速度 } } else { previousPosition GetRightControllerPosition(); } } void GrabBall(PXR_Input.Controller controller) { isGrabbed true; currentController (controller PXR_Input.Controller.Right) ? GetRightControllerTransform() : GetLeftControllerTransform(); rb.isKinematic false; // 保持物理模擬但通過(guò)MovePosition控制 rb.drag 10f; // 增大阻力讓抓取感覺(jué)更“粘手” Debug.Log(小球被抓取); } void ReleaseBall() { isGrabbed false; currentController null; rb.drag 0.5f; // 恢復(fù)普通阻力 // 釋放時(shí)給予一個(gè)最后的推力模擬投擲 // 這里用一個(gè)簡(jiǎn)單的力更復(fù)雜的實(shí)現(xiàn)可以計(jì)算釋放前幾幀的平均速度 Vector3 throwDirection (GetRightControllerPosition() - previousPosition).normalized; rb.AddForce(throwDirection * throwForce, ForceMode.VelocityChange); Debug.Log(小球被釋放/投擲); } // 輔助方法獲取右手柄的世界空間位置和Transform private Vector3 GetRightControllerPosition() { return PXR_Input.GetControllerTrackingState(PXR_Input.Controller.Right).position; } private Transform GetRightControllerTransform() { // 這里需要你根據(jù)PICO SDK的實(shí)踐來(lái)獲取手柄Transform // 一種常見(jiàn)方式是通過(guò)PICO XR Origin下的子對(duì)象查找 // 此處為示例假設(shè)存在一個(gè)名為“RightHand”的對(duì)象 return GameObject.Find(RightHand)?.transform; } private Transform GetLeftControllerTransform() { return GameObject.Find(LeftHand)?.transform; } }交互邏輯解析這個(gè)腳本實(shí)現(xiàn)了最簡(jiǎn)單的“接近抓取”和“速度繼承投擲”。當(dāng)手柄靠近小球并扣動(dòng)扳機(jī)時(shí)小球被“吸附”到手柄位置附近。松開(kāi)扳機(jī)時(shí)腳本會(huì)根據(jù)手柄最后的速度方向給小球隊(duì)加一個(gè)力從而實(shí)現(xiàn)投擲效果。小球被投出后Rigidbody組件會(huì)接管其運(yùn)動(dòng)與場(chǎng)景中代表真實(shí)世界的SpatialMesh發(fā)生碰撞從而產(chǎn)生彈跳、滾動(dòng)和停止的物理效果。4.4 增強(qiáng)現(xiàn)實(shí)感遮擋與陰影為了讓虛擬小球更真實(shí)地“融入”環(huán)境可以添加兩個(gè)關(guān)鍵效果深度遮擋PICO SDK的URP配置通常已處理好。確保虛擬物體的渲染隊(duì)列在透視相機(jī)之后這樣現(xiàn)實(shí)物體才能正確遮擋虛擬物體。投射陰影為虛擬小球啟用Cast Shadows和Receive Shadows。同時(shí)你需要一個(gè)簡(jiǎn)單的、適用于MR場(chǎng)景的光源??梢蕴砑右粋€(gè)方向光Directional Light并適當(dāng)調(diào)整其角度和強(qiáng)度讓虛擬物體的陰影方向與現(xiàn)實(shí)世界的光照感覺(jué)大致匹配。雖然陰影不會(huì)投射到真實(shí)的網(wǎng)格上但投射到其他虛擬物體或一個(gè)簡(jiǎn)單的虛擬地面上也能大大增強(qiáng)空間感。5. 五分鐘快速部署與實(shí)測(cè)流程現(xiàn)在我們將所有部分串聯(lián)起來(lái)實(shí)現(xiàn)標(biāo)題承諾的“5分鐘搞定”。分鐘 0-1項(xiàng)目準(zhǔn)備打開(kāi)已配置好PICO SDK和URP的Unity空項(xiàng)目。將PICO XR Origin預(yù)制體拖入場(chǎng)景。分鐘 1-2空間掃描設(shè)置創(chuàng)建SpatialMappingManager空對(duì)象添加PXR_SpatialMapping組件。按3.1節(jié)配置關(guān)鍵參數(shù)尤其是Mesh Prefab和Physics Layer。將SpatialMappingController.cs腳本掛載并完成參數(shù)賦值。分鐘 2-3虛擬物體與交互在場(chǎng)景中創(chuàng)建一個(gè)Sphere調(diào)整大小添加Rigidbody和Sphere Collider。將MRBallController.cs腳本掛載到小球上。在場(chǎng)景中添加一個(gè)簡(jiǎn)單的UI TextCanvas - Text用于顯示狀態(tài)并將其賦值給SpatialMappingController的statusText。分鐘 3-4構(gòu)建與部署點(diǎn)擊File - Build Settings確保場(chǎng)景在Scenes In Build列表中。選擇Android平臺(tái)點(diǎn)擊Switch Platform。連接你的PICO 4 Ultra設(shè)備確保USB調(diào)試已授權(quán)。點(diǎn)擊Build And Run。Unity會(huì)編譯APK并自動(dòng)安裝到設(shè)備上。分鐘 4-5設(shè)備端實(shí)測(cè)戴上PICO設(shè)備啟動(dòng)剛剛安裝的應(yīng)用。進(jìn)入應(yīng)用后根據(jù)狀態(tài)提示按下右手柄的A鍵開(kāi)始掃描。緩慢轉(zhuǎn)動(dòng)頭部觀察半透明的網(wǎng)格逐漸覆蓋你的房間。再次按下A鍵結(jié)束掃描?,F(xiàn)在用右手柄靠近虛擬紅色小球扣動(dòng)扳機(jī)鍵Index Trigger抓起它。揮動(dòng)手柄然后松開(kāi)扳機(jī)將小球投擲出去。你會(huì)看到它撞擊到掃描生成的桌面或墻面網(wǎng)格發(fā)生真實(shí)的物理彈跳和滾動(dòng)最終停下。至此一個(gè)完整的、包含空間感知和物理交互的MR迷你演示就完成了。從零到可交互體驗(yàn)核心流程確實(shí)可以在五分鐘內(nèi)走通。6. 避坑指南與進(jìn)階優(yōu)化在實(shí)際操作中你幾乎一定會(huì)遇到下面這些問(wèn)題。這里是我的踩坑記錄和解決方案。6.1 常見(jiàn)問(wèn)題速查表問(wèn)題現(xiàn)象可能原因解決方案構(gòu)建后設(shè)備黑屏無(wú)透視畫面1. URP渲染管線未正確配置。2. PICO XR插件未在Android設(shè)置中啟用。1. 雙重檢查Graphics和Quality設(shè)置中的PICO_URP_Asset。2. 在Project Settings - XR Plug-in Management - Android中確認(rèn)PICO已勾選。掃描無(wú)網(wǎng)格生成或網(wǎng)格閃爍1. 環(huán)境光線太暗或紋理單一。2.PXR_SpatialMapping組件參數(shù)不當(dāng)。3. 設(shè)備權(quán)限未開(kāi)啟。1. 在光線良好、有豐富紋理如窗簾、書架的環(huán)境下掃描。2. 檢查Update Frequency嘗試調(diào)高。檢查Mesh Prefab是否賦值。3. 確認(rèn)設(shè)備開(kāi)發(fā)者模式、彩色透視、空間追蹤權(quán)限已開(kāi)。虛擬物體穿透網(wǎng)格無(wú)碰撞1. 掃描網(wǎng)格的Mesh Collider未啟用。2. 虛擬物體與網(wǎng)格物理層未設(shè)置碰撞。1. 檢查SpatialMesh預(yù)制體上的Mesh Collider。2. 在Project Settings - Physics中檢查Default層與SpatialMesh層的交叉復(fù)選框是否勾選。手柄抓取不靈敏或物體亂飛1. 抓取距離閾值不合理。2. 投擲力計(jì)算邏輯有問(wèn)題。3.Rigidbody的Drag和Mass參數(shù)不佳。1. 調(diào)整MRBallController中的distance閾值如0.15f-0.25f。2. 簡(jiǎn)化投擲邏輯先確保能穩(wěn)定抓取和釋放??蓞⒖几墒斓氖直换ゲ寮鏧R Interaction Toolkit。3. 調(diào)整小球的物理參數(shù)增加Mass或Drag使其運(yùn)動(dòng)更穩(wěn)定。應(yīng)用在設(shè)備上崩潰1. SDK版本與Unity或設(shè)備OS不兼容。2. 腳本存在空引用異常。1. 嘗試使用PICO SDK發(fā)布說(shuō)明中推薦的Unity版本組合。2. 在Unity編輯器中運(yùn)行查看Console窗口是否有報(bào)錯(cuò)。確保所有Public變量在Inspector中正確賦值。6.2 性能優(yōu)化要點(diǎn)MR應(yīng)用對(duì)性能極其敏感必須保證72Hz/90Hz的渲染幀率。網(wǎng)格復(fù)雜度在PXR_SpatialMapping組件中降低Mesh Triangles Density或設(shè)置Max Mesh Size限制生成網(wǎng)格的面片總數(shù)。掃描完成后可以考慮使用MeshFilter.mesh的API對(duì)網(wǎng)格進(jìn)行簡(jiǎn)化Decimate。掃描時(shí)機(jī)不要一直開(kāi)啟掃描。僅在需要時(shí)如用戶進(jìn)入新區(qū)域啟動(dòng)完成后立即停止。SpatialMappingController已經(jīng)實(shí)現(xiàn)了這個(gè)邏輯。繪制調(diào)用Draw Calls掃描生成的多個(gè)網(wǎng)格會(huì)大幅增加Draw Calls。可以考慮在掃描結(jié)束后將相鄰的小網(wǎng)格合并Mesh Combining成一個(gè)或少數(shù)幾個(gè)大網(wǎng)格。物理開(kāi)銷Mesh Collider是性能開(kāi)銷最大的碰撞體。對(duì)于大型靜態(tài)環(huán)境可以考慮在掃描后為網(wǎng)格生成一個(gè)簡(jiǎn)化的Box Collider或Mesh Collider代理用于物理交互而原網(wǎng)格僅用于渲染。6.3 進(jìn)階方向從Demo到產(chǎn)品這個(gè)五分鐘Demo只是一個(gè)起點(diǎn)。要做出真正可用的MR應(yīng)用你還需要深入以下幾點(diǎn)空間錨點(diǎn)Spatial Anchor掃描的網(wǎng)格是局部的設(shè)備重啟后就會(huì)丟失。PICO SDK提供了空間錨點(diǎn)服務(wù)可以將虛擬物體的位置持久化地“釘”在真實(shí)世界的某個(gè)坐標(biāo)。即使應(yīng)用重啟物體也能回到原處。這是實(shí)現(xiàn)MR持久化體驗(yàn)的關(guān)鍵。平面檢測(cè)Plane Detection除了粗糙的網(wǎng)格SDK通常能提供識(shí)別出的水平面如地面、桌面和垂直面如墻壁。這比直接用網(wǎng)格碰撞更高效、更精確特別適合放置物體。更自然的交互替換我們寫的簡(jiǎn)單抓取腳本集成XR Interaction Toolkit。這是一個(gè)Unity官方包提供了標(biāo)準(zhǔn)化、可擴(kuò)展的抓取、觸碰、射線交互等模板能極大提升開(kāi)發(fā)效率和交互品質(zhì)。場(chǎng)景理解利用網(wǎng)格數(shù)據(jù)可以進(jìn)行簡(jiǎn)單的場(chǎng)景分析比如識(shí)別出最大的水平面作為“地面”找到垂直面作為“墻”從而自動(dòng)布置虛擬內(nèi)容。這套流程的價(jià)值在于它為你搭建了一個(gè)零基礎(chǔ)的、可運(yùn)行的MR開(kāi)發(fā)腳手架。你能在最短時(shí)間內(nèi)看到效果建立信心然后沿著上述任何一個(gè)進(jìn)階方向深入下去去構(gòu)建你的MR游戲、教育應(yīng)用或工業(yè)解決方案。記住在MR開(kāi)發(fā)中快速迭代和真機(jī)測(cè)試比任何紙上談兵都重要。現(xiàn)在拿起你的PICO 4開(kāi)始掃描你的房間吧。

相關(guān)新聞

基于SDF與Shader的卡通云朵消散效果完整實(shí)現(xiàn)指南

基于SDF與Shader的卡通云朵消散效果完整實(shí)現(xiàn)指南

1. 項(xiàng)目概述與核心價(jià)值最近在做一個(gè)風(fēng)格化項(xiàng)目,需要實(shí)現(xiàn)一種卡通風(fēng)格的云朵消散效果,不是那種寫實(shí)的、基于體積云的物理模擬,而是更偏向于2D動(dòng)畫或者三渲二風(fēng)格里,云像棉花糖一樣被風(fēng)吹散或者被角色“打散”的視覺(jué)表現(xiàn)。市面上現(xiàn)成…

2026/8/3 18:29:03 閱讀更多
Elasticsearch索引生命周期管理(ILM)實(shí)戰(zhàn):實(shí)現(xiàn)自動(dòng)滾動(dòng)與數(shù)據(jù)歸檔

Elasticsearch索引生命周期管理(ILM)實(shí)戰(zhàn):實(shí)現(xiàn)自動(dòng)滾動(dòng)與數(shù)據(jù)歸檔

1. 項(xiàng)目概述與核心價(jià)值在數(shù)據(jù)驅(qū)動(dòng)的業(yè)務(wù)場(chǎng)景里,日志、監(jiān)控指標(biāo)、用戶行為數(shù)據(jù)這類時(shí)序性數(shù)據(jù)每天都在海量產(chǎn)生。如果你用過(guò) Elasticsearch,肯定遇到過(guò)這樣的煩惱:把所有數(shù)據(jù)都往一個(gè)索引里塞,幾個(gè)月后這個(gè)索引變得無(wú)比臃腫&#x…

2026/8/3 18:19:02 閱讀更多
quartus聯(lián)合單獨(dú)安裝的modelsim仿真

quartus聯(lián)合單獨(dú)安裝的modelsim仿真

版本信息:quartus II 13.1 、modelsim DE 10.6c vivado用習(xí)慣了,現(xiàn)在快速換到quartus下仿真測(cè)試。 寫一個(gè)操作文檔,以fpga實(shí)現(xiàn)pcm編碼為例。 目錄 一、建立工程 1、準(zhǔn)備源碼和仿真文件 2、新建工程 3、加載源文件 4、選擇器件 5、仿…

2026/8/3 19:29:05 閱讀更多
ApacheBench (ab) 壓力測(cè)試工具:從入門到實(shí)戰(zhàn)性能調(diào)優(yōu)

ApacheBench (ab) 壓力測(cè)試工具:從入門到實(shí)戰(zhàn)性能調(diào)優(yōu)

1. 項(xiàng)目概述:為什么我們需要ab命令? 在網(wǎng)站開(kāi)發(fā)和運(yùn)維的日常工作中,性能始終是懸在頭頂?shù)倪_(dá)摩克利斯之劍。一個(gè)新功能上線,一個(gè)促銷活動(dòng)開(kāi)啟,最怕的就是服務(wù)器在流量洪峰面前“躺平”。作為一線工程師,我們…

2026/8/3 19:29:05 閱讀更多
漏洞挖掘高手的核心方法論與實(shí)戰(zhàn)技巧

漏洞挖掘高手的核心方法論與實(shí)戰(zhàn)技巧

1. 漏洞挖掘高手的秘密武器解析剛?cè)胄芯W(wǎng)絡(luò)安全時(shí),我總對(duì)那些能挖到高危漏洞的大神充滿好奇。直到自己踩了三年坑才發(fā)現(xiàn),漏洞挖掘不是玄學(xué),而是有章可循的技術(shù)活。今天就把這些年在甲方乙方摸爬滾打總結(jié)的實(shí)戰(zhàn)經(jīng)驗(yàn),掰開(kāi)揉碎講給各位…

2026/8/3 19:29:05 閱讀更多
Robot Framework自動(dòng)化測(cè)試入門:從核心概念到Web與接口實(shí)戰(zhàn)

Robot Framework自動(dòng)化測(cè)試入門:從核心概念到Web與接口實(shí)戰(zhàn)

1. 項(xiàng)目概述:為什么Robot Framework值得你投入時(shí)間? 如果你正在尋找一個(gè)能快速上手、功能強(qiáng)大且社區(qū)活躍的自動(dòng)化測(cè)試框架,Robot Framework(后文簡(jiǎn)稱RF)絕對(duì)是一個(gè)繞不開(kāi)的名字。我最早接觸它是在一個(gè)大型的Web和接口混…

2026/8/3 19:29:05 閱讀更多
Excel時(shí)間計(jì)算全解析:從原理到實(shí)戰(zhàn),精準(zhǔn)處理日期與時(shí)分秒

Excel時(shí)間計(jì)算全解析:從原理到實(shí)戰(zhàn),精準(zhǔn)處理日期與時(shí)分秒

1. 項(xiàng)目概述:為什么Excel時(shí)間計(jì)算是個(gè)“技術(shù)活”?剛?cè)胄凶鰯?shù)據(jù)分析那會(huì)兒,我最怕的就是處理帶時(shí)間的數(shù)據(jù)??蛻艚o過(guò)來(lái)一個(gè)Excel表,里面密密麻麻記錄著用戶的操作日志,時(shí)間戳格式五花八門,有“2023/12/25 14…

2026/8/3 19:19:05 閱讀更多
全球僅7家廠商通過(guò)ISO/IEC 27001認(rèn)證的名片AI引擎,我們逆向拆解了它的字段置信度熔斷機(jī)制

全球僅7家廠商通過(guò)ISO/IEC 27001認(rèn)證的名片AI引擎,我們逆向拆解了它的字段置信度熔斷機(jī)制

更多請(qǐng)點(diǎn)擊: https://kaifayun.com 第一章:全球僅7家廠商通過(guò)ISO/IEC 27001認(rèn)證的名片AI引擎概覽 名片AI引擎是企業(yè)級(jí)智能文檔處理的核心組件,專注于高精度OCR、語(yǔ)義結(jié)構(gòu)化提取與跨語(yǔ)言實(shí)體對(duì)齊。截至2024年第三季度,全球范圍內(nèi)僅…

2026/8/3 0:07:47 閱讀更多
MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案 【免費(fèi)下載鏈接】MoneyPrinterPlus AI一鍵批量生成各類短視頻,自動(dòng)批量混剪短視頻,自動(dòng)把視頻發(fā)布到抖音,快手,小紅書,視頻號(hào)上,賺錢從來(lái)沒(méi)有這么容易過(guò)! 支持本地語(yǔ)音模型chatTTS,fasterwhisper,…

2026/8/3 7:44:46 閱讀更多
3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說(shuō)說(shuō) 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過(guò),那些年發(fā)過(guò)的QQ空間說(shuō)說(shuō),那些記錄青春的文字…

2026/8/3 12:53:38 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號(hào)分配電路板。該型號(hào)(0100-02186)的核心特點(diǎn)如下:專用于Endura等半導(dǎo)體工藝腔室。集成信號(hào)路由與分配功能。連接控制…

2026/8/2 2:51:21 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機(jī),適用于自動(dòng)化設(shè)備及通用機(jī)械驅(qū)動(dòng)。該型號(hào)(FFMN-32L-10-T0 40AX)的核心特點(diǎn)如下:三相交流異步電動(dòng)機(jī)。額定…

2026/8/2 2:52:49 閱讀更多