ARkit -- hitTest(_ point:, types:)

HitTest

ARkit -- hitTest(_ point:, types:)_第1张图片
工作原理
关于HitTest有三个方法
ARkit -- hitTest(_ point:, types:)_第2张图片
hitTest

方法一 : hitTest(_ point:, types:)

 /**
功能概述 : 搜索对应于视图中某个点的对象的当前帧。
@discussion  视图坐标空间中的2D点可以指沿线段的任何点
             在3D坐标空间中。 命中测试是在沿着该线段的世界中找到物体的过程。

@param point  视图坐标系中的一个点。
@param types  要搜索的结果的类型。
@return       从最近到最远排列的所有命中测试结果的数组。
*/
open func hitTest(_ point: CGPoint, types: ARHitTestResult.ResultType) -> [ARHitTestResult]

关于命中测试结果类型的选项集。


@available(iOS 11.0, *)
public struct ResultType : OptionSet {

    public init(rawValue: UInt)
    
    /** 结果类型与最近的特征点相交t. */
    public static var featurePoint: ARHitTestResult.ResultType { get }
    
    /** 结果类型来自与当前帧确定的水平面估计相交. */
    public static var estimatedHorizontalPlane: ARHitTestResult.ResultType { get }
    
    /** 结果类型与现有的平面锚相交. */
    public static var existingPlane: ARHitTestResult.ResultType { get }
    
    /** 结果类型与现有水平面锚点相交,考虑到水平面的程度. */
    public static var existingPlaneUsingExtent: ARHitTestResult.ResultType { get }
}
  • 选项一 : featurePoint
ARkit -- hitTest(_ point:, types:)_第3张图片
featurePoint
  • 选项二 : estimatedHorizontalPlane
ARkit -- hitTest(_ point:, types:)_第4张图片
estimatedHorizontalPlane
  • 选项三 : existingPlane
ARkit -- hitTest(_ point:, types:)_第5张图片
existingPlane
  • 选项四 : existingPlaneUsingExtent
ARkit -- hitTest(_ point:, types:)_第6张图片
existingPlaneUsingExtent

点击返回结果 : HitTestResult

方法一,返回的是一个ARHitTestResult的结果数组.


ARkit -- hitTest(_ point:, types:)_第7张图片
ARHitTestResult
  • type : 看上图
  • distance : 这个有点抽象,这个是ARKit自己内部计算的,估算值.不要太在意这个值
  • 矩阵参考:ARKit -- 矩阵变换
  • anchor : 锚点(Anchor)和位置(Position),这里它是一个4x4的矩阵




代码测试 : (featurePoint)

添加属性 :  var node : SCNNode?
设置属性 :  node = sceneView.scene.rootNode.childNodes.first

extension ViewController {
    override func touchesBegan(_ touches: Set, with event: UIEvent?) {
        let touchPoint = touches.first!.location(in: sceneView)
        let result = sceneView.hitTest(touchPoint, types: ARHitTestResult.ResultType.featurePoint)
        print(result)
        guard let node = node else {
            return
        }
        guard let resultLT = result.first else {
            return
        }
        node.position = SCNVector3Make(resultLT.worldTransform.columns.3.x,
                                       resultLT.worldTransform.columns.3.y,
                                       resultLT.worldTransform.columns.3.z)
    }
}

打印结果(不要在意数值,随便打印的)

[ 
                               worldTransform=>]
ARkit -- hitTest(_ point:, types:)_第8张图片
columns结构体
所以这里面去columns.3, 也就是最下面一排.
怎么理解:

这个featurePoint, ARkit内部会自动通过摄像头检测当前的帧(sceneView.session.currentFrame?)来判断特征点.就是前面第一个gif图的小黄点.这些都是抽象的概念.真实屏幕是不显示的.靠自己的想象力.

我在这里面添加了一个点击方法.通过点击屏幕检测特征点.然后使得当前的AR对象移动到特征点的位置. 也就是你可以通过这样简单的方式.来放置你的AR对象到你想放置的地方.(前提是有特征点)

PS : node.position = SCNVector3Make(....) 这里只是简单操作对象.矩阵内容参考ARKit -- 矩阵变换,要是不理解,就这么记住它 "啊,原来可以这样子."

点击屏幕

其他三种点击类型也差不多返回的结果也是一样的,可以自行试试.

具体这几种点击类型使用的场景是什么?这个后续遇到有更具体的例子,再补充.



小总结 :
我们这里什么时候用到hitTest(_ point:, types:), 这个功能的概述是 :
搜索对应于视图中某个点的对象的当前帧。 (某个点的对象.)
搜索对应于视图中某个点的对象的当前帧。 (某个点的对象.)
搜索对应于视图中某个点的对象的当前帧。 (某个点的对象.)

所以,这里就不考虑AR对象的本身,也就是我点击某个点,也就是检测某个(特征点)点的信息.在这个特征点上该干嘛.放置我想放的AR对象等等.

PS : 这里面的理解只是我个人的非常非常浅显的(小白)理解.非专业.参考参考就好

你可能感兴趣的:(ARkit -- hitTest(_ point:, types:))