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