导出为USDZ格式的3D艺术品颜色不同。

7

首先声明,我是新手在 iOS 上使用 SceneKit 和玩 AR 环境。

我有一个 3D 模型对象,一辆货车,在 Blender 文件 (.blend) 中 --> 可以在这里找到。

我将其从 Blender 导出为 .glb 文件 --> 可以在这里找到。

然后我在 Reality Converter 应用程序中打开 .glb 文件,并将其导出为 .usdz 文件 --> 可以在这里找到。

问题是当我在 XCode 中预览对象并将其放置在 AR 中时,对象的颜色是错误的。

Blender 对象有问题吗?如果有,应该如何更改以正确导出颜色?

enter image description here

enter image description here

1个回答

10

关于Blender、Maya和Xcode

不幸的是,您在此提到的问题是Blender中一个老问题。实际上,由于Blender操作着色器颜色的线性色彩空间(而非sRGB),因此Blender输出错误的(即不一致的)着色器颜色。在这种情况下,有两种可能的解决方案。第一种方法相当激进——使用真正的专业软件,如Autodesk Maya 2023与USD插件(因为学习Maya需要相当长的时间),其中导出的着色器颜色在正确的色彩空间中被准确地再现——您必须重新分配所有材料。第二种方法是在Xcode的检查器中手动或编程方式修复颜色。

从Maya中,您可以将模型导出为二进制ASCII.usd文件格式(请确保已加载MayaUSD插件)。然后使用Reality Converter将生成的模型转换为.usdz档案。

Xcode解决方案

van.usdz模型加载到Xcode中。 为方便起见,重命名模型层次结构中的节点。

enter image description here

非常重要!

选择 Body_Orange 节点并进入 Attributes Inspector 选项卡。删除 Colors 属性。

Colors 属性保留了 .usdz 的颜色模式。

enter image description here

然后在“材质检视器”中为“物理基础”着色器指定所需的“漫反射”颜色。

enter image description here

此外,您也可以通过编程实现。以下是一个用于SceneKit的SwiftUI示例代码:
import SwiftUI
import SceneKit
...

func makeUIView(context: Context) -> SCNView {

    let sceneView = SCNView(frame: .zero)
    sceneView.scene = SCNScene(named: "van.usdz")
    
    let orangeBody = sceneView.scene?.rootNode.childNodes[0].childNodes[0]
        .childNodes[0].childNode(withName: "Body_Orange", recursively: true)

    orangeBody?.geometry?.firstMaterial?.diffuse.contents = 
          UIColor(red: 218/255, green: 154/255, blue: 93/255, alpha: 255/255)

    let blueBody = sceneView.scene?.rootNode.childNodes[0].childNodes[0]
        .childNodes[0].childNode(withName: "Body_Blue", recursively: true)

    blueBody?.geometry?.firstMaterial?.diffuse.contents = 
          UIColor(red: 58/255, green: 150/255, blue: 207/255, alpha: 255/255)

    sceneView.backgroundColor = .black
    sceneView.autoenablesDefaultLighting = true
    sceneView.allowsCameraControl = true
    sceneView.showsStatistics = true

    return sceneView
}

这里是一个针对RealityKit版本的SwiftUI示例代码:

import SwiftUI
import RealityKit
...

func makeUIView(context: Context) -> ARView {
    
    let arView = ARView(frame: .zero)
    arView.backgroundColor = .black
    
    let vanModel = try! ModelEntity.load(named: "van.usdz")
     
    let orangeBodyPart = vanModel.children[0].children[0].children[0]
                                 .children[0].children[0] as! ModelEntity
    let colorOrange = UIColor(red: 218/255, green: 154/255, 
                             blue: 93/255, alpha: 255/255)
    orangeBodyPart.model?.materials = [SimpleMaterial(color: colorOrange, 
                                                 isMetallic: false)]
    
    let blueBodyPart = vanModel.children[0].children[0].children[0]
                               .children[0].children[1] as! ModelEntity
    let colorBlue = UIColor(red: 58/255, green: 150/255, 
                           blue: 207/255, alpha: 255/255)
    blueBodyPart.model?.materials = [SimpleMaterial(color: colorBlue, 
                                               isMetallic: false)]

    let anchor = AnchorEntity(world: [0, 0,-5])
    vanModel.setParent(anchor)
    arView.scene.anchors.append(anchor)        
    return arView
}

enter image description here

Maya中关于多边形数量和拓扑的几句话

我想提一下你模型中多边形的数量。这样一个简单的模型可以由2K到5K个多边形构成。但是你的模型有超过50,000个多边形,这是一个巨大的数字。你的高多边形模型将消耗大量的资源(CPU、GPU、内存),因此可能会掉帧(如图片中所示的58fps)。

那么,你该怎么办呢?理想情况下,创作游戏和移动平台的低多边形模型是3D建模师的工作——这真的是一项宝贵的技能。修改已经完成的网格(保存为分发格式,如.fbx.usdz)通常是一个不好的主意。然而,例如Autodesk Maya就有一个拓扑工具(Mesh –> Retopologize),可以使用先进的算法显著减少多边形的数量。观看官方视频 (时间-00:50)。

enter image description here


2
那么,接下来应该怎么做呢?将模型以什么格式保存,以便在Maya中打开并进一步导出为usdz? - Laur Stefan
将您的汽车模型以.usd.dae.fbx.obj格式导入Maya,然后分配正确颜色的新Maya着色器(如有需要,创建新UV映射),最后将模型导出为.usd.fbx格式。 - Andy Jazz
2
@LaurStefan,我已经更新了我的答案。 - Andy Jazz
2
@andy-jazz,谢谢你,我现在会测试它。另外,很抱歉打扰你,如何减少多边形数量?它看起来还是一样吗?我问这个问题是因为这个模型不是我做的。 - Laur Stefan
2
理想情况下,3D建模师的工作是构思和创建低多边形模型(这是一项很酷的技能)。修改已经完成的网格模型总是不好的。但是,例如Maya有一个重拓扑工具(Mesh –> Retopologize.)。https://www.youtube.com/watch?v=0LKrSvMatpA(时间-00:55)。 - Andy Jazz
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接