Если вы посмотрите на Apple Docs
, там указано, что:
Чтобы отслеживать положение и ориентацию реальных или виртуальных объектов относительно камеры, создайте объекты привязки и используйте метод add(anchor:), чтобы добавить их в сеанс дополненной реальности.
Таким образом, я думаю, что, поскольку вы не используете PlaneDetection
, вам нужно будет создать ARAnchor
вручную, если это необходимо:
Всякий раз, когда вы размещаете виртуальный объект, всегда добавляйте ARAnchor, представляющий его положение и ориентацию, в ARSession. После перемещения виртуального объекта удалите привязку в старой позиции и создайте новую привязку в новой позиции. Добавление якоря сообщает ARKit, что положение важно, улучшая качество отслеживания мира в этой области и помогая виртуальным объектам оставаться на месте относительно поверхностей реального мира.
Вы можете узнать больше об этом в следующем потоке -inser">В чем разница между использованием ARAnchor для вставки узла и прямой вставкой узла?
В любом случае, чтобы вы начали, я начал с создания SCNNode
под названием currentNode:
var currentNode: SCNNode?
Затем, используя UITapGestureRecognizer
, я создал ARAnchor
вручную в touchLocation
:
@objc func handleTap(_ gesture: UITapGestureRecognizer){
//1. Get The Current Touch Location
let currentTouchLocation = gesture.location(in: self.augmentedRealityView)
//2. If We Have Hit A Feature Point Get The Result
if let hitTest = augmentedRealityView.hitTest(currentTouchLocation, types: [.featurePoint]).last {
//2. Create An Anchore At The World Transform
let anchor = ARAnchor(transform: hitTest.worldTransform)
//3. Add It To The Scene
augmentedRealitySession.add(anchor: anchor)
}
}
Добавив якорь, я использовал обратный вызов ARSCNViewDelegate
для создания currentNode следующим образом:
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
if currentNode == nil{
currentNode = SCNNode()
let nodeGeometry = SCNBox(width: 0.2, height: 0.2, length: 0.2, chamferRadius: 0)
nodeGeometry.firstMaterial?.diffuse.contents = UIColor.cyan
currentNode?.geometry = nodeGeometry
currentNode?.position = SCNVector3(anchor.transform.columns.3.x, anchor.transform.columns.3.y, anchor.transform.columns.3.z)
node.addChildNode(currentNode!)
}
}
Чтобы проверить, работает ли он, например, чтобы зарегистрировать соответствующий ARAnchor
, я изменил метод tapGesture, чтобы включить это в конце:
if let anchorHitTest = augmentedRealityView.hitTest(currentTouchLocation, options: nil).first,{
print(augmentedRealityView.anchor(for: anchorHitTest.node))
}
Что в моем ConsoleLog
печатает:
Optional(<ARAnchor: 0x1c0535680 identifier="23CFF447-68E9-451D-A64D-17C972EB5F4B" transform=<translation=(-0.006610 -0.095542 -0.357221) rotation=(-0.00° 0.00° 0.00°)>>)
Надеюсь, поможет...
27.03.2018