ARSCNPlaneGeometry update and re-calculate texture coordinates, instead of stretching them

213 views Asked by At

I'm having a problem on the texture coordinates of planes geometries being updated by ARKit. Texture images get stretched, I want to avoid that.

Right now I'm detecting horizontal and vertical walls and applying a texture to them. It's working like a charm...

But when the geometry gets updated because it extents the detection of the wall/floor, the texture coordinates get stretched instead of re-mapping, causing the texture to look stretched like image below.

You can also see an un-edited video of the problem happening: https://www.youtube.com/watch?v=wfwYPwzND74

Wall

This is the piece of code where the geometry gets updated:

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
}

I have seen that you can define the texture coordinates by defining it as a source like this:

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)

But I have no idea how to fill the textCords array to make it fit correctly accordingly to the updated planeGeometry

Edit:

Re-defining the approach:

Thinking deeply on the problem, I came with the idea that I need to modify the texture's transform to fix the stretching part, but then I have two options if I do that:

  • Either keep the texture big enough to fill the entire geometry but keeping a ratio of 1:1 to avoid stretching
  • Or keep the texture the original size but with 1:1 aspect ratio and repeat the texture multiple times to fit the entire geometry.

Any of these approaches I'm still lost of how to do it. What would you suggest?

0

There are 0 answers