【问题标题】:SceneKit: How to access and change colors of this OBJ file?SceneKit:如何访问和更改此 OBJ 文件的颜色?
【发布时间】:2018-06-29 08:36:18
【问题描述】:

可以在 Xcode SceneKit 编辑器中打开下面的 OBJ 文件并更改材质颜色。

但是,文档并不清楚如何从代码中访问相同的材料列表,并以编程方式更改颜色。 (见附件)

func enumerateChildObjects(of: AnyClass, root: MDLObject, using: (MDLObject, UnsafeMutablePointer<ObjCBool>) -> Void, stopPointer: UnsafeMutablePointer<ObjCBool>) 似乎可能会有所帮助,但它不会返回相同的材料列表。

将 OBJ 文件加载到 SceneKit 的代码:

    let modelPath = "model.obj"
    let url = NSURL(string: modelPath)

    let scene = SCNScene(named: modelPath)!
    sceneView.autoenablesDefaultLighting = true
    sceneView.allowsCameraControl = true
    sceneView.scene = scene
    sceneView.backgroundColor = UIColor.white

右侧材质列表(Xcode截图):

下载OBJ文件(点击Download链接):https://poly.google.com/view/cKryD9VnDEZ

【问题讨论】:

  • 您可以使用 enumerateChildObjects 因为节点是引用类型,所以你不要。需要它作为回报。如果您更改 node.firstMaterial.diffuse.content = UIColor.red 会有所帮助。您也可以打印 node.name 以便识别节点
  • 我没有亲自尝试,而是在 xcode 中选择 .obj 文件转到编辑器菜单,并且可能有将其转换为 .scn 文件的选项

标签: ios xcode model scenekit


【解决方案1】:

加载 OBJ 文件的 SCNScene 包含一个 .rootNode 属性,该属性又具有一个 childNodes 属性,该属性包含场景/obj 文件中的 SCNNodes。每个 SCNNode 都有一个 .geometry 属性,其中包含一个描述模型顶点的 SCNGeometry。 SCNGeometry 也有一个 .materials 属性。这是一个 SCNMaterials 数组,您可以简单地循环。

比如从obj加载的场景中只有一个节点,那么mat23材质就是scene.rootNode.childNodes.firstObject.geometry.materials.firstMaterial或者scene.rootNode.childNodes.firstObject.geometry.materials[ 0]

通常,当您从 OBJ 加载单个对象时,您会将 firstObject 分配给 SCNNode,然后您将其作为子节点添加到 SCNView 场景的 rootNode。 (而不是从 obj 分配整个场景)。

简而言之,以编程方式设置场景,对其进行配置并将其分配给 SCNView。不要使用您创建的场景来加载 OBJ 文件,而是从该场景的根节点中获取第一个子节点,并将其添加到您的场景中(例如怪物数组)。您添加的每个节点都有一个几何属性,该几何属性又具有一个材质属性 (https://developer.apple.com/documentation/scenekit/scngeometry/1523472-materials),其中包含专门分配给该节点的材质。

因此,您实际上并没有访问 obj(也不是它的 mtl 文件)的颜色,而是访问为每个 SCNNode 创建的 SCNMaterials Xcode。

【讨论】:

  • 非常感谢!有问题的 OBJ 文件中缺少背包的一部分。这是否意味着我们做错了什么?另外,您如何建议修复照明以匹配 Google Poly 的照明?默认的环境光太刺眼了。
  • 不幸的是,这并不意味着你做错了什么。导入 OBJ 文件有几个错误,包括法线问题和不正确的拓扑。如果可以,请将文件转换为 DAE,或对其进行三角测量。
  • 谢谢!关于灯光有什么建议吗?如果它更简单,我可以发送当前照明的屏幕截图。您可以在此处查看 Google 照明:poly.google.com/view/cKryD9VnDEZ
  • 照明本身就是一个完全不同的话题,如果您有任何问题,我建议您创建一个新问题。也就是说,您可能想尝试更改材质的镜面反射和光泽值。
  • 好的,谢谢。在这里发布了一个新问题:stackoverflow.com/questions/48362672/…
猜你喜欢
  • 2018-05-06
  • 2017-06-23
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
相关资源
最近更新 更多