不幸的是,您在此提到的问题是Blender中一个老问题。实际上,由于Blender操作着色器颜色的线性色彩空间(而非sRGB),因此Blender输出错误的(即不一致的)着色器颜色。在这种情况下,有两种可能的解决方案。第一种方法相当激进——使用真正的专业软件,如Autodesk Maya 2023与USD插件(因为学习Maya需要相当长的时间),其中导出的着色器颜色在正确的色彩空间中被准确地再现——您必须重新分配所有材料。第二种方法是在Xcode的检查器中手动或编程方式修复颜色。
从Maya中,您可以将模型导出为二进制或ASCII.usd
文件格式(请确保已加载MayaUSD插件)。然后使用Reality Converter将生成的模型转换为.usdz
档案。
将van.usdz
模型加载到Xcode中。 为方便起见,重命名模型层次结构中的节点。
非常重要!
选择 Body_Orange
节点并进入 Attributes Inspector
选项卡。删除 Colors
属性。
Colors
属性保留了 .usdz
的颜色模式。
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
}
我想提一下你模型中多边形的数量。这样一个简单的模型可以由2K到5K个多边形构成。但是你的模型有超过50,000个多边形,这是一个巨大的数字。你的高多边形模型将消耗大量的资源(CPU、GPU、内存),因此可能会掉帧(如图片中所示的58fps)。
那么,你该怎么办呢?理想情况下,创作游戏和移动平台的低多边形模型是3D建模师的工作——这真的是一项宝贵的技能。修改已经完成的网格(保存为分发格式,如.fbx或.usdz)通常是一个不好的主意。然而,例如Autodesk Maya就有一个拓扑工具(Mesh –> Retopologize
),可以使用先进的算法显著减少多边形的数量。观看官方视频 (时间-00:50)。
.usd
或.dae
或.fbx
或.obj
格式导入Maya,然后分配正确颜色的新Maya着色器(如有需要,创建新UV映射),最后将模型导出为.usd
或.fbx
格式。 - Andy Jazz