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 中的一个很大的老问题。事实上,Blender 输出错误的(也称为不一致的)着色器颜色,因为 Blender 在着色器颜色的线性颜色空间(而不是 sRGB)中运行。在这种情况下有两种可能的解决方案。第一个是相当激进的 - 使用真正的 PRO 软件,例如带有USD 插件的Autodesk Maya 2023 (因为学习 Maya 需要相当多的时间),其中导出的着色器的颜色在正确的色彩空间中非常准确地再现\xe2\x80\x93 您必须从头开始重新分配所有材质。第二个 \xe2\x80\x93 手动或以编程方式修复 Xcode 检查器中的颜色。
\n从 Maya 中,您可以将模型导出为二进制或ASCII .usd文件格式(确保加载 MayaUSD 插件)。然后使用 Reality Converter 将生成的模型转换为.usdz存档。
将您的van.usdz模型加载到 Xcode 中。为了方便起见,重命名层次结构中模型的节点。
很重要!
\n选择Body_Orange节点并转到Attributes Inspector选项卡。删除Colors属性。
Colors属性保留.usdz颜色模式。
然后Material Inspector分配所需的着色器Diffuse颜色physicallyBased。
此外,您还可以通过编程方式完成此操作。这是 SceneKit 的 SwiftUI 示例代码:
\nimport 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}\nRun Code Online (Sandbox Code Playgroud)\n这是 RealityKit 版本的 SwiftUI 示例代码:
\nimport 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}\nRun Code Online (Sandbox Code Playgroud)\n\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)。
| 归档时间: |
|
| 查看次数: |
1155 次 |
| 最近记录: |