AR/MR實時光照陰影開發教程

一、效果演示

1、PICO4 Ultra MR 發光的球

2、AR實時光照

二、實現原理

? ? ? ? PICO4 Ultra MR開發時,通過空間網格能力掃描周圍環境,然后將掃描到的環境網格材質替換為一個透明材質并停止掃描;基于Google ARCore XR Plugin和ARFoundation進行安卓手機的AR開發,通過掃描周圍環境進行平面識別,然后將掃描到的平面的材質替換為一個透明材質并停止掃描。此處透明材質可以接收光照和陰影。

三、實現過程

? ? ? ? 本教程使用Unity版本為2022.3LTS,渲染管線為URP,Built-In同樣可用。

1、創建透明材質

? ? ? ? 透明材質著色器來源于Meta的MRUK Sample,點擊此處進入其Github頁。

? ? ? ? 克隆項目至本地,用Unity國際版本打開項目,需要復制著色器及三個依賴文件至計算機本地路徑下。

(1)著色器資源準備

? ? ? ? 找到下圖所示Packages路徑下的著色器,右鍵在資源管理器中打開,復制至本地文件夾下。

? ? ? ? 找到下圖所示Packages路徑下的EnvironmentDepth文件夾,右鍵在資源管理器中打開,將EnvironmentOcclusion.cginc、URP中的EnvironmentOcclusionURP.hlsl和BiRP中的EnvironmentOcclusionBiRP.cginc復制至本地文件夾下。

? ? ? ? 資源復制完成明細如下圖所示。

(2)項目導入著色器

? ? ? ? 將復制出的著色器及其依賴資源文件拖動至Unity項目合適路徑下。此時,著色器會報錯。

? ? ? ? 此報錯為資源引用路徑所致,雙擊打開HighlightsAndShadows著色器腳本進行修改。

? ? ? ? 1)找到以下引用:

? ? ? ? 修改為:

#include "EnvironmentOcclusionURP.hlsl" //occl

? ? ? ? 2)找到以下引用:

? ? ? ? 修改為:

#include "EnvironmentOcclusionBiRP.cginc" //occl

注意:此引用有兩處,都需修改

? ? ? ? 修改完著色器腳本后,其依賴文件也會因資源引用路徑而報錯。

? ? ? ? 雙擊打開EnvironmentOcclusionBiRP文件進行修改。

? ? ? ? 找到以下引用:

? ? ? ? 修改為:

#include "EnvironmentOcclusion.cginc"

? ? ? ? 雙擊打開EnvironmentOcclusionURP文件進行修改。

? ? ? ? 找到以下引用:

? ? ? ? 修改為:

#include "EnvironmentOcclusion.cginc"

(3)創建材質

? ? ? ? 按照以上修改完相關文件后,便可以使用HighlightsAndShadows著色器。有兩種方式可以將此著色器應用于項目材質。

1)通過著色器直接創建材質

? ? ? ? 選中HighlightsAndShadows著色器,鼠標右鍵-->Create--> Material。

2)材質引用著色器

? ? ? ? 選中項目材質,在Shader設置中,選擇Meta/MRUK/Scene/HighlightsAndShadows。

(4)材質效果

? ? ? ? 可以將材質應用于Plane物體,查看光影效果。

2、PICO4 Ultra MR 發光的球實現

? ? ? ? 此處需要使用空間網格,具體配置不再詳述,參見:PICO4 Ultra MR開發 空間網格掃描 模型導出及預覽或者PICO官網空間網格

(1)材質替換及停止掃描

????????需要在掃描完成后,將網格材質替換為HighlightsAndShadows材質。首先需要找到所有網格對象,掃描生成的網格一般會作為掛載PXR_SpatialMeshManager腳本的物體的子物體,所以只需以此查找網格對象即可。具體代碼如下:

public Transform spatialMeshParent;  //空間網格生成的父物體,即掛載PXR_SpatialMeshManager腳本的物體
public Material meshMaterial;        //接收光照和陰影的材質private MeshRenderer[] spatialMeshes;//空間網格上的MeshRenderer數組
private XRMeshSubsystem meshSubsystem;//網格子系統void Start()
{meshSubsystem = XRGeneralSettings.Instance.Manager.ActiveLoaderAs<PXR_Loader>().meshSubsystem;
}void Update()
{if (Controller.UXR_GetKeyDown(0, XR_KeyCode.APP)){spatialMeshes = spatialMeshParent.GetComponentsInChildren<MeshRenderer>();foreach(MeshRenderer renderer in spatialMeshes){renderer.material = meshMaterial;}//停止掃描網格meshSubsystem.Stop();}
}

(2)燈光設置

? ? ? ? 創建一個點光源作為小球的子物體,并置于小球中心處。

(3)小球彈跳

? ? ? ? 若使小球不會穿過墻面并可以在地面上彈跳,需要給網格預制件添加MeshCollider組件并賦予物理材質,物理材質設置合適彈性參數;小球上則需添加SpereCollider組件和Rigidbody組件,同樣設置物理材質。

3、AR實時光照實現

? ? ? ? 基于ARFoundation進行手機AR開發,若為安卓手機,額外導入Google ARCore XR Plugin,若為蘋果手機,額外導入Apple ARKit?XR Plugin。

(1)AR環境搭建

? ? ? ? 創建XR Origin,并刪除場景里的MainCamera物體。

? ? ? ? 按照下圖所示設置并添加組件。

? ? ? ? 其中,ARPlaneManager的PlanePrefab需要手動創建并制作為預制件,賦予此處。

? ? ? ? 創建ARSession。

(2)材質替換及停止掃描

? ? ? ? 完整代碼如下。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;public class ARDanceManager : MonoBehaviour
{public Material transparentMat;         //接收光照和陰影的材質public GameObject dancerPrefab;         //虛擬人物預制件public ARRaycastManager raycastManager; //射線碰撞檢測器public ARPlaneManager m_ARPlaneManager; //平面生成器private List<ARRaycastHit> hits;private GameObject dancerObject = null;private bool hasSpawned = false;// Start is called before the first frame updatevoid Start(){hits = new List<ARRaycastHit>();}// Update is called once per framevoid Update(){if (dancerObject == null){if (Input.touchCount == 0)return;}if (!hasSpawned){var touch = Input.GetTouch(0);if (raycastManager.Raycast(touch.position, hits, TrackableType.PlaneWithinPolygon | TrackableType.PlaneWithinBounds)){var hitPose = hits[0].pose;if (dancerObject == null)//沒有虛擬物體則生成{dancerObject = Instantiate(dancerPrefab, hitPose.position, /*hitPose.rotation*/dancerPrefab.transform.rotation);dancerObject.name = "Dancer";m_ARPlaneManager.enabled = false;SetAllPlanesTransparent();}else                      //有虛擬物體將虛擬物體錨定到射線碰撞點處{dancerObject.transform.position = hitPose.position;}}hasSpawned = true;}}//設置渲染的平面為透明void SetAllPlanesTransparent(){foreach (var plane in m_ARPlaneManager.trackables){plane.gameObject.GetComponent<MeshRenderer>().material = transparentMat;plane.gameObject.GetComponent<LineRenderer>().material = transparentMat;}}
}

? ? ? ? 以上腳本掛載于場景物體,賦值相應變量即可。

四、視頻教程

? ? ? ? 視頻教程參見:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85450.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85450.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85450.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Python訓練營打卡】day42 @浙大疏錦行

DAY 42 Grad-CAM與Hook函數 知識點回顧 1. 回調函數 2. lambda函數 3. hook函數的模塊鉤子和張量鉤子 4. Grad-CAM的示例 作業&#xff1a;理解下今天的代碼即可 Grad-CAM 在深度學習中&#xff0c;我們經常需要查看或修改模型中間層的輸出或梯度。然而&#xff0c;標準的…

創建ipv6 only和ipv6+ip4的k8s集群的注意事項

關鍵字 : CNI calico vxlan flannel ipv6-only ipv6ipv4 在搭建ipv6-only或ipv6ipv4的k8s集群時&#xff0c;在worker節點加入集群后&#xff0c;發現worker節點上的CNI啟動失敗。 以下是calico的啟動失敗情況 : kubectl get pod -A輸出如下 : NAMESPACE NAME …

鴻蒙OSUniApp離線優先數據同步實戰:打造無縫銜接的鴻蒙應用體驗#三方框架 #Uniapp

UniApp離線優先數據同步實戰&#xff1a;打造無縫銜接的鴻蒙應用體驗 最近在開發一個面向鴻蒙生態的UniApp應用時&#xff0c;遇到了一個有趣的挑戰&#xff1a;如何在網絡不穩定的情況下保證數據的實時性和可用性。經過一番探索和實踐&#xff0c;我們最終實現了一套行之有效…

day 43

應用cnn對kaggle上的圖像數據集進行練習 數據集地址&#xff1a;Cat and Dog import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pyplot as plt im…

Spring Boot 如何實現定時任務

Spring Boot 如何實現定時任務 在現代的微服務架構中&#xff0c;定時任務是一個常見的需求。無論是數據定時同步、定時清理緩存&#xff0c;還是定時發送通知&#xff0c;Spring Boot 提供了非常強大且靈活的定時任務支持。本文將詳細介紹如何在 Spring Boot 中實現定時任務&…

“粽”覽全局:分布式系統架構與實踐深度解析(端午特別版)

第一部分&#xff1a;引言——技術世界的“端午”第二部分&#xff1a;分布式系統概述——粽子節點初探第三部分&#xff1a;核心技術詳解——技術“粽子”大解構 粽葉篇&#xff1a;通信協議糯米篇&#xff1a;一致性算法餡料篇&#xff1a;任務調度與計算包扎篇&#xff1a;系…

AppTrace 視角下 App 一鍵拉起:提升應用轉化率的高效方案?

官網地址&#xff1a;AppTrace - 專業的移動應用推廣追蹤平臺 在大規模開展 App 推廣、用戶召回、廣告投放、邀請傳播等活動時&#xff0c;高效的深度鏈接方案至關重要。它不僅能縮短用戶路徑&#xff0c;帶來無縫、流暢的跳轉體驗&#xff0c;更核心的是通過參數傳遞打通 web…

手拆STL

vector v e c t o r vector vector&#xff0c;動態數組。 先來看一下它的一些基本操作及其拆后殘渣。 1.a.push_back(x)&#xff0c;將 x x x加入動態數組 a a a的末尾。 實現&#xff1a;a[cnt]x 2.a.size()&#xff0c;查詢動態數組 a a a中元素的數量。 實現&#xff1a;cn…

6.01打卡

浙大疏錦行 DAY 40 訓練和測試的規范寫法 知識點回顧&#xff1a; 1. 彩色和灰度圖片測試和訓練的規范寫法&#xff1a;封裝在函數中 2. 展平操作&#xff1a;除第一個維度batchsize外全部展平 3. dropout操作&#xff1a;訓練階段隨機丟棄神經元&#xff0c;測試階段eval模…

CSS專題之層疊上下文

前言 石匠敲擊石頭的第 15 次 在平常開發的時候&#xff0c;有時候會遇到使用 z-index 調整元素層級沒有效果的情況&#xff0c;究其原因還是因為對層疊上下文不太了解&#xff0c;看了網上很多前輩的文章&#xff0c;決定打算寫一篇文章來梳理一下&#xff0c;如果哪里寫的有問…

RabbitMQ集群與負載均衡實戰指南

文章目錄 集群架構概述仲裁隊列的使用1. 使用Spring框架代碼創建2. 使用amqp-client創建3. 使用管理平臺創建 負載均衡引入HAProxy 負載均衡&#xff1a;使用方法1. 修改配置文件2. 聲明隊列 test_cluster3. 發送消息 集群架構 概述 RabbitMQ支持部署多個結點&#xff0c;每個…

Prometheus + Grafana + Cadvisor:構建高效企業級服務監控體系

在現代軟件開發和運維領域&#xff0c;容器化技術的應用越來越廣泛&#xff0c;其中 Docker 作為最受歡迎的容器化解決方案之一&#xff0c;其容器的監控管理變得至關重要。本文將詳細介紹如何使用 cadvisor、Prometheus 和 Grafana 來監控 Docker 容器的狀態。 一、安裝鏡像 …

小提琴圖繪制-Graph prism

在 GraphPad Prism 中為小提琴圖添加顯著性標記(如*P<0.05)的步驟如下: 步驟1:完成統計檢驗 選擇數據表:確保數據已按分組排列(如A列=Group1,B列=Group2)。執行統計檢驗: 點擊工具欄 Analyze → Column analyses → Mann-Whitney test(非參數檢驗,適用于非正態數…

【開源工具】跳過網頁APP禁止粘貼限制:自動輸入鍵盤模擬工具

&#x1f4cc; 【黑科技】跳過網頁APP禁止粘貼限制&#xff1a;自動輸入鍵盤模擬工具 &#x1f308; 個人主頁&#xff1a;創客白澤 - CSDN博客 &#x1f525; 系列專欄&#xff1a;&#x1f40d;《Python開源項目實戰》 &#x1f4a1; 熱愛不止于代碼&#xff0c;熱情源自每一…

深度學習篇---face-recognition的優劣點

face_recognition庫是一個基于 Python 的開源人臉識別工具&#xff0c;封裝了 dlib 庫的深度學習模型&#xff0c;具有易用性高、集成度強的特點。以下從技術實現、應用場景等維度分析其優劣勢&#xff1a; 一、核心優勢 1. 極簡 API 設計&#xff0c;開發效率極高 代碼量少…

Git深入解析功能邏輯與核心業務場景流程

一、Git核心功能邏輯架構 #mermaid-svg-9tj1iCr99u6QenJM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-9tj1iCr99u6QenJM .error-icon{fill:#552222;}#mermaid-svg-9tj1iCr99u6QenJM .error-text{fill:#552222;st…

【大模型】情緒對話模型項目研發

一、使用框架&#xff1a; Qwen大模型后端Open-webui前端實現使用LLamaFactory的STF微調數據集&#xff0c;vllm后端部署&#xff0c; 二、框架安裝 下載千問大模型 安裝魔塔社區庫文件 pip install modelscope Download.py 內容 from modelscope import snapshot_downlo…

Java基礎 Day26

一、網絡編程簡介 1、概念 網絡編程指在網絡通信協議下&#xff0c;不同計算機上運行的程序&#xff0c;進行數據傳輸 2、軟件架構 &#xff08;1&#xff09;CS架構&#xff08;客戶端和服務端&#xff09; 在用戶本地有一個客戶端程序&#xff0c;在遠程有一個服務器端程…

【Hot 100】45. 跳躍游戲 II

目錄 引言跳躍游戲 IIdp解題貪心解題 &#x1f64b;?♂? 作者&#xff1a;海碼007&#x1f4dc; 專欄&#xff1a;算法專欄&#x1f4a5; 標題&#xff1a;【Hot 100】45. 跳躍游戲 II?? 寄語&#xff1a;書到用時方恨少&#xff0c;事非經過不知難&#xff01; 引言 跳躍…

計算機網絡第1章(上):網絡組成與三種交換方式全解析

目錄 一、計算機網絡的概念二、計算機網絡的組成和功能2.1 計算機網絡的組成2.2 計算機網絡的功能 三、電路交換、報文交換、分組交換3.1 電路交換&#xff08;Circuit Switching&#xff09;3.2 報文交換&#xff08;Message Switching&#xff09;3.3 分組交換&#xff08;Pa…