ARKit - 点击屏幕后物体卡在相机上
ARKit - Object stuck to camera after tap on screen
我从选择 ARKit 项目时获得的模板项目开始。当您 运行 应用程序时,您可以看到这艘船并从任何角度查看它。
但是,一旦我允许相机控制并点击屏幕或通过平移放大飞船,飞船就会卡在相机上。现在无论我带着相机走到哪里,船都粘在屏幕上。
我经历了 Apple Guide 并且似乎并不真正认为这是意外行为,因为没有关于此行为的任何内容。
缩放或触摸屏幕后如何保持船的位置固定?
嗯,看来 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(_:types:)
的 hitTest
方法有点困惑
文档注释
This method searches for AR anchors and real-world objects detected by
the AR session, not SceneKit content displayed in the view. To search
for SceneKit objects, use the view's hitTest(_:options:) method
instead.
所以如果你想缩放 node
是 SceneKit
内容
,则不能使用该方法
我从选择 ARKit 项目时获得的模板项目开始。当您 运行 应用程序时,您可以看到这艘船并从任何角度查看它。
但是,一旦我允许相机控制并点击屏幕或通过平移放大飞船,飞船就会卡在相机上。现在无论我带着相机走到哪里,船都粘在屏幕上。
我经历了 Apple Guide 并且似乎并不真正认为这是意外行为,因为没有关于此行为的任何内容。
缩放或触摸屏幕后如何保持船的位置固定?
嗯,看来 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(_:types:)
hitTest
方法有点困惑
文档注释
This method searches for AR anchors and real-world objects detected by the AR session, not SceneKit content displayed in the view. To search for SceneKit objects, use the view's hitTest(_:options:) method instead.
所以如果你想缩放 node
是 SceneKit
内容