我创建了一个小的增强现实演示应用程序,我想在AR中放置一个大对象。但是,当将对象缩放到1.0时,它始终似乎卡在了相机的前面,我无法从所有角度看到该对象。好像将其缩放到0.001一样,我可以从各个角度查看整个对象。谁能解释为什么我在大型模型中会遇到此类问题,并且有什么办法可以解决此问题。
模型尺寸:-
import UIKit
import ARKit
import SceneKit
class ViewController: UIViewController {
@IBOutlet weak var sceneView: ARSCNView!
private let configuration = ARWorldTrackingConfiguration()
private var node: SCNNode!
//MARK: - Life cycle
override func viewDidLoad() {
super.viewDidLoad()
self.sceneView.showsStatistics = false
self.sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints]
self.sceneView.automaticallyUpdatesLighting = false
self.sceneView.delegate = self
self.addTapGesture()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
configuration.planeDetection = .horizontal
self.sceneView.session.run(configuration)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.sceneView.session.pause()
}
//MARK: - Methods
func addObject(hitTestResult: ARHitTestResult) {
let scene = SCNScene(named: "art.scnassets/Cube.obj")!
let modelNode = scene.rootNode.childNodes.first
modelNode?.position = SCNVector3(hitTestResult.worldTransform.columns.1.x,
hitTestResult.worldTransform.columns.2.y,
-800)
let scale = 1
modelNode?.scale = SCNVector3(scale, scale, scale)
self.node = modelNode
self.sceneView.scene.rootNode.addChildNode(modelNode!)
let lightNode = SCNNode()
lightNode.light = SCNLight()
lightNode.light?.type = .omni
lightNode.position = SCNVector3(x: 0, y: 10, z: 20)
self.sceneView.scene.rootNode.addChildNode(lightNode)
let ambientLightNode = SCNNode()
ambientLightNode.light = SCNLight()
ambientLightNode.light?.type = .ambient
ambientLightNode.light?.color = UIColor.darkGray
self.sceneView.scene.rootNode.addChildNode(ambientLightNode)
}
private func addTapGesture() {
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(didTap(_:)))
self.sceneView.addGestureRecognizer(tapGesture)
}
@objc func didTap(_ gesture: UIPanGestureRecognizer) {
let tapLocation = gesture.location(in: self.sceneView)
let results = self.sceneView.hitTest(tapLocation, types: .featurePoint)
guard let result = results.first else {
return
}
let translation = result.worldTransform.translation
guard let node = self.node else {
self.addObject(hitTestResult: result)
return
}
node.position = SCNVector3Make(translation.x, translation.y, translation.z)
self.sceneView.scene.rootNode.addChildNode(self.node)
}
}
extension float4x4 {
var translation: SIMD3<Float> {
let translation = self.columns.3
return SIMD3<Float>(translation.x, translation.y, translation.z)
}
}
也请在附件中找到视频的链接:-
将模型缩放到0.001后的视频捕获https://drive.google.com/open?id=1sBFEyleSIBMmQV5MgA6rOqJZEc0YUyKR
将模型缩放为1后的视频捕获https://drive.google.com/open?id=1k5-adqLCcwaXoYY1ZePE2D-mOdyLvHvi
缩放比例为1时,我无法从所有角度看到整个对象,并且该对象也随iPad相机一起移动。有什么方法可以将物体固定在固定的位置上吗?
谢谢你。
尝试以下代码,以便将模型放置在预期的经过测试的位置:
@objc func tap(gesture: UITapGestureRecognizer) {
let touch: CGPoint = gesture.location(in: sceneView)
let result: [ARHitTestResult] = sceneView.hitTest(touch,
types: .existingPlaneUsingExtent)
guard let hitTest: ARHitTestResult = result.first
else { return }
self.loadModel(hitTest)
}
然后为loadModel(:_)
方法创建内容:
func loadModel(_ result: ARHitTestResult) {
let scene = SCNScene(named: "art.scnassets/myScene.scn")!
let node: SCNNode? = scene.rootNode.childNode(withName: "model",
recursively: true)
node?.position = SCNVector3(result.worldTransform.columns.3.x,
result.worldTransform.columns.3.y,
result.worldTransform.columns.3.z)
node?.scale = SCNVector3(0.5, 0.5, 0.5)
self.sceneView.scene.rootNode.addChildNode(node!)
}
然后使用@objc #selector
方法提供tap
:
override func viewDidLoad() {
super.viewDidLoad()
let gestureRecognizer = UITapGestureRecognizer(target: self,
action: #selector(tap))
self.sceneView.addGestureRecognizer(gestureRecognizer)
}