我从选择ARKit项目时获得的模板项目开始。运行该应用程序时,您可以看到船并从任何角度查看它。
但是,一旦我允许摄像机控制并点击屏幕或通过平移来放大船,船就会卡在摄像机上。现在,无论我用相机走到哪里,船都固定在屏幕上。
我经历了Apple Guide,似乎并没有真正将其视为意外行为,因为这种行为没有任何意义。
缩放或触摸屏幕后如何保持船的位置固定?
答案 0 :(得分:0)
好吧,看来allowsCameraControl
根本不是答案。这对SceneKit
有利,但对ARKit
不利(也许对AR中的某些事物有好处,但我还不知道)。
要放大视图,需要使用UIPinchGestureRecognizer。
// 1. Find the touch location
// 2. Perform a hit test
// 3. From the results take the first result
// 4. Take the node from that first result and change the scale
@objc private func handlePan(recognizer: UIPinchGestureRecognizer) {
if recognizer.state == .changed {
// 1.
let location = recognizer.location(in: sceneView)
// 2.
let hitTestResults = sceneView.hitTest(location, options: nil)
// 3.
if let hitTest = hitTestResults.first {
let shipNode = hitTest.node
let newScaleX = Float(recognizer.scale) * shipNode.scale.x
let newScaleY = Float(recognizer.scale) * shipNode.scale.y
let newScaleZ = Float(recognizer.scale) * shipNode.scale.z
// 4.
shipNode.scale = SCNVector3(newScaleX, newScaleY, newScaleZ)
recognizer.scale = 1
}
}
关于#2。我对另一种称为hitTest
的{{1}}方法感到困惑
文档注释
此方法搜索AR锚点和被检测到的真实对象 AR会话,而不是视图中显示的SceneKit内容。寻找 对于SceneKit对象,请使用视图的hitTest(_:options :)方法 代替。
因此,如果要缩放hitTest(_:types:)
内容的node
,则无法使用该方法