визуализировать обнаруженную проблему с самолетом в RealityKit

ребята, я хочу визуализировать обнаруженную плоскость в RealityKit, используйте приведенный ниже код, но результат дает, что обнаруженная плоскость плавает при движении камеры (не полностью плавает, немного, но очевидно), поэтому мой вопрос в том, как решить эту проблему ?

может любое тело помочь?

struct ARViewContainer: UIViewRepresentable {

    func makeUIView(context: Context) -> ARView {

        let arView = ARView(frame: .zero)

        let config = ARWorldTrackingConfiguration()
        config.planeDetection = .horizontal
        arView.debugOptions = [.showFeaturePoints, .showWorldOrigin]
        arView.session.run(config, options:[ ])
        arView.session.delegate = arView
        arView.CreatePlane()
        return arView

    }

    func updateUIView(_ uiView: ARView, context: Context) {
    }
}
var planeMesh = MeshResource.generatePlane(width: 0, depth: 0)
var planeEntity = ModelEntity(mesh:planeMesh)

extension ARView : ARSessionDelegate{

    func CreatePlane(){
        let planeAnchor = AnchorEntity(plane:.horizontal)
        //planeEntity.transform.translation = SIMD3(0,0,0)
        planeAnchor.addChild(planeEntity)
        self.scene.addAnchor(planeAnchor)
    }

public func session(_ session: ARSession, didUpdate anchors: [ARAnchor]){
        guard let planeAnchor = anchors[0] as? ARPlaneAnchor else {
          return
        }
        DispatchQueue.main.async {
        let position = planeAnchor.transform.toTranslation()
        let orientation = planeAnchor.transform.toQuaternion()
        let rotatedCenter = orientation.act(planeAnchor.center)
        planeEntity.model?.mesh = MeshResource.generatePlane(
          width: planeAnchor.extent.x,
          depth: planeAnchor.extent.z
        )
        planeEntity.transform.translation = position  + rotatedCenter
        planeEntity.transform.rotation = orientation
        planeEntity.model?.materials = [SimpleMaterial(color:UIColor.white.withAlphaComponent(0.5),isMetallic: false)]
        }


person yolon    schedule 01.03.2020    source источник
comment
Пожалуйста, добавьте дополнительную информацию о своей проблеме.   -  person Momoro    schedule 01.03.2020
comment
не можете даже попробовать это: вы пропустили .toTranslation() и .toQuaternion() расширения   -  person Александр Грабо&    schedule 22.11.2020


Ответы (2)


возможно, я не ясно выразился, я использовал приведенный выше код для визуализации обнаруженной плоскости в RealityKit, да, это работает, я вижу плоскость, и плоскость обновляется при обновлении ARAnchor, то есть положение плоскости, ориентация, размер обновляется, когда проводник продолжает работу. но есть проблема: визуализированная плоскость не фиксируется в пространстве, то есть после того, как я сканировал таблицу, визуализированная плоскость не всегда фиксируется на столе, она может плавать влево 、 вправо 、 под таблицей, когда я перемещаю Камера слева 、 справа 、 под таблицей, особенно по оси Y。 поэтому у меня вопрос, как это происходит? и как это решить?

person yolon    schedule 01.03.2020

Вы можете попробовать отключить planeDetection, когда ваша ARPlane уже имеет якорь и находится в положении, которое вас устраивает. ARKit перестанет обновлять якоря, поэтому привязка к плоскости больше не будет корректироваться и должна лучше фиксироваться на поверхности.

Вы можете сделать это, добавив кнопку для остановки обновлений или проверив, есть ли у вашего самолета якорь:

planeAnchor.anchor!.isAnchored == true

В любом случае просто измените конфигурацию для ARWorldTrackingConfiguration без planeDetection

let config = ARWorldTrackingConfiguration()
config.planeDetection = []
arView.session.run(config, options:[ ])
person RealUglyDuck    schedule 27.04.2020