导出为 USDZ 的 3D 图稿具有不同的颜色
3D artwork that is exported as USDZ has different colors
首先我想说我是 SceneKit 的新手并且在 iOS 上玩 AR 环境。
我有一个 3D 模型对象,一辆货车,作为 Blender 文件 (.blend) 的一部分 --> 可以找到它 here。
我正在从 Blender 将其导出为 .glb 文件 --> 可以找到 here。
然后我在Reality Converter应用程序中打开.glb文件,并将其导出为.usdz文件-->可以找到here。
问题是当我在 XCode 中预览对象时,以及当我将它放在 AR 中时,对象颜色是错误的。
Blender对象有问题吗?如果是这样,我应该对其进行哪些更改才能正确导出颜色?
关于 Blender、Maya 和 Xcode
不幸的是,你在这里提到的问题是一个很好的old issue in Blender. Indeed, Blender outputs wrong (a.k.a. inconsistent) shaders' colors, due to the fact that Blender operates in linear color space (not sRGB) of shader colors. There are 2 possible solutions in this case. The first one is quite radical - to use a real PRO software, like Autodesk Maya 2023 with USD plugin(因为学习 Maya 需要相当多的时间),其中导出的着色器的颜色以正确的颜色非常准确地再现 space – 您必须从头开始重新分配所有材料。第二个——在 Xcode 的检查器中手动或以编程方式修复颜色。
从 Maya 您可以将模型导出为 binary 或 ASCII .usd
文件格式(确保 MayaUSD 插件是加载)。然后使用 Reality Converter,在 .usdz
存档中转换生成的模型。
Xcode解决方案
将您的 van.usdz
模型加载到 Xcode。为方便起见重命名层次结构中的模型节点。
非常重要!
Select Body_Orange
节点并转到 Attributes Inspector
选项卡。删除 Colors
属性。
Colors
属性保持 .usdz
颜色模式。
然后在Material Inspector
中指定physicallyBased
着色器需要的Diffuse
颜色。
此外,您可以通过编程方式进行。这是 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
}
简单介绍一下 Maya 中的多边形计数和重新拓扑
我想对您模型中多边形的数量发表评论。可以制作具有 2K 到 5K 多边形的这种简单模型。但是您的模型有超过 50,000 个多边形,这是一个巨大的数字。您的 hi-poly 模型将消耗大量资源(CPU、GPU、内存),因此可能会丢帧(58 fps,如图所示)。
那么,你能做些什么呢?理想情况下,3D 建模师的工作是为游戏和移动平台构思和创建 low-poly 模型 – 这确实是一项宝贵的技能。修改已经完成的网格(保存为 .fbx 或 .usdz 等分布格式)通常不是一个好主意。但是,例如 Autodesk Maya,有一个重新拓扑工具 (Mesh –> Retopologize
),可以帮助您使用高级算法显着减少多边形的数量。观看 official video(时间 - 00:50)。
首先我想说我是 SceneKit 的新手并且在 iOS 上玩 AR 环境。
我有一个 3D 模型对象,一辆货车,作为 Blender 文件 (.blend) 的一部分 --> 可以找到它 here。
我正在从 Blender 将其导出为 .glb 文件 --> 可以找到 here。
然后我在Reality Converter应用程序中打开.glb文件,并将其导出为.usdz文件-->可以找到here。
问题是当我在 XCode 中预览对象时,以及当我将它放在 AR 中时,对象颜色是错误的。
Blender对象有问题吗?如果是这样,我应该对其进行哪些更改才能正确导出颜色?
关于 Blender、Maya 和 Xcode
不幸的是,你在这里提到的问题是一个很好的old issue in Blender. Indeed, Blender outputs wrong (a.k.a. inconsistent) shaders' colors, due to the fact that Blender operates in linear color space (not sRGB) of shader colors. There are 2 possible solutions in this case. The first one is quite radical - to use a real PRO software, like Autodesk Maya 2023 with USD plugin(因为学习 Maya 需要相当多的时间),其中导出的着色器的颜色以正确的颜色非常准确地再现 space – 您必须从头开始重新分配所有材料。第二个——在 Xcode 的检查器中手动或以编程方式修复颜色。
从 Maya 您可以将模型导出为 binary 或 ASCII .usd
文件格式(确保 MayaUSD 插件是加载)。然后使用 Reality Converter,在 .usdz
存档中转换生成的模型。
Xcode解决方案
将您的 van.usdz
模型加载到 Xcode。为方便起见重命名层次结构中的模型节点。
非常重要!
Select Body_Orange
节点并转到 Attributes Inspector
选项卡。删除 Colors
属性。
Colors
属性保持 .usdz
颜色模式。
然后在Material Inspector
中指定physicallyBased
着色器需要的Diffuse
颜色。
此外,您可以通过编程方式进行。这是 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
}
简单介绍一下 Maya 中的多边形计数和重新拓扑
我想对您模型中多边形的数量发表评论。可以制作具有 2K 到 5K 多边形的这种简单模型。但是您的模型有超过 50,000 个多边形,这是一个巨大的数字。您的 hi-poly 模型将消耗大量资源(CPU、GPU、内存),因此可能会丢帧(58 fps,如图所示)。
那么,你能做些什么呢?理想情况下,3D 建模师的工作是为游戏和移动平台构思和创建 low-poly 模型 – 这确实是一项宝贵的技能。修改已经完成的网格(保存为 .fbx 或 .usdz 等分布格式)通常不是一个好主意。但是,例如 Autodesk Maya,有一个重新拓扑工具 (Mesh –> Retopologize
),可以帮助您使用高级算法显着减少多边形的数量。观看 official video(时间 - 00:50)。