我正在尝试使用scenekit(ARIkit iOS)在.obj模型上应用金属度贴图。不幸的是,它显示垂直线条。
请参考下面的代码,我也附上了截图以便正确理解。
模型是UV展开以解决模型中的平铺问题,并附加所有材料以供审阅。
对象网址:https://s3.ap-south-1.amazonaws.com/p9-platform/product/4f800e4c-52cd-4167-a7c3-6ba5703df7e7.obj
func loadTexture(forMaterial material: SCNMaterial, withFinish finish:FinishModel, forDispatchGroup disPatchGroup:DispatchGroup) {
concurrentQueue.async {
if material.lightingModel != .physicallyBased {
material.lightingModel = .physicallyBased
}
}
if let finishMap = finish.finishMap {
if let diffuseTexturePath = finishMap.diffuseMapUrl {
disPatchGroup.enter()
self.dataProvider.fetchTextureFile(forpath: diffuseTexturePath, successBlock: { (success, imageObject) in
//self.viewController?.report_memory()
material.diffuse.contents = nil
material.diffuse.contents = imageObject
disPatchGroup.leave()
}, failureBlock: { (error) in
disPatchGroup.leave()
})
}
if let metalTexturePath = finishMap.metalnessMapUrl {
disPatchGroup.enter()
self.dataProvider.fetchTextureFile(forpath: metalTexturePath, successBlock: { (success, imageObject) in
// self.viewController?.report_memory()
material.metalness.contents = nil
material.metalness.contents = imageObject
disPatchGroup.leave()
}, failureBlock: { (error) in
disPatchGroup.leave()
})
}
if let roughnessTexturePath = finishMap.roughnessMapUrl {
disPatchGroup.enter()
self.dataProvider.fetchTextureFile(forpath: roughnessTexturePath, successBlock: { (success, imageObject) in
// self.viewController?.report_memory()
material.roughness.contents = nil
material.roughness.contents = imageObject
disPatchGroup.leave()
}, failureBlock: { (error) in
disPatchGroup.leave()
})
}
if let normalTexturePath = finishMap.normalMapUrl {
disPatchGroup.enter()
self.dataProvider.fetchTextureFile(forpath: normalTexturePath, successBlock: { (success, imageObject) in
material.normal.contents = nil
// self.viewController?.report_memory()
material.normal.contents = imageObject
disPatchGroup.leave()
}, failureBlock: { (error) in
disPatchGroup.leave()
})
}
}
}
metallinamapril jajzsburgs
你应该确保不同的材料属性(,diffuse
,metalness
和roughness
)对normal
和wrap mode使用相同的wrapS
。在这里,wrapT
可能就是你想要的。
注意问题中的代码设置SCNWrapModeRepeat
材质属性,但specular
不考虑它。