首页 > 解决方案 > 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

编辑:

重新定义方法:

深入思考这个问题,我想到我需要修改纹理的变换来修复拉伸部分,但是如果我这样做,我有两个选择:

这些方法中的任何一种我仍然不知道如何去做。你有什么建议?

标签: scenekitarkittexture-mappingarscnviewscngeometry

解决方案


推荐阅读