ARSCNPlaneGeometry обновляет и пересчитывает координаты текстуры, а не растягивает их

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

Прямо сейчас я определяю горизонтальные и вертикальные стены и накладываю на них текстуру. Работает как шарм...

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

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

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

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 и повторите текстуру несколько раз, чтобы она соответствовала всей геометрии.

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

0 ответов

Другие вопросы по тегам