【问题标题】:Apply proper finishes on obj model in scenekit?在场景包中的 obj 模型上应用正确的饰面?
【发布时间】:2018-02-28 15:59:53
【问题描述】:

我正在尝试使用 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()
            })
        }

    }
}

漫反射贴图网址

NormalMapUrl

metalnessMapUrl

roughnessMapUrl

【问题讨论】:

    标签: ios swift scenekit


    【解决方案1】:

    您应该确保不同的材料属性(diffusemetalnessroughnessnormal)对 wrapSwrapT 使用相同的 wrap mode。这里SCNWrapModeRepeat 可能就是您要查找的内容。

    注意问题中的代码设置了specular材质属性,但SCNLightingModelPhysicallyBased没有考虑到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      相关资源
      最近更新 更多