3

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?

c4b4d4
  • 964
  • 12
  • 32
  • 1
    Pseudo-solution: I didn't want to make the texture repeat, because I'm drawing above the textures and every single texture coordinate should be unique. So my solution was to measure the width and height of the detected/updated geometry and make a texture image in real-time to fit that desire size. – c4b4d4 Apr 03 '20 at 18:01

0 Answers0