Я провел некоторое время, глядя на это, и пришел к выводу, что попытка получить расстояние между currentFrame.camera
и anchor
не работает просто потому, что возвращает одинаковые значения независимо от того, anchor
перед или позади камеры.Под этим я подразумеваю, что если мы предположим, что наш якорь находится в точке x, и мы движемся вперед на 1 метр или назад на 1 метр, расстояние от камеры и якоря все еще составляет 1 метр.
Таким образом, после некоторых экспериментовЯ считаю, что нам нужно взглянуть на следующие variables
и functions
, чтобы помочь нам определить, находится ли наш SKNode
перед камерой:
(a) zPosition
SpriteNode, который относится к:
Z-порядок узла (используется для упорядочения).Отрицательный z находится «в» экране, Положительный z находится «вне» экрана
(b) open func intersects(_ node: SKNode) -> Bool
, который:
Возвращает true, если границыэтот узел пересекается с преобразованными границами другого узла, в противном случае - false.
Таким образом, следующее, кажется, делает именно то, что вам нужно:
override func update(_ currentTime: TimeInterval) {
//1. Get The Current ARSKView & Current Frame
guard let sceneView = self.view as? ARSKView, let currentFrame = sceneView.session.currentFrame else { return }
//3. Iterate Through Our Anchors & Check For Our Token Node
for anchor in currentFrame.anchors {
if let spriteNode = sceneView.node(for: anchor), spriteNode.name == "token"{
/*
If The ZPosition Of The SpriteNode Is Negative It Can Be Seen As Into The Screen Whereas Positive Is Out Of The Screen
However We Also Need To Know Whether The Actual Frostrum (SKScene) Intersects Our Object
If Our ZPosition Is Negative & The SKScene Doesnt Intersect Our Node Then We Can Assume It Isnt Visible
*/
if spriteNode.zPosition <= 0 && intersects(spriteNode){
print("Infront Of Camera")
}else{
print("Not InFront Of Camera")
}
}
}
}
Надеюсь, это поможет ...