我不确定我是否正确接近这一点。我有一个长矩形框,我想在应用程序启动时从相机添加-1.5. 但我希望它是静止的,就像在 ARKit 项目中默认出货的船一样。但每当我添加它时,物体与相机保持相对(远距离)。 i.e - 向它移动,向后移动,向后移动,向前移动。
我虽然在现场放下一个锚点会解决这个问题,但我仍然会得到同样的影响。这是我的代码。任何帮助,将不胜感激:
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()//
// Set the scene to the view
sceneView.scene = scene
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Create a session configuration
let configuration = ARWorldTrackingConfiguration()
//configuration.planeDetection = .horizontal
// Run the view's session
sceneView.session.run(configuration)
print(#function, sceneView.session.currentFrame)
}
// MARK: - SCNSceneRendererDelegate
func renderer(_ renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: TimeInterval) {
print(#function, sceneView.session.currentFrame)
if !hasPortalAnchor {
//add anchor - this may take a second as the current frames are initially nil
if let currentFrame = sceneView.session.currentFrame {
var translation = matrix_identity_float4x4
translation.columns.3.z = -1.3
let transform = simd_mul(currentFrame.camera.transform, translation)
if (arrAnchors.count < 1) {
let portalAnchor = ARAnchor(transform: transform)
sceneView.session.add(anchor: portalAnchor)
arrAnchors.append(portalAnchor)
print(arrAnchors)
}
}
} else {
hasPortalAnchor = true
}
}
//this function gets called whenever we add an anchor to our scene
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
let portalScene = SCNScene(named: "art.scnassets/portal.scn")!
return portalScene.rootNode.childNode(withName: "portal", recursively: true)
}
1 回答
你是故意使用
renderer(_:)
功能吗?如果没有,那么你可以使用以下viewDidLoad
:这将替换启动时出现的门户场景的默认火箭。 (请注意,如果尚未建立跟踪,场景可能会移动.例如,如果灯光较低,或者您处于没有很多功能的环境中(instance))的空白或重复墙壁)。
另外看起来你实际上并没有将
hasPortalAnchor
设置为 true?它被设置在其他地方吗?