30518e6fcb0b96bb78c7ee59bb4df4cd
ARKit 中用好 projectPoint: 效率又双叒叕提升一倍

projectPoint 用法

projectPoint方法的作用,是将 3D 空间内的点,投影到屏幕所在的平面上。这个方法也有两个:

一个是在 SceneKit 框架内,SCNView通过实现SCNSceneRenderer协议,也就实现了这个方法,所以 ARKit 也可以使用它。如果在 zFar 平面上,则 z 坐标为 1;如果在 zNear 平面上,则 z 坐标为 0;其余则处于 0~1 之间。一般情况下 AR 中用这个就足够了。

func projectPoint(_ point: SCNVector3) -> SCNVector3

另一个是 ARKit 框架中,ARCamera类中,这个类重新实现了projectPoint方法和unprojectPoint方法。由于ARCamera类中不能像SCNView一样,直接获取orientation和viewportSize,所以多了几个参数:

open func projectPoint(_ point: simd_float3, orientation: UIInterfaceOrientation, viewportSize: CGSize) -> CGPoint

示例

在 AR 中,可以用这个方法来实现一个引导标签的功能:
当某个物体出现在你的镜头内时,正常显示虚拟物体;当手机移动/转动时,在屏幕上显示一个标签,引导用户去看虚拟物体。

```swift
var airplane: SCNNode!
var redView: UIView!

override func viewDidLoad() {
super.viewDidLoad()

// Set the view's delegate
sceneView.delegate = self

// Show statistics such as fps and timing information
sceneView.showsStatistics = true

// Create a new scene
let scene = SCNScene(named: "art.scnassets/ship.scn")!
// 调整飞机模型位置
airplane = scene.rootNode.childNode(withName: "ship", recursively: true)!
top Created with Sketch.