导出为 USDZ 的 3D 图稿具有不同的颜色

Lau*_*fan 7 maya scenekit swift swiftui realitykit

首先我想说,我是 SceneKit 新手,并且在 iOS 上使用 AR 环境。

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

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

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

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

Blender 对象有问题吗?如果是这样,我应该对其进行什么更改才能正确导出颜色?

在此输入图像描述

在此输入图像描述

ARG*_*Geo 10

关于 Blender、Maya 和 Xcode

\n

不幸的是,您在这里提到的问题是Blender 中的一个很大的老问题。事实上,Blender 输出错误的(也称为不一致的)着色器颜色,因为 Blender 在着色器颜色的线性颜色空间(而不是 sRGB)中运行。在这种情况下有两种可能的解决方案。第一个是相当激进的 - 使用真正的 PRO 软件,例如带有USD 插件的Autodesk Maya 2023 (因为学习 Maya 需要相当多的时间),其中导出的着色器的颜色在正确的色彩空间中非常准确地再现\xe2\x80\x93 您必须从头开始重新分配所有材质。第二个 \xe2\x80\x93 手动或以编程方式修复 Xcode 检查器中的颜色。

\n

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

\n

Xcode解决方案

\n

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

\n

在此输入图像描述

\n

很重要!

\n

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

\n

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

\n

在此输入图像描述

\n

然后Material Inspector分配所需的着色器Diffuse颜色physicallyBased

\n

在此输入图像描述

\n

此外,您还可以通过编程方式完成此操作。这是 SceneKit 的 SwiftUI 示例代码:

\n
import SwiftUI\nimport SceneKit\n...\n\nfunc makeUIView(context: Context) -> SCNView {\n\n    let sceneView = SCNView(frame: .zero)\n    sceneView.scene = SCNScene(named: "van.usdz")\n    \n    let orangeBody = sceneView.scene?.rootNode.childNodes[0].childNodes[0]\n        .childNodes[0].childNode(withName: "Body_Orange", recursively: true)\n\n    orangeBody?.geometry?.firstMaterial?.diffuse.contents = \n          UIColor(red: 218/255, green: 154/255, blue: 93/255, alpha: 255/255)\n\n    let blueBody = sceneView.scene?.rootNode.childNodes[0].childNodes[0]\n        .childNodes[0].childNode(withName: "Body_Blue", recursively: true)\n\n    blueBody?.geometry?.firstMaterial?.diffuse.contents = \n          UIColor(red: 58/255, green: 150/255, blue: 207/255, alpha: 255/255)\n\n    sceneView.backgroundColor = .black\n    sceneView.autoenablesDefaultLighting = true\n    sceneView.allowsCameraControl = true\n    sceneView.showsStatistics = true\n\n    return sceneView\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是 RealityKit 版本的 SwiftUI 示例代码:

\n
import SwiftUI\nimport RealityKit\n...\n\nfunc makeUIView(context: Context) -> ARView {\n    \n    let arView = ARView(frame: .zero)\n    arView.backgroundColor = .black\n    \n    let vanModel = try! ModelEntity.load(named: "van.usdz")\n     \n    let orangeBodyPart = vanModel.children[0].children[0].children[0]\n                                 .children[0].children[0] as! ModelEntity\n    let colorOrange = UIColor(red: 218/255, green: 154/255, \n                             blue: 93/255, alpha: 255/255)\n    orangeBodyPart.model?.materials = [SimpleMaterial(color: colorOrange, \n                                                 isMetallic: false)]\n    \n    let blueBodyPart = vanModel.children[0].children[0].children[0]\n                               .children[0].children[1] as! ModelEntity\n    let colorBlue = UIColor(red: 58/255, green: 150/255, \n                           blue: 207/255, alpha: 255/255)\n    blueBodyPart.model?.materials = [SimpleMaterial(color: colorBlue, \n                                               isMetallic: false)]\n\n    let anchor = AnchorEntity(world: [0, 0,-5])\n    vanModel.setParent(anchor)\n    arView.scene.anchors.append(anchor)        \n    return arView\n}\n
Run Code Online (Sandbox Code Playgroud)\n

在此输入图像描述

\n

关于 Maya 中的多边形计数和重新拓扑的几句话

\n

我想对您模型中的多边形数量发表一点评论。这样一个简单的模型可以由 2K 到 5K 的多边形组成。但您的模型有超过 50,000 个多边形,这是一个巨大的数字。您的高聚模型将消耗大量资源(CPU、GPU、内存),因此,可能会出现丢帧(58 fps,如图所示)。

\n

所以你对此能做些什么?理想情况下,3D 建模师的工作就是为游戏和移动平台构思和创建低多边形模型 \xe2\x80\x93 这确实是一项宝贵的技能。修改已经完成的网格(保存为.fbx.usdz等分发格式)通常是一个坏主意。然而,例如,Autodesk Maya 有一个重新拓扑工具 ( Mesh \xe2\x80\x93> Retopologize),可以帮助您使用高级算法显着减少多边形的数量。观看官方视频(时间 - 00:50)。

\n

在此输入图像描述

\n

  • 那么,步骤是什么?将模型保存为什么格式,以便可以在 Maya 中打开并进一步导出为 usdz? (2认同)
  • @andy-jazz,谢谢你,我现在就测试一下。另外,抱歉打扰您,如何减少多边形数量?看起来还是一样吗?我问这个是因为这个模型不是我做的。 (2认同)
  • 理想情况下,3D 建模师的工作就是构思和创建低多边形模型(这是一项很酷的技能)。修改已经完成的网格总是不好的。但是,例如,Maya 有一个重新拓扑工具(Mesh –> Retopologize。)。https://www.youtube.com/watch?v=0LKrSvMatpA(时间 - 00:55)。 (2认同)