我有一个 T 恤 3D 对象模型,并且我已使用 SCNScene 套件加载了该模型。我需要根据用户输入值更改模型子网格材质图像大小。
func AddNode(scene:SCNScene, viewerSetup: Insert3DViewer, modelSetup: Insert3DModel) -> SCNNode {
guard let url = Bundle.main.url(forAuxiliaryExecutable: modelSetup.mesh) else {
fatalError("Failed to find model file.")
}
let asset = MDLAsset(url: url)
guard let object = asset.object(at: 0) as? MDLMesh else {
fatalError("Failed to get mesh from asset.")
}
// Create a material from the texture
let scatteringFunction = MDLScatteringFunction()
let material = MDLMaterial(name: "baseMaterial", scatteringFunction: scatteringFunction)
let meshUrl = Bundle.main.url(forResource: modelSetup.material, withExtension: "")
material.setProperty(MDLMaterialProperty(name: modelSetup.material, semantic: .baseColor, url: meshUrl))
for submesh in object.submeshes! {
if let submesh = submesh as? MDLSubmesh {
submesh.material = material
}
}
// Wrap the ModelIO object in a SceneKit object
return SCNNode(mdlObject: object) }
我使用了一张条纹图像作为素材,我需要根据用户缩放输入增加/减少条纹宽度。
您可以将wrapS和wrapT设置为Repeat并设置变换比例。
node.geometry!.firstMaterial!.diffuse.contents = "image.jpg"
node.geometry!.firstMaterial!.diffuse.contentsTransform = SCNMatrix4Mult(SCNMatrix4MakeScale(4, 4, 1), SCNMatrix4MakeTranslation(0, 0, 0))
node.geometry!.firstMaterial!.diffuse.wrapS = .repeat
node.geometry!.firstMaterial!.diffuse.wrapT = .repeat