简体   繁体   中英

Apply proper finishes on obj model in scenekit?

I am trying to apply metalness map on .obj Model using scenekit (ARIkit iOS). Unfortunately, It's displaying vertical lines.

Please refer below code and also, I have attached screenshot for proper understanding.

Model is UV unwrapped to resolve tiling issue in the model, and all materials are attached for review purpose.

Obj URL : 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()
            })
        }

    }
}

在此处输入图片说明 在此处输入图片说明

DiffuseMapUrl 在此处输入图片说明

NormalMapUrl在此处输入图片说明

metalnessMapUrl 在此处输入图片说明

roughnessMapUrl在此处输入图片说明

You should make sure the different material properties ( diffuse , metalness , roughness and normal ) use the same wrap mode for wrapS and wrapT . Here SCNWrapModeRepeat is likely what you are looking for.

Note The code in the question sets the specular material property, but SCNLightingModelPhysicallyBased does not take it into account.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM