HitTest
![](https://img.haomeiwen.com/i1638260/d67071d7c8125e78.png)
关于HitTest有三个方法
![](https://img.haomeiwen.com/i1638260/607df115d3d20ac8.png)
方法一 : 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
![](https://img.haomeiwen.com/i1638260/665c454f727cdf99.gif)
-
选项二 : estimatedHorizontalPlane
![](https://img.haomeiwen.com/i1638260/d66c99558a11eeed.gif)
-
选项三 : existingPlane
![](https://img.haomeiwen.com/i1638260/cd7e564b1536042c.gif)
-
选项四 : existingPlaneUsingExtent
![](https://img.haomeiwen.com/i1638260/63e93a81e87737b1.gif)
点击返回结果 : HitTestResult
方法一,返回的是一个ARHitTestResult的结果数组.
![](https://img.haomeiwen.com/i1638260/bd3b6460e3f90df1.png)
- 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<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°)>>]
![](https://img.haomeiwen.com/i1638260/f3b9f6f248f0dd2b.png)
所以这里面去columns.3, 也就是最下面一排.
怎么理解:
这个featurePoint, ARkit内部会自动通过摄像头检测当前的帧(sceneView.session.currentFrame?)来判断特征点.就是前面第一个gif图的小黄点.这些都是抽象的概念.真实屏幕是不显示的.靠自己的想象力.
我在这里面添加了一个点击方法.通过点击屏幕检测特征点.然后使得当前的AR对象移动到特征点的位置. 也就是你可以通过这样简单的方式.来放置你的AR对象到你想放置的地方.(前提是有特征点)
PS : node.position = SCNVector3Make(....) 这里只是简单操作对象.矩阵内容参考ARKit -- 矩阵变换,要是不理解,就这么记住它 "啊,原来可以这样子."
![](https://img.haomeiwen.com/i1638260/7a641bc78e278d24.gif)
其他三种点击类型也差不多返回的结果也是一样的,可以自行试试.
具体这几种点击类型使用的场景是什么?这个后续遇到有更具体的例子,再补充.
小总结 :
我们这里什么时候用到hitTest(_ point:, types:), 这个功能的概述是 :
搜索对应于视图中某个点的对象的当前帧。 (某个点的对象.)
搜索对应于视图中某个点的对象的当前帧。 (某个点的对象.)
搜索对应于视图中某个点的对象的当前帧。 (某个点的对象.)
所以,这里就不考虑AR对象的本身,也就是我点击某个点,也就是检测某个(特征点)点的信息.在这个特征点上该干嘛.放置我想放的AR对象等等.
PS : 这里面的理解只是我个人的非常非常浅显的(小白)理解.非专业.参考参考就好
网友评论