【问题标题】:SceneKit – Stretched texture on a Custom GeometrySceneKit - 自定义几何图形上的拉伸纹理
【发布时间】:2021-08-01 05:09:38
【问题描述】:

我想使用 ARKit 使用自定义多边形来平铺地面,该多边形使用用户在水平平面上选择的位置创建,但是瓷砖被拉伸并且无法正确显示,可能问题出在纹理坐标上,这段代码有什么问题?

let vertices: [SCNVector3] = ... //Selected positions by user        
var indices: [Int32] = [Int32(vertices.count)]
var index: Int32 = 0

for _ in vertices {
    indices.append(index)
    index += 1
}
    
let textureCoordinates = [  CGPoint(x: 0, y: 0),
                            CGPoint(x: 1, y: 0),
                            CGPoint(x: 0, y: 1),
                            CGPoint(x: 1, y: 1)
                         ]
    
let vertexSource = SCNGeometrySource(vertices: vertices)
let uvSource = SCNGeometrySource(textureCoordinates: textureCoordinates)
let indexData = Data(bytes: indices, 
                     count: indices.count * MemoryLayout<Int32>.size)
let element = SCNGeometryElement(data: indexData, 
                        primitiveType: .polygon, 
                       primitiveCount: 1, 
                        bytesPerIndex: MemoryLayout<Int32>.size)
let geometry = SCNPlane(sources: [vertexSource, uvSource], 
                       elements: [element]) //Creating geometry
   
//Tile material creation
let material = SCNMaterial()
material.isDoubleSided = true
material.diffuse.wrapS = .repeat
material.diffuse.wrapT = .repeat

//Tile image to tile polygon
material.diffuse.contents = UIImage(named: "tile")!
material.diffuse.contentsTransform = SCNMatrix4MakeScale(32, 32, 0)

geometry.firstMaterial = material

//Tiled Plan to put on the ground
let plane = SCNNode(geometry: geometry)
//Add custom polygon to sceneView
sceneView.scene.rootNode.addChildNode(plane) 

编辑:

感谢 Andy,我更改了 contentsTransform,在变换比例上做了很小的改动,但仍然遇到同样的问题:

.init(
 m11: 5, m12: 0,    m13: 0,   m14: 0,
 m21: 0,    m22: 5, m23: 0,   m24: 0,
 m31: 0,    m32: 0,    m33: 1,   m34: 0,
 m41: 0.5,  m42: 0,    m43: 0,   m44: 1)

我的期望:

会发生什么:

【问题讨论】:

    标签: swift augmented-reality scenekit arkit


    【解决方案1】:

    纹理拉伸是由于 UV 贴图上的错误纹理映射而发生的。您必须使用m41(翻译X)和m42(翻译Y)元素,包含在SCNMatrix4 的第四列中。 Не这是当矩阵元素m41 等于零时拉伸的样子:

    material.diffuse.contentsTransform = .init(
                                           m11: 0.04, m12: 0,    m13: 0,   m14: 0,
                                           m21: 0,    m22: 0.04, m23: 0,   m24: 0,
                                           m31: 0,    m32: 0,    m33: 1,   m34: 0,
                                           m41: 0,    m42: 0,    m43: 0,   m44: 1)
    


    偏移纹理

    当您沿 X 轴移动纹理时,一切都发生了变化:

    material.diffuse.contentsTransform = .init(
                                           m11: 0.04, m12: 0,    m13: 0,   m14: 0,
                                           m21: 0,    m22: 0.04, m23: 0,   m24: 0,
                                           m31: 0,    m32: 0,    m33: 1,   m34: 0,
                                           m41: 0.5,  m42: 0,    m43: 0,   m44: 1)
    

    【讨论】:

    • 非常感谢安迪!请重新检查问题。
    • 嗨@Hossein,我想用来自答案的新输入来纠正问题不是一个好主意。更好的方法——发布一个新问题......
    • 我不明白,什么都没有改变,问题也是一样的。我使用了你的 contentsTransform 并没有改变。
    • 使用 m42 元素沿 Y 轴移动纹理。我已经在我的回答开始时写下了它。
    • 谢谢安迪,我认为它不适用于所有多边形。
    猜你喜欢
    • 2018-03-05
    • 1970-01-01
    • 2023-04-10
    • 2016-04-01
    • 2016-04-26
    • 2016-09-22
    • 2017-03-28
    • 2015-01-28
    • 2018-08-06
    相关资源
    最近更新 更多