首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ARKit -使用raycastQuery代替hitTest的Tap节点,已弃用

基础概念

ARKit 是苹果公司开发的增强现实(AR)框架,用于在 iOS 设备上构建 AR 应用。raycastQueryhitTest 都是 ARKit 中用于检测用户交互和物体碰撞的方法。

  • hitTest: 这是一种传统的检测方法,通过屏幕坐标或世界坐标来检测与场景中物体的碰撞。
  • raycastQuery: 这是一种更现代的方法,通过光线投射来检测与场景中物体的交点。

优势

  • 性能优化: raycastQuery 通常比 hitTest 更高效,尤其是在复杂场景中。
  • 灵活性: raycastQuery 提供了更多的控制选项,例如可以指定光线的起点、方向和长度。
  • 未来兼容性: hitTest 已经被标记为弃用,使用 raycastQuery 可以确保代码在未来版本的 ARKit 中仍然有效。

类型

  • Single Query: 单次查询,返回第一个交点。
  • Multiple Queries: 多次查询,返回所有交点。

应用场景

  • 用户交互: 例如,检测用户点击屏幕上的 AR 物体。
  • 物体碰撞: 例如,在 AR 游戏中检测物体之间的碰撞。
  • 定位和跟踪: 例如,通过光线投射来确定 AR 物体的位置和方向。

遇到的问题及解决方法

问题:为什么 hitTest 被弃用?

原因: hitTest 方法在处理复杂场景时性能较差,并且苹果公司希望开发者使用更现代和高效的方法。

解决方法: 使用 raycastQuery 替代 hit镜像Test

示例代码

以下是一个使用 raycastQuery 的示例代码:

代码语言:txt
复制
import ARKit

class ViewController: UIViewController, ARSCNViewDelegate {
    @IBOutlet var sceneView: ARSCNView!

    override func viewDidLoad() {
        super.viewDidLoad()
        sceneView.delegate = self
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        guard let touchLocation = touches.first?.location(in: sceneView) else { return }
        let raycastQuery = ARRaycastQuery(origin: sceneView.pointOfView!.position, direction: sceneView.pointOfView!.forward)
        let results = sceneView.session.raycast(raycastQuery)

        if let result = results.first {
            let node = result.node
            print("Tapped node: \(node.name ?? "")")
        }
    }
}

参考链接

通过使用 raycastQuery,你可以获得更好的性能和更多的控制选项,同时确保代码在未来版本的 ARKit 中仍然有效。

相关搜索:Create已弃用:从v5使用新的签名Injector.create(选项)(弃用)我的代码使用或覆盖了已弃用的APIFlutter: FlutterFirebaseInstanceIDService.java使用或覆盖已弃用的API“mainClassName: String的'setter已弃用。”Java中不推荐使用如果x..y`中的` `when (a)被弃用,我应该使用什么来代替?ReactiveMongo中的find方法已弃用。使用带有可选投影的'find‘Laravel灯塔4.16获取当前用户,而不使用已弃用的@middleware使用已弃用的项“std::ascii::AsciiExt”:请改用固有方法“‘subscribe”已弃用。使用观察者而不是完整的回调使用retrofit2的Post Soap XML请求(已弃用简单XML框架)如何在没有DesiredCapabilities(已弃用)的情况下使用AndroidDriver或IOSDriver?如何使用do和"by“以及"groupby”重写这个已弃用的表达式(Julia)迁移到Rails 6.1后,使用RSpec发出的connection_config已弃用警告“‘Fluttertoast”已弃用,不应使用。将在进一步的版本中删除在Opencv Python中使用值指针是不安全且已弃用的错误Flutter应用程序,已弃用标题的AppBar主题,使用了headline6,但未使用work全局Knex.raw已弃用,请使用knex.raw (将已初始化的knex对象链断开)在package.json文件中指定nodejs版本,以确保不使用已弃用的接口对于基于UIScene的应用程序,UIAlertView已弃用且不可用,请使用UIAlertControllerFutureWarning: pandas.util.testing已弃用。改为使用pandas.testing的公共API中的函数。如何摆脱消息“‘视窗’已弃用在iOS 15.0:在相关的视窗场景上使用UIWindowScene.windows代替”与AdMob横幅?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

使用Pluto 检测已弃用的 Kubernetes API

随着这些更改的出现,API 的某些部分被弃用并最终被删除。为了能够保持最新的 Kubernetes 集群版本,我们必须识别不推荐使用的 API 并更新它们。...我们如何发现已弃用和即将删除的API版本资源呢?该问题的一个答案是查看官方弃用文档,并检查在即将到来的Kubernetes更新中将删除的API资源版本。...Kubernetes API弃用的原因 Kubernetes指定了一个弃用策略,它定义了如果API的某些部分被弃用意味着什么?...本质上意味着Kubernetes API服务器的相关端点被标记为删除并最后被删除,由于API服务器管理资源生命周期,因此使用已删除API版本的资源将组织该资源的部署。...该版本在 1.16 中已弃用 如果您想查看单个命名空间的信息,可以传递 --namespace 或 -n 标志来限制输出。

28530

ARKit示例 - 第3部分:添加几何和物理乐趣

在上一篇文章中,我们使用ARKit来检测现实世界中的水平平面,然后将这些平面可视化。在本文中,我们现在将开始为我们的AR体验添加虚拟内容,并开始与检测到的平面进行交互。...*)recognizer { // Take the screen space tap coordinates and pass them to the // hitTest method on...然后我们还给每个ARKit检测到物理体的平面,以便立方体可以与平面交互(有关更多确切的细节,请参阅github 仓库中的Plane.m类)。...take effect [self.sceneView.session runWithConfiguration:configuration]; 下一个 在下一篇文章中,我们将向后退一小步,看看我们已编写的一些代码是否有用...我们还将使用光照和纹理来使插入的几何图形看起来更逼真。

99910
  • ARKit 初探

    ARKit主要负责AR计算,它将ARCamera捕获的视频帧当作背景,使用视觉惯性测距(VIO)来精确跟踪周围的世界,进行坐标转换,场景搭建及平面的捕获;然后,通过 SceneKit(3D)/SpritKit...追踪我们手动添加的希望追踪的点,例如我们手动添加的一个虚拟物体 ARKit 使用视觉惯性测距技术,对摄像头采集到的图像序列进行计算机视觉分析,并且与设备的运动传感器信息相结合。...每个虚拟物体都可以用 SCNNode 来代表,SCNNode 在 SCNScene 中展现,而无数SCNScene 组成 3D 世界。...它有几个重要的方法需要特别强调一下: hitTest 方法 - (NSArray *)hitTest:(CGPoint)point types:(ARHitTestResultType...当需要放置任意门时,就用+transDimenRoomAtPosition:方法创建一个transDimenRoom,当用户走进去时,用 -hideWalls: 隐藏四周的墙壁,切换成全景背景。

    2.4K20

    苹果的增强现实框架:ARKit

    与UIKit中的hitTest不同,ARKit的HitTest以设备方向配合视图坐标,建立一条世界中的射线,所有在射 线上的ARAnchor, 会以由近到远的方式返回。...设计骨骼动画是,要求设计师把动画放在根节点上,不要分散地放在每个bone上,这样可以方便地读取出动画到CAAnimation。...ARKit如何做marker? 答:ARKit不会提供这样的能力,如果想实现的,可以用 ARKit 提供的特征点来跑自己的计算机视觉。...答:可以在已识别的物体位置上,添加一个node, 这样就能在之后的处理中一直保持这个物体的追踪。...可以使用旋转矩阵、欧拉角、四元数来定义空间旋转,ARKit的这三种方式均有运用。 旋转矩阵 这个好理解,使用旋转的变换矩阵即可,维度4*4,定义一次旋转需要16个数。

    3.4K00

    ARKit介绍

    您甚至可以使用Metal,SceneKit和Unity和虚幻引擎等第三方工具渲染3D对象。ARKit以卓越的性能完成所有这一切,并且有很好的文档记录。 需要一些想法才能使用ARKit?...,所以我决定使用ARKit创建自己的测量应用程序。 我开始观看介绍ARKit:来自WWDC17的iOS增强现实视频。然后我阅读文档并使用演示应用程序(在增强现实中放置对象)。...image.png 3D中的欧几里德距离公式 我用结束节点位置(两个3D矢量)减去起始节点位置,得到一个新的矢量,然后我应用了公式|a| = sqrt((ax * ax) + (ay * ay) + (...垂直平面检测不是一个特征(但是),但可以用一行代码激活水平平面检测configuration.planeDetection = .horizontal然后ARKit将自动添加,更改或删除当前会话中的平面锚点...我已经知道如何将节点放置在摄像机所在的位置,但我如何获得距离最近的平面的距离。答案是:hitTest(_:types:)。

    2.3K20

    iOS ARKit教程:赤手在空中绘画

    随着历史的发展,让我们用代码弄脏手,看看苹果的增强现实吧! ARKit的沉浸性 ARKit提供了两个主要功能;第一个是三维空间中的相机位置,第二个是水平平面检测。...首先,我们应该确定使用哪种引擎。ARKit可以与Sprite SceneKit或Metal配合使用。在Apple ARKit的例子中,我们使用的是iOS SceneKit,由Apple提供的3D引擎。...检测平面 ARKit可以探测到新的平面,更新现有的平面,或者移除它们。 为了方便地处理平面,我们将创建一个虚拟场景节点,该节点包含平面位置信息和对焦点正方形的引用。...平面是在X和Z方向上定义的,Y是表面的法线。如果我们想让它看起来就像在平面上打印一样,我们应该始终保持我们的绘图节点的位置在相同的Y值上。 平面探测是通过ARKit提供的回调函数完成的。...我们使用它来添加我们自己的平面节点,它也是不可见的,但是它包含关于anchor中的平面方向和位置。 那么位置和方向如何保存在ARPlaneAnchor中?位置、方向和规模都被编码在一个4x4矩阵中。

    1.8K10

    ARKit 教学:如何搭配SceneKit来建立一个简单的ARKit Demo设定ARKit SceneKit View从ARSCNView移除物件

    现在请确认你已具备上述需求,并准备开始进行,以下是我将会带你走过: 建立一个新的ARKit apps项目 设定ARKit SceneKit View 将ARSCNView与View Controller...,其实Xcode也有内键ARKit的范例App,但你仍可以使用Single View App来开发AR app。...允许相机使用权限 在我们要执行我们的App之前,我们需要告知我们使用者,我们得使用相机来进行增强现实的应用,这是一个从iOS10就开始的必要询问告知动作,也因此,请打开info.plist 。...,目的是我们要获得使用者在sceneView的点击位置,并可看得到我们触击的node。...所以回到我们的guard let的代码描述,在else之后,并在return之前,请加入下列代码: let hitTestResultsWithFeaturePoints = sceneView.hitTest

    1.8K20

    ARKit 进阶:物理世界

    写在前面 ARKit的渲染能力是由其他框架实现的,除了苹果的SceneKit, Unity3D、UE, 或者其他自定义的OpenGL、Metal渲染引擎都可以与ARKit相结合。...Demo 视频内容 视频内容 关于物理模拟 虽然物理引擎都具有真实的物理变量,如质量、重力、摩擦力等,但当我们说道物理模拟,不是要真的去用真实世界的数值去模拟物理行为,事实上那样反而会失真。...这种情况看我的回答,重点是当attach body之前如果没有指定形状,那么SceneKit才会使用scale信息,使用SCNPhysicsShapeScaleKey也有一样的效果。...scene test SceneKit与ARKit中共有以下几种scene test,用以观察世界中的物体关系,作用类似UIKit的 hitTest: 方法。...types:(ARHitTestResultType)types; 根据ARSCNView中的点,构造一条3D世界的射线,搜索ARAnchor或真实物体(特征点或已检测出的平面)。

    2.9K70

    iOS版 使用ARKit和Swift创建交互式Domino游戏

    在下面的教程中,我将向您展示如何使用Swift和ARKit制作有趣的Domino游戏。 这就是我们要做的: ?...ARPlaneAnchor为我们提供了检测到的曲面的中心和范围(宽度和高度)值。我们使用范围值来创建平面几何体并使用中心值来定位节点。 我们将平面不透明度设置为30%,因此它不会完全遮挡地板。...由于SCNPlanes在首次创建时是垂直的,因此我们必须将平面旋转90度。创建平面后,将其添加到锚点附加的节点。 每个锚都有唯一的标识符。我们使用其唯一标识符作为关键字将平面节点添加到字典中。...我们使用简单的SCNBox创建我们的多米诺骨牌。为其添加绿色,创建一个放置在其中的节点,并使用我们通过命中测试检测到的坐标来定位它。...我们在节点的Y位置添加一个“0.03”的值来向上移动我们的多米诺骨牌,否则一半的多米诺骨牌会在地板内! 我们将多米诺骨牌节点添加到我们的多米诺骨牌阵列中供以后使用。 现在运行应用程序。

    2.3K30

    iOS ARKit教程:用裸露的手指在空中画画

    使用Apple ARKit将焦点正方形投影在桌子上 下一步是启动ARKit会话。每次出现视图时重新启动会话都是有意义的,因为如果我们不再跟踪用户,我们就可以不使用以前的会话信息。...在ARKit中检测平面 ARKit可以检测新平面,更新现有平面或删除它们。为了以方便的方式处理平面,我们将创建一个虚拟的SceneKit节点,该节点保存平面位置信息和对焦点方块的引用。...平面在X和Z方向上定义,其中Y是表面的法线,即,如果我们想让它看起来好像在平面上打印,我们应该始终将我们的绘图节点位置保持在平面的相同Y值内。 。 平面检测通过ARKit提供的回调函数完成。...我们使用它来添加我们自己的平面节点,该节点也是不可见的,但保存有关平面方向和位置的信息anchor。 那么如何保存位置和方向 ARPlaneAnchor?位置,方向和比例均以4x4矩阵编码。...下面的代码演示了这一点: sceneView.hitTest通过将此2D点投影到最近的平面下方,搜索与屏幕视图中的2D点对应的真实平面。

    2.2K30

    聚焦位置-选择您喜欢的位置放置虚拟物体

    我们将使用焦点方块跟随相机,直到我们对放置感到满意为止。我们将讨论世界变换和命中测试,这是ARKit的两个重要概念。...将焦点方块的几何设置为我们刚刚定义的平面。这里,我们不需要planeNode,因为FocusSquare已经是一个节点。最后,旋转平面节点,使焦点方块与表格对齐,并且不垂直于表格。...这个将在本地使用,所以让我们在末尾添加单词Local以防止混淆。然后,通过将其添加到场景的根节点将其显示在屏幕上。最后,将其保存在稍后要使用的类变量下。运行该应用程序以查看我们的焦点方块。...在代码中,我们解释为: let hitTest = sceneView.hitTest(screenCenter, types: .existingPlane) 这确定了屏幕中心与检测到的水平表面的交点...let hitTestResult = hitTest.first 世界变换 命中测试的目的是检索表面的位置。并且该位置存储在世界变换中。世界变换是命中测试结果相对于世界坐标的节点变换属性。

    2.4K30

    Compose 事件分发(上) 寻找触摸点

    return ProcessResult(dispatchedToSomething, anyMovementConsumed) } 构造的 root 为 LayoutNode 的根节点,在...数据 bean,produce 里面会合并上一次的事件记录 判断是否是 down 事件,内部判断逻辑是,上一次事件的 down 为 false,当前事件的 down 为 true 从根节点开始遍历,获取命中的...,在 move 和 up 时则会直接使用该 hitResult 将 hitResult 集合设置到 hitPathTracker 中,内部会对 hitResult 集合转成 Node 链表,在分发时会遍历该链表...,直觉来看,这肯定是一个遍历操作,我们需要找到遍历的第一个节点,也就是 AndroidComposeView 中设置 root layoutNode。...InnerPlaceable,他是专门用来遍历子 LayoutNode 的 hitTest 操作,他被放在 wrapper 链的最后一个。

    1K10
    领券