【问题标题】:In Model I/O documented API is missing in the provided libraries. What is the work around?在提供的库中缺少 Model I/O 记录的 API。解决方法是什么?
【发布时间】:2016-11-04 13:32:03
【问题描述】:

虽然记录了以下MDLAsset 类方法,但ModelIO 库中不存在:

+ assetWithSCNScene:bufferAllocator:



+ assetWithSCNScene:

因此,目前无法读取SceneKit .scn 文件并创建MDLAsset

解决方法是什么?

更新 0

我正在导入这些:

import SceneKit
import ModelIO
import MetalKit
import GLKit

在我的渲染器中,我尝试从 SCNScene 实例化 MDLAsset

guard let scene = SCNScene(named:"ball.scn") else {
    fatalError("Error: Can not create scene")
}

let asset = MDLAsset(scnScene:scene, bufferAllocator:MTKMeshBufferAllocator(device: device))

我收到此错误

表示找不到类别。我在这里错过了什么?

【问题讨论】:

    标签: swift scenekit modelio


    【解决方案1】:

    这些被 SceneKit 定义为 MDLAsset 上的一个类别(这是必要的,因为这是定义 SCNScene 的地方)。您需要@import SceneKit@import ModelIO


    你已经在 ObjC 中列出了签名;没有注意到您已将其标记为 Swift。在 Swift 中,需要导入相关的子模块:

    import SceneKit.ModelIO
    

    这实际上有点奇怪 IMO,可能没有必要。我会打开一个雷达(bugreport.apple.com)。至少,文档需要更清晰。

    【讨论】:

    • 嗨,罗伯。您是否有使用这些 API 调用读取 .scn 文件的有效 Metal 代码?
    • 宾果游戏!非常感谢罗布。
    【解决方案2】:

    您正在混合和匹配三个不同的框架,这就是该类别不起作用的原因。

    MTKMeshBufferAllocator 是 MetalKit 的一部分,SceneKit 不知道如何处理分配。

    只要不使用 bufferAllocator 就可以了。

    let asset = MDLAsset(scnScene:scene)
    

    关于导入的问题,

    import SceneKit.ModelIO
    

    为您提供桥接 API。它的目的是让您可以从 MDL 对象构造 SCN 对象。

    【讨论】:

    • 这是一年前回答的。你的回答带来了什么新价值?
    • 新价值在于纠正 Rob 的声明,即不需要导入文件。导入 SceneKit.ModelIO 是必要的,以便将模型 IO 资产移动到 SceneKit。 (FWIW 我构建了 ModelIO 和 SceneKit 桥。)
    • 那么它可能可以作为评论添加到他的回答中,但是好吧,很公平,它提供了关于所问内容的有用信息。
    • 这就是我的本意 :) 我是一个 stackoverflow n00b ......我以后会注意那个工作流。我还应该指出,Rob 的声明中还没有解决 bufferAllocator 问题,我希望这对其他人在以后访问这个问题时有用。
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 2010-10-27
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多