首页 > 其他分享 >iOS ARKit 中的手势检测

iOS ARKit 中的手势检测

时间:2024-01-16 19:35:49浏览次数:27  
标签:iOS entity cubeEntity1 ARKit let ARView translation 手势

     智能移动设备的手势操作是使用者接受并已习惯的操作方式,在移动端 AR 应用中,对虚拟物体的操竹也基本通过手势操作完成,需要注意的是,本次所讲中手势检源是指用户在手机屏幕上的手指操作检测,不是指利用图像技术对使用者手部运动的检测。

    手势检测是指通过检测使用者在手机屏幕上的手指触控运动判断其操作意图的技术,如单击、双击、放、滑动等,ARKit 提供了对触控设备底层 API 的访问权限和高级手势检测功能,可以满足不同的手势定制需要,底层 APTI访问能够获取手指单击的原始位置、压力值、速度信息,高级手势检测功能则借助手勢识别器(Gesture Recognizer)识别预设手势(包括单击、双击、长按、滑动、缩放、平移等)。
在AR应用中,对虚拟物体最常见的3种操控方式分别为平移、缩放、旋转,为简化手势使用难度,Reality Kit 使用 installGestures()方法对单物体操控提供快捷支持,该方法的原型为
CdiscardableResult func installGestures(_ gestures: ARView. EntityGestures = . all, for entity: HasCoLlision) ->[ EntityGestureRecognizer] 其中,参数 gestures 为 ARView.EntityGestures 枚举类型,用于指定可执行的手势操作,entity 指定需要使用手势操作的实体(Entity)。ARView. EntityGestures 枚举包含 all、rotation、scale、translation 4 个枚举值,涵盖了最常见的旋转、缩放、平移操作。使用 installGestures()方法为 entity 添加手势操作时,entity 需要遵循 HasCollision 协议,简单讲就是虚拟物体必须有碰撞器(CollisionShapes),因为本质上手势操作也首先要用射线检测进行碰撞检查,不带碰撞器的虚拟元素无法参与碰撞检测。在代码清单中,我们创建了一个正方体,然后通过程序的方式生成碰撞器,再调用 installGestures()方法,允许用户对该立方体进行操控。

import SwiftUI
import RealityKit
import ARKit
import Combine

struct GestureControlView : View {
    var body: some View {
        return ARViewContainer6().edgesIgnoringSafeArea(.all)
    }
}

struct ARViewContainer6: UIViewRepresentable {
    
    func makeUIView(context: Context) -> ARView {
        
        let arView = ARView(frame: .zero)
        let config = ARWorldTrackingConfiguration()
        config.planeDetection = .horizontal
        arView.session.run(config, options:[ ])
        arView.session.delegate = arView
        arView.createPlane1()
        return arView
    }
    
    func updateUIView(_ uiView: ARView, context: Context) {
    }
}
var cubeEntity1 : ModelEntity?
var gestureStartLocation1: SIMD3<Float>?

extension ARView {
    
    func createPlane1(){
        let planeAnchor = AnchorEntity(plane:.horizontal)
        do {
            let cubeMesh = MeshResource.generateBox(size: 0.1)
            var cubeMaterial = SimpleMaterial(color:.white,isMetallic: false)
            cubeMaterial.color = try SimpleMaterial.BaseColor(tint:UIColor.yellow.withAlphaComponent(0.9999), texture: MaterialParameters.Texture(TextureResource.load(named: "Box_Texture.jpg")))
            cubeEntity1 = ModelEntity(mesh:cubeMesh,materials:[cubeMaterial])
            cubeEntity1!.generateCollisionShapes(recursive: false)
            cubeEntity1?.name = "this is a cube"
            
            planeAnchor.addChild(cubeEntity1!)
            self.scene.addAnchor(planeAnchor)
            self.installGestures(.all,for:cubeEntity1!).forEach{
                     $0.addTarget(self, action: #selector(handleModelGesture1))
                }
        } catch {
            print("找不到文件")
        }
    }
    
   @objc func handleModelGesture1(_ sender: Any) {
       switch sender {
       case let rotation as EntityRotationGestureRecognizer:
         print("Rotation and name :\(rotation.entity!.name)")
         rotation.isEnabled = false
       case let translation as EntityTranslationGestureRecognizer:
         print("translation and name \(translation.entity!.name)")
        
        if translation.state == .ended || translation.state == .cancelled {
            gestureStartLocation1 = nil
            return
        }
        guard let gestureCurrentLocation = translation.entity?.transform.translation else { return }
        guard let _ = gestureStartLocation1 else {
            gestureStartLocation1 = gestureCurrentLocation
            return
        }
         let delta = gestureStartLocation1! - gestureCurrentLocation
         let distance = ((delta.x * delta.x) + (delta.y * delta.y) + (delta.z * delta.z)).squareRoot()
         print("startLocation:\(String(describing: gestureStartLocation1)),currentLocation:\(gestureCurrentLocation),the distance is \(distance)")
          
       case let scale1 as EntityScaleGestureRecognizer:
           if let scale = scale1.entity?.scale{
               cubeEntity1?.scale = scale
           }
       default:
         break
       }
    }

}

 

 

标签:iOS,entity,cubeEntity1,ARKit,let,ARView,translation,手势
From: https://www.cnblogs.com/duzhaoquan/p/17968387

相关文章

  • iOS ARKit 中的射线检测
    射线检测简介    射线检测 Raycasting,直译为射线投射,通常我们根据它的作用称为射线检测。射线检测是在3D数字世界选择某个特定物体常用的一种技术,如在3D、VR游戏中检测子弹命中敌人情况或者从地上捡起一支枪,这都要用到射线检测,射线检测是在3D数字空间中选择虚拟物体......
  • iSpoofer iOS官方網站免費下載以及如何安裝 iSpoofer Android替代品 iSpoofer安全嗎
    當您喜歡玩PokemonGo時,您可以使用iSpoofer來獲得不錯的增強效果。iSpoofer可以輕鬆地在遊戲中添加操縱桿,甚至可以實現免費傳送。其他吸引人的功能包括IV檢查、GPS追蹤、自動行走、快速神奇寶貝捕捉技巧、增強投擲等。最重要的是,您可以獲得一張地圖,可以密切關注周圍的一......
  • iOS ARKit 三大类 ARSession ARAnchor ARFrame
    ARSessionARSession(AR会话)是ARKit中最重要的概念之一,其主要的功能是管理AR应用的状态和整个周期,是ARKitAPI的主要人口。ARSession整合了底层的所有技术并为开发者提供程序界面,这些技术包括从设备运动传感器硬件取数据、捕获摄像头图像数据并进行分析、控制虛拟场景摄像机与硬......
  • iOS ARKit 三大基础能力
    ARKit三大基础能力   ARKit整合了SLAM、计算机视觉、机器学习、传感器融合、表面估计、光学校准、特征匹配、非线性优化等大量低层技术,提供给开发者简洁易用的程序界面。ARKit提供的功能总体可以分为3个部分:运动跟踪、场景理解、渲染,1.运动跟踪运动跟踪可以实时跟......
  • 手势交互!人人都会用的交互方式应该如何设计?
    一、什么是手势交互手势交互是指通过手部动作来进行人机交互的一种方式。随着移动设备和触摸屏技术的普及,手势交互成为了一种重要的交互方式。它可以使用户更加直观地操作设备,提升用户体验,同时也可以拓展设备的交互维度,使得用户可以通过更加丰富的手势来完成各种操作。手势交互的优......
  • iOS ARKit 显示引导示图、添加正方体
    ARKit概述2017年,在WWDC(WorldWideDevelopersConference,苹果全球开发者大会)上,苹果公司了增强现实开发套件ARKit。ARKit一推出即在科技圈引发极大关注,一方面是苹果公司在科技影响力,另一方面更重要的是ARKit在秘动端实现的堪称惊艳的AR效果。ARKit的面世,直接术带到了亿万用......
  • ios如何连接代理?
    1.打开设置,点击无线局限网。2.打开无限局域网开关,连接WIFI,点击已连接WIFI的右侧小图标。3.点击配置代理界面,选择“手动”。4.点开辅助工具,复制局域网的代理地址、端口,填入服务器、端口的输入框中,并打开认证开关。5.填写【用户名、密码】在对应的输入框,点击存储。6.......
  • Vue 3 + TypeScript + Vite + Element-Plus + Router + Axios + Pinia项目搭建(内含完
    Vue3+TypeScript+Vite+Element-Plus+Router+Axios+Pinia项目搭建(内含完整架构)安装Vue3+ts+vitenpminitvite@latest选择y,新建项目名称,选择vue,选择vue-ts下载完成后执行以下命令行cd新建的项目名称npminpmrundev安装Element-Plusnpminstallelement-plus-......
  • 启用DoH(DNS-over HTTPS)在Windows、Android、IOS平台
    做个备忘录,记录下主力设备Win11、安卓、IOS、路由器、浏览器配置DoH(DNS-overHTTPS)的过程Windows11设置-网络和Internet-WLAN-硬件属性-DNS服务器分配Win11原生支持的DoH服务:IPv4Google:8.8.8.8and8.8.4.4Cloudflare:1.1.1.1and1.0.0.1Quad9:9.9.9.9and149.112......
  • 如何屏蔽苹果iOS 17软件自动更新,去除更新通知和标记
    亲爱的小伙伴们大家好!我是咕噜铁蛋!,你是否经常被iOS系统的更新提示所困扰?每次看到那个小红点或者数字提示,心里总是纠结万分。更新吧,怕新系统不如旧系统稳定;不更新吧,那个小红点或数字总是如影随形,让人心烦。今天,我将为你详细解读如何屏蔽iOS17的软件自动更新,让你从此远离更新烦......