将图像作为素材添加到预定义的3d对象(如Swift中的Cube)对我来说很好。现在我正在尝试将图像作为材料添加到在运行时动态创建的多边形。
我希望这样的事情会起作用:
let source = SCNGeometrySource(vertices: vertices)
var data = [Int32]()
for (index, value) in vertices.enumerated() {
data.append(Int32(index))
}
data.insert(Int32(vertices.count), at: 0)
let indexData = Data(bytes: data, count: data.count * MemoryLayout<Int32>.size)
let element = SCNGeometryElement(data: indexData, primitiveType: .polygon, primitiveCount: 1, bytesPerIndex: MemoryLayout<Int32>.size)
geometry = SCNGeometry(sources: [source], elements: [element])
if let material = geometry?.firstMaterial {
material.diffuse.contents = UIImage( named: "Diffuse" )
material.isDoubleSided = true
}
当我将UIImage更改为UIColor时,它可以正常工作。 我建议,我需要纹理的UV贴图。是否可以动态生成一些东西?
答案 0 :(得分:0)
这就是我如何将图像添加为SCNMaterials
var imageMaterial = SCNMaterial()
imageMaterial.isDoubleSided = false
imageMaterial.diffuse.contents = UIImage(named: "myImage")
var cube: SCNGeometry? = SCNBox(width: 1.0, height: 1.0, length: 1, chamferRadius: 0)
var node = SCNNode(geometry: cube)
node.geometry?.materials = [imageMaterial]
答案 1 :(得分:0)
对于基于公式或简单的多边形或多边形集合(即网格)的可能和可行。例如,对于三角形或正方形或圆形等单个多边形,或立方体或球体等,可以手动输入或计算UV值(每个顶点的值介于0.0和1.0之间)。对于任意多边形和模型,在多个多边形上获得无缝且均匀分布的UV贴图变得非常复杂。
所以困难的部分是确定UV坐标,它们不能自动生成。但是,一旦确定甚至计算了UV坐标,就可以使用texcoord语义添加第二个SCNGeometrySource来添加它们:https://developer.apple.com/documentation/scenekit/scngeometrysource.semantic/1523762-texcoord