Как разместить SCNFloor на реальном полу?
Я хотел бы добавить scnfloor там, где настоящий пол, но он появляется сверху, и при добавлении childNode объект не лежит на полу, а выглядит как летающий.
При регистрации положения добавленного узла или привязки плоскости я всегда получаю y = 0
, неважно, сканирую ли я пол или стол.
Что мне не хватает? Или невозможно изменить угол пола? Но в документации написано
"... его локального координатного пространства"
, поэтому я подумал, что это возможно.
Спасибо
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let planeAnchor = anchor as? ARPlaneAnchor else {return}
let anchorX = planeAnchor.center.x
let anchorY = planeAnchor.center.y
let anchorZ = planeAnchor.center.z
print("planeAnchor.center %@", planeAnchor.center) //y always 0
print("node.position %@", node.position) //y always 0
print("convert %@", node.convertPosition(SCNVector3(anchorX, anchorY, anchorZ), to: nil)) //y always 0
let floor = SCNFloor()
let floorNode = SCNNode(geometry: floor)
floorNode.position = SCNVector3(anchorX, anchorY, anchorZ)
let floorShape = SCNPhysicsShape(geometry: floor, options: nil)
floorNode.physicsBody = SCNPhysicsBody(type: .static, shape: floorShape)
node.addChildNode(floorNode)
let childNode = createChildNode()
floorNode.addChildNode(childNode)
}
1 ответ
Значение center.y привязки всегда будет равно нулю, здесь есть дополнительная информация: https://developer.apple.com/documentation/arkit/arplaneanchor/2882056-center
В основном преобразование якорей вместо этого дает правильное положение обнаруженной плоскости. Из-за этого вы можете просто добавить свой экземпляр SCNFloor в качестве дочернего элемента переданного узла, и он будет отображаться в правильной позиции, нет необходимости явно устанавливать позицию, как вы делаете выше.
Вам нужно будет обновить размер вашей геометрии, поскольку экстент ARPlaneAnchor изменится, поскольку ARKit уточняет границы плоскости. Дополнительная информация здесь: https://developer.apple.com/documentation/arkit/tracking_and_visualizing_planes
Например, приведенный ниже код работает для меня, визуализируя SCNFloor с первоначально определенным размером плоскости и визуализируя прямоугольник, который будет располагаться точно поверх него. Самолет аккуратно размещается на полу (или любой другой горизонтальной поверхности, которую вы обнаружите):
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let planeAnchor = anchor as? ARPlaneAnchor else {
return
}
let floor = SCNFloor()
let floorNode = SCNNode(geometry: floor)
floor.length = CGFloat(planeAnchor.extent.z)
floor.width = CGFloat(planeAnchor.extent.x)
node.addChildNode(floorNode)
let box = SCNBox(width: 0.05, height: 0.05, length: 0.05, chamferRadius: 0)
box.materials[0].diffuse.contents = UIColor.red
let boxNode = SCNNode(geometry: box)
boxNode.position = SCNVector3(0, 0.025, 0)
node.addChildNode(boxNode)
}