visionOS空间计算实战开发教程Day 6 拖拽和点击

2023-11-28 15:30

本文主要是介绍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/

这篇关于visionOS空间计算实战开发教程Day 6 拖拽和点击的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

全网最全Tomcat完全卸载重装教程小结

《全网最全Tomcat完全卸载重装教程小结》windows系统卸载Tomcat重新通过ZIP方式安装Tomcat,优点是灵活可控,适合开发者自定义配置,手动配置环境变量后,可通过命令行快速启动和管理... 目录一、完全卸载Tomcat1. 停止Tomcat服务2. 通过控制面板卸载3. 手动删除残留文件4.

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

Python的pandas库基础知识超详细教程

《Python的pandas库基础知识超详细教程》Pandas是Python数据处理核心库,提供Series和DataFrame结构,支持CSV/Excel/SQL等数据源导入及清洗、合并、统计等功能... 目录一、配置环境二、序列和数据表2.1 初始化2.2  获取数值2.3 获取索引2.4 索引取内容2

python依赖管理工具UV的安装和使用教程

《python依赖管理工具UV的安装和使用教程》UV是一个用Rust编写的Python包安装和依赖管理工具,比传统工具(如pip)有着更快、更高效的体验,:本文主要介绍python依赖管理工具UV... 目录前言一、命令安装uv二、手动编译安装2.1在archlinux安装uv的依赖工具2.2从github

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

C#实现SHP文件读取与地图显示的完整教程

《C#实现SHP文件读取与地图显示的完整教程》在地理信息系统(GIS)开发中,SHP文件是一种常见的矢量数据格式,本文将详细介绍如何使用C#读取SHP文件并实现地图显示功能,包括坐标转换、图形渲染、平... 目录概述功能特点核心代码解析1. 文件读取与初始化2. 坐标转换3. 图形绘制4. 地图交互功能缩放

Oracle Scheduler任务故障诊断方法实战指南

《OracleScheduler任务故障诊断方法实战指南》Oracle数据库作为企业级应用中最常用的关系型数据库管理系统之一,偶尔会遇到各种故障和问题,:本文主要介绍OracleSchedul... 目录前言一、故障场景:当定时任务突然“消失”二、基础环境诊断:搭建“全局视角”1. 数据库实例与PDB状态2