ARSCNPlaneGeometry обновляет и пересчитывает координаты текстуры, а не растягивает их - PullRequest
1 голос
/ 03 апреля 2020

У меня проблема с координатами текстуры геометрии плоскостей, которые обновляются ARKit. Изображения текстур растягиваются, я хочу этого избежать.

Сейчас я обнаруживаю горизонтальные и вертикальные стены и применяю к ним текстуру. Это работает как очарование ...

Но когда геометрия обновляется , поскольку она расширяет обнаружение стены / пола, координаты текстуры растягиваются вместо повторного отображения, вызывая Текстура выглядит растянутой, как на картинке ниже.

Вы также можете увидеть неотредактированное видео о возникшей проблеме: https://www.youtube.com/watch?v=wfwYPwzND74

Wall

Это фрагмент кода, в котором обновляется геометрия:

func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
     guard let planeAnchor = anchor as? ARPlaneAnchor else {
        return
     }
     let planeGeometry = ARSCNPlaneGeometry(device: device)!
     planeGeometry.update(from: planeAnchor.geometry)

     //I suppose I need to do some texture re-mapping here.

     planeGeometry.materials = node.geometry!.materials
     node.geometry = planeGeometry
}

Я видел, что вы можете определить координаты текстуры, определив ее как источник, подобный этому:

let textCords = [] //Array of coordinates

let uvData = Data(bytes: textCords, count: textCords.count * MemoryLayout<vector_float2>.size)
let textureSource = SCNGeometrySource(data: uvData,
                                          semantic: .texcoord,
                                          vectorCount: textCords.count,
                                          usesFloatComponents: true,
                                          componentsPerVector: 2,
                                          bytesPerComponent: MemoryLayout<Float>.size,
                                          dataOffset: 0,
                                          dataStride: MemoryLayout<vector_float2>.size)

Но я понятия не имею, как заполнить массив textCords, чтобы он правильно соответствовал обновленному planeGeometry

Редактировать:

Пересмотреть подход:

Глубоко задумавшись над проблемой, я пришел к мысли, что Мне нужно изменить преобразование текстуры, чтобы исправить растягивающую часть, но тогда у меня есть два варианта:

  • Либо сохраняйте текстуру достаточно большой, чтобы заполнить всю геометрию, но сохраняя соотношение 1: 1, чтобы избежать растяжения
  • Или сохраняйте текстуру исходного размера, но с соотношением сторон 1: 1, и повторите текстуру несколько раз. раз, чтобы соответствовать всей геометрии.

Любой из этих подходов я все еще потерял, как это сделать. Что бы вы предложили?

...