【问题标题】:Copy geometry from one scene into another将几何图形从一个场景复制到另一个场景
【发布时间】:2014-07-24 11:11:27
【问题描述】:

我正在使用 SceneKit 和 Swift(但 Objective-C 中的答案很好)。

我知道如何将 collada 文件加载到场景中。 (你可以将它加载到节点中吗?)

这是我正在使用的 Swift 代码:

    let url = NSBundle.mainBundle().URLForResource("weasel", withExtension: "dae")
    var error: NSErrorPointer? = nil
    let weasel = SCNScene.sceneWithURL(url, options: nil, error: error!)

(我不确定我声明错误的方式有多惯用。欢迎赐教。)

这似乎工作正常,但我现在想在这个场景(或整个场景,没关系)中插入一些东西到另一个场景中。我已经得到了类似的东西来编译和运行,但它似乎不起作用。

    let weaselNode = SCNNode()
    weaselNode.geometry = SCNNode(geometry: weasel.rootNode.geometry)
    scene.rootNode.addChildNode(weaselNode)

【问题讨论】:

  • 一位审阅者从问题中提取了 obj-c 标签,尽管我明确指出 Obj-C 中的答案很好,并且答案对 Swift 和 Obj 都有用-C 编码器。说真的,你没有更好的事情要做吗?

标签: ios objective-c macos swift scenekit


【解决方案1】:

您可以轻松地将 Collada 文件的一部分加载到节点中。我还没有时间探索 Swift,所以这里是 ObjC:

    NSURL *urlToColladaFile = [[NSBundle mainBundle]URLForResource:@"ColladaFileName" withExtension:@"dae"];
    SCNSceneSource *sceneSource = [[SCNSceneSource alloc]initWithURL:urlToColladaFile options:nil]]
    SCNNode *node = [sceneSource entryWithIdentifier:@"uidInColladaFile" withClass:[SCNNode class]];
    [scene.rootNode addChildNode:node];

您可以通过将其插入代码中的某处来获取标识符列表:

    NSLog(@"Scene identifiers list: %@", [sceneSource identifiersOfEntriesWithClass:[SCNNode class]);

【讨论】:

  • 非常有帮助。谢谢。
  • 这行得通。使用 dae 文件加载单独的场景并尝试从中添加模型对我不起作用。我认为场景套件需要将加载的场景设置为视图以加载模型?不过这似乎很奇怪。
【解决方案2】:

在这里,您只是检索根节点的几何图形(可能为零)。您需要做的是从场景 A 中获取您感兴趣的节点(不仅仅是几何图形)并将它们添加到场景 B。

伪代码应该是:

SCNNode *weaselNodeTree = [sceneA.rootNode childNodeWithName:
                             @"theObjectNameImLookingFor" recursively:YES];

(如果不想修改场景A,则可选:weaselNodeTree = [weaselNodeTree clone];

[sceneB.rootNode addChildNode:weaselNodeTree];

【讨论】:

  • 你成功了。谢谢你。 (不幸的是,这并没有解决我的问题,但让我更进一步。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2022-06-29
  • 1970-01-01
相关资源
最近更新 更多