visionOS空間計算實戰開發教程Day 6 拖拽和點擊

在之前的學習中我們在空間中添加了3D模型,但在初始擺放后就無法再對其進行移動或做出修改。本節我們在??Day 5??顯示和隱藏的基礎上讓我們模型可以實現拖拽效果,同時對純色的立方體實現點擊隨機換色的功能。

首先是入口文件,無需做出改變,

import SwiftUI@main
struct visionOSDemoApp: App {var body: some Scene {WindowGroup() {ContentView()}ImmersiveSpace(id: "ImmersiveSpace") {ImmersiveView()}}
}

接著是??ViewModel.swift??文件,這里是核心邏輯:

import SwiftUI
import RealityKitclass ViewModel: ObservableObject {private var contentEntity = Entity()private let colors: [SimpleMaterial.Color] = [.gray, .red, .orange, .yellow, .green, .blue, .purple, .systemPink]func setupContentEntity() -> Entity {return contentEntity}func addCube() -> Entity {let entity = ModelEntity(mesh: .generateBox(size: 0.5, cornerRadius: 0),materials: [SimpleMaterial(color: .red, isMetallic: false)],collisionShape: .generateBox(size: SIMD3<Float>(repeating: 0.5)),mass: 0.0)entity.components.set(InputTargetComponent(allowedInputTypes: .indirect))entity.position = SIMD3(x: 0, y: 1, z: -2)contentEntity.addChild(entity)return entity}func changeToRandomColor(entity: Entity) {guard let _entity = entity as? ModelEntity else { return }_entity.model?.materials = [SimpleMaterial(color: colors.randomElement()!, isMetallic: false)]}
}

這里增加了一個??colors???常量,用于設置一個包含多種顏色數組,以便進行隨機顏色修改。顏色是通過??SimpleMaterial???的??color???參數進行隨機更換(??randomElement???),然后賦值給??.materials???屬性,這部分邏輯位于??changeToRandomColor??中。

在??addCube???的邏輯中,我們還是常規地生成一個??entity??并返回。

接著來到??ImmersiveView??:

import SwiftUI
import RealityKitstruct ImmersiveView: View {@State var model = ViewModel()@State var cube = Entity()var body: some View {RealityView { content incontent.add(model.setupContentEntity())cube = model.addCube()}.gesture(DragGesture().targetedToEntity(cube).onChanged { value incube.position = value.convert(value.location3D, from: .local, to: cube.parent!)}).gesture(SpatialTapGesture().targetedToEntity(cube).onEnded { value inmodel.changeToRandomColor(entity: cube)})}
}

在這個視圖中我們聲明了??cube???變量,以便后續的拖拽和隨機顏色修改操作。所以在初始化視圖時將添加的立方體賦值給??cube???。然后分別通過??DragGesture???和??SpatialTapGesture??來實現拖拽和點擊的邏輯。

這里需要說明一個本例中生成的立方體在完成拖放,隱藏后再次展開后會生成一個新的供拖放和修改顏色的模型,這時老的模型就無法再進行拖放了。如果讀者只希望操作同一個模型,可以對??addCube???添加了一個??name???參數,并添加一個??getTargetEntity??方法來獲取該對象,當然也可以通過預設名稱來切換不同的模型進行操作,示例修改如下:

func getTargeEntity(name: String) -> Entity? {return contentEntity.children.first { $0.name == name }}func addCube(name: String) -> Entity {if let entity = getTargeEntity(name: name) {return entity}
...entity.name = name
...

對應的??ImmersiveView???也要修改為類似??cube = model.addCube("Cube1")??。

??ContentView.swift???的代碼與??Day 5??一致:

import SwiftUI
import RealityKitstruct ContentView: View {@State var showImmsersiveSpace = false@Environment(\.openImmersiveSpace) var openImmersiveSpace@Environment(\.dismissImmersiveSpace) var dismissImmersiveSpacevar body: some View {NavigationStack {VStack {Toggle("Show ImmersiveSpace", isOn: $showImmsersiveSpace).toggleStyle(.button)}.padding()}.onChange(of: showImmsersiveSpace) { _, newValue inTask {if newValue {await openImmersiveSpace(id: "ImmersiveSpace")} else {await dismissImmersiveSpace()}}}}
}

運行應用點擊盒子會隨機改變顏色,拖拽盒子會跟隨鼠標的位置移動。

visionOS空間計算實戰開發教程Day 6 拖拽和點擊

示例代碼:??GitHub倉庫?icon-default.png?t=N7T8https://github.com/alanhou/ARDemo/tree/main/visionOS/Day6

其它相關內容請見??虛擬現實(VR)/增強現實(AR)&visionOS開發學習筆記?icon-default.png?t=N7T8https://alanhou.org/augmented-reality/?

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

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

相關文章

Linux反彈SHell與檢測思路

免責聲明 文章僅做經驗分享用途,利用本文章所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,作者不為此承擔任何責任,一旦造成后果請自行承擔!!! 反彈shell payload在線生成 https://www.chinabaiker.com/Hack-Tools/ Online - Reverse Shell G…

Talk | UCSB博士生宋珍巧:基于人工智能的功能性蛋白質設計

本期為TechBeat人工智能社區第549期線上Talk。 北京時間11月22日(周三)20:00&#xff0c;UC Santa Barbara博士生—宋珍巧的Talk已準時在TechBeat人工智能社區開播&#xff01; 她與大家分享的主題是: “基于人工智能的功能性蛋白質設計”&#xff0c;介紹了如何利用機器學習算…

linux下文件夾上有個鎖或者x 如何去除

發現linux下文件夾上有個鎖或者x 如何去除 原因 權限問題 解決方法 sudo chmod 777 filename 去除當前文件夾以及所有子文件夾 sudo chmod -R 777 filename

itext - PDF模板套打

項目需求&#xff1a;獲取列表數據之后直接將數據生成一個pdf。因此需要使用到 itext 對pdf進行直接操作。 環境配置 需要為pdf添加文字域&#xff0c;因此需要安裝Adobe Acrobat 準備一個空的PDF文件&#xff0c;如果有現成的模板更好 依賴配置&#xff0c;我們使用itext的7版…

python數據結構與算法-14_樹與二叉樹

樹和二叉樹 前面我們講了兩種使用分治和遞歸解決排序問題的歸并排序和快速排序&#xff0c;堆排序先就此打住&#xff0c;因為涉及到樹的概念&#xff0c;所以我們先來講講樹。 講完了樹之后后面我們開始介紹一種有用的數據結構堆(heap)&#xff0c; 以及借助堆來實現的堆排序…

python命令行 引導用戶填寫ssh登錄信息

字多不看&#xff0c;直接體驗&#xff1a; 待補充 演示代碼 # -*- coding:UTF-8 -*- """ author: dyy contact: douyaoyuan126.com time: 2023/11/23 9:20 file: 引導用戶填寫ssh接口信息.py desc: xxxxxx """# region 引入必要的依賴 impor…

【圖像分類】基于深度學習的垃圾分類系統的設計與實現(ResNet網絡,附代碼和數據集)

寫在前面: 首先感謝兄弟們的關注和訂閱,讓我有創作的動力,在創作過程我會盡最大能力,保證作品的質量,如果有問題,可以私信我,讓我們攜手共進,共創輝煌。(專欄訂閱用戶訂閱專欄后免費提供數據集和源碼一份,超級VIP用戶不在服務范圍之內,不想訂閱專欄的兄弟們可以私信…

LORA 教程

1 什么是LoRa 2 LoRa調制解調技術 3 什么是loraWAN 4 LoRa和LoRaWAN詳細介紹 5 LoRaWAN 物理層&#xff08;PHY&#xff09;詳解 6 LoRaWAN MAC幀格式詳解 7 LoraWAN MAC控制命令詳解 8 LoRaWAN 設備入網流程詳解&#xff08;OTAA和ABP&#xff09; 9 LoRaWAN 自適…

el-table表格排序(需要后端判別),el-table導出功能(向后端發送請求)

&#xff08;1&#xff09;表格排序 &#xff08;2&#xff09;簡單的table導出功能&#xff08;需要后臺支撐&#xff09;必須要有iframe &#xff08;3&#xff09;頁面所有代碼&#xff1a; <template><div class"mainContainer"><el-form:model&…

golang學習筆記——將 channel 用作通信機制

文章目錄 將 channel 用作通信機制Channel 語法無緩沖 channel緩沖 channelschannel 與 goroutine緩沖 channels 示例多路復用 將 channel 用作通信機制 golang學習筆記——將 channel 用作通信機制 golang學習筆記——并發計算斐波納契數 Go 中的 channel 是 goroutine 之間…

使用Pytorch從零開始構建DCGAN

在本文中&#xff0c;我們將深入研究生成建模的世界&#xff0c;并使用流行的 PyTorch 框架探索 DCGAN&#xff08;生成對抗網絡 (GAN) 的一種變體&#xff09;的實現。具體來說&#xff0c;我們將使用 CelebA 數據集&#xff08;名人面部圖像的集合&#xff09;來生成逼真的合…

網絡安全等級保護收費標準?

不同省份價格會略有不同&#xff0c;二級等保一般不低于5萬元;三級等保不低于9萬元&#xff0c;個別省份也可能7萬也能辦理&#xff0c;根據企業實際情況和省市選定的代理機構確定。 等級保護二級? 第二級等保是指信息系統受到破壞后&#xff0c;會對公民、法人和其他組織的合…

刷到一個很騷氣的 Go 錯誤處理新提案

在比較一段長的時間里&#xff0c;Go 的錯誤處理已經沒有什么特別的進展和新改進了。看著已經到了瓶頸期。 今天在 GitHub 上學習時&#xff0c;看到 Go 社區里有人提了個錯誤處理的優化提案《proposal: Go 2: Error-Handling Paradigm with !err Grammar Sugar》&#xff0c;…

《YOLOv8創新改進》專欄指導書冊 手把手創新教程

&#x1f680;&#x1f680;&#x1f680;YOLOv8改進專欄&#xff1a;http://t.csdnimg.cn/hGhVK 學姐帶你學習YOLOv8&#xff0c;從入門到創新&#xff0c;輕輕松松搞定科研&#xff1b; 本專欄為訂閱者提供答疑服務&#xff0c;每一篇提供源代碼和詳細的每一個步驟改進地方。…

Navicat 技術指引 | 適用于 GaussDB 的模型功能

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持對 GaussDB 主備版的管理和開發功能。它不僅具備輕松、便捷的可視化數據查看和編輯功能&#xff0c;還提供強大的高階功能&#xff08;如模型、結構同步、協同合作、數據遷移等&#xff09;&#xff0c;這…

工業交換機具備哪些功能?

在工業網絡中&#xff0c;工業交換機起著至關重要的作用&#xff0c;具備多樣功能和廣泛的應用。 1、工業交換機的作用是實現不同網絡設備之間的互聯。它能夠連接各種不同類型的設備&#xff0c;如計算機、服務器、傳感器和監控設備&#xff0c;實現設備間的相互通信和數據傳輸…

應用高斯高通濾波器提取圖像輪廓

任務要求&#xff1a; 圖為HALCON中的例圖“tooth_rim”&#xff0c;請用高斯高通濾波器提取圖像的輪廓。 任務分析&#xff1a; 圖像的邊緣對應頻譜的高頻部分&#xff0c;可以通過構造一個高頻濾波器&#xff0c;過濾掉圖像的低頻部分&#xff0c;從而得到圖像的邊緣。HALC…

蘋果怎么關閉懸浮球?讓我來解答您的疑惑!

懸浮球是蘋果設備上的一種可進行自定義的快捷操作功能&#xff0c;它可以位于手機屏幕的任意位置&#xff0c;以浮動的方式顯示。然而&#xff0c;有時候懸浮球對某些朋友來說可能會變得多余&#xff0c;那么蘋果怎么關閉懸浮球呢&#xff1f;接下來&#xff0c;小編將為大家揭…

docker compose搭建滲透測試vulstudy靶場示例

前言 滲透測試&#xff08;Penetration test&#xff09;即網絡安全工程師/安全測試工程師/滲透測試工程師通過模擬黑客&#xff0c;在合法授權范圍內&#xff0c;通過信息搜集、漏洞挖掘、權限提升等行為&#xff0c;對目標對象進行安全測試&#xff08;或攻擊&#xff09;&am…

【快應用】小程序轉快應用中如何獲取用戶已授權的權限

【關鍵詞】 權限、SystemInfo、setting 【問題背景】 小程序轉快應用&#xff0c;用戶在使用快應用的過程中如果產生了一些授權行為&#xff0c;開發者是否有辦法去收集到用戶已經授權過的權限呢&#xff0c;從而進行更好管理呢&#xff1f; 【解決方案】 小程序轉快應用中是…