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 и повторите текстуру несколько раз, чтобы она соответствовала всей геометрии.
Любой из этих подходов я все еще не понимаю, как это сделать. Что ты предлагаешь?