Поверните текст MeshResource, чтобы он не отражался

При добавлении текста MeshResource без угла и с фиксированным положением в мире он отлично смотрится с точки зрения камеры. Однако, когда пользователь переходит к другой стороне текстового объекта и оборачивается, он выглядит зеркальным.

Я не хочу использовать API look (at_), так как я хочу только повернуть его вокруг оси Y на 180 градусов и, когда пользователь снова пройдет его, сбросить угол до 0.


person Nativ    schedule 12.08.2020    source источник


Ответы (1)


Сначала мы должны поместить текст в якорь, который останется в той же ориентации, даже когда мы поворачиваем текст. Затем добавьте переменную textIsMirrored, которая будет обрабатывать поворот при изменении:

class TextAnchor: Entity,HasAnchoring {
        let textEntity = ModelEntity(mesh: .generateText("text"))
        var textIsMirrored = false {
            willSet {
                if newValue != textIsMirrored {
                    if newValue == true {
                        textEntity.setOrientation(.init(angle: .pi, axis: [0,1,0]), relativeTo: self)
                    } else {
                        textEntity.setOrientation(.init(angle: 0, axis: [0,1,0]), relativeTo: self)
                    }
                }
            }
        }
        
        required init() {
            super.init()
            textEntity.scale = [0.01,0.01,0.01]
            anchoring = AnchoringComponent(.plane(.horizontal, classification: .any, minimumBounds: [0.3,0.3]))
            addChild(textEntity)
        }
}

Затем в вашем ViewController вы можете создать привязку, которая будет иметь камеру в качестве цели, чтобы мы могли отслеживать положение камеры и создавать textAnchor:

let cameraAnchor = AnchorEntity(.camera)
let textAnchor = TextAnchor()

Чтобы он работал, вы должны добавить его как дочерний элемент вашей сцены (желательно в viewDidLoad):

arView.scene.addAnchor(cameraAnchor)
arView.scene.addAnchor(textAnchor)

Теперь в функции ARSessionDelegate вы можете проверить положение камеры относительно вашего текста и повернуть ее, если ось Z ниже 0:

func session(_ session: ARSession, didUpdate frame: ARFrame) {
    if cameraAnchor.position(relativeTo: textAnchor).z < 0 {
        textAnchor.textIsMirrored = true
    } else {
        textAnchor.textIsMirrored = false
    }
}
person RealUglyDuck    schedule 13.08.2020