Saya ingin membuat ubin tanah dengan ARKit menggunakan poligon khusus yang dibuat menggunakan posisi yang dipilih pada rencana horizontal oleh pengguna, tetapi ubin diregangkan dan tidak akan ditampilkan dengan benar, Mungkin masalahnya adalah dari koordinat tekstur, Apa yang salah dengan kode ini?

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) 

Sunting:

Terima kasih kepada Andy, saya mengubah contentsTransform dengan perubahan kecil pada skala transformasi, tetapi masih memiliki masalah yang sama:

.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)

Apa yang saya harapkan:

What I expect

Apa yang terjadi:

What happens

1
Hossein 10 Mei 2021, 22:21

1 menjawab

Jawaban Terbaik

Peregangan tekstur terjadi karena pemetaan tekstur yang salah pada peta UV. Anda harus menggunakan elemen m41 (terjemahkan X) dan m42 (terjemahkan Y), yang berisi SCNMatrix4. Berikut adalah tampilan peregangan ketika elemen matriks m41 sama dengan nol:

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)

enter image description here


Mengimbangi tekstur

Semuanya berubah saat Anda menggeser tekstur di sepanjang sumbu 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)

enter image description here

0
Andy Fedoroff 12 Mei 2021, 12:13