我在 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 的纵横比,并多次重复纹理以适应整个几何体。
这些方法中的任何一种我仍然不知道如何去做。你有什么建议?