美文网首页
ARkit -- hitTest(_ point:, types

ARkit -- hitTest(_ point:, types

作者: li_礼光 | 来源:发表于2017-10-31 11:49 被阅读205次

    HitTest

    工作原理
    关于HitTest有三个方法
    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
    featurePoint
    • 选项二 : estimatedHorizontalPlane
    estimatedHorizontalPlane
    • 选项三 : existingPlane
    existingPlane
    • 选项四 : existingPlaneUsingExtent
    existingPlaneUsingExtent

    点击返回结果 : HitTestResult

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


    ARHitTestResult



    代码测试 : (featurePoint)

    添加属性 :  var node : SCNNode?
    设置属性 :  node = sceneView.scene.rootNode.childNodes.first
    
    extension ViewController {
        override func touchesBegan(_ touches: Set<UITouch>, 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)
        }
    }
    

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

    [<ARHitTestResult: 0x1c013c980 type=featurePoint 
                                   distance=0.383781
                                   localTransform=<translation=(-0.025307 0.019495 -0.015448) 
                                   rotation=(-0.00° 0.00° 0.00°)> 
                                   worldTransform=<translation=(0.207169 -0.221884 -0.304740) 
                                   rotation=(-0.00° 0.00° 0.00°)>>]
    
    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

          本文链接:https://www.haomeiwen.com/subject/regvpxtx.html