如何使用具有多个对象(几何)的场景文件中的几何图形?

时间:2017-08-20 05:41:54

标签: ios swift 3d scenekit arkit

我有一个blender文件,我已导出为DAE / collada,然后使用Xcode转换为Scenekit的Scene文件。我在使用Scene文件中的几何体时遇到了麻烦。

Scene文件(“model.scn”)非常基本:

  • 组(无几何元素)
    • Shape1(几何元素)
    • Shape2(几何元素)
    • Shape3(几何元素)

当我尝试使用该模型时,我无法将3种形状的组合几何用于与SCNPhysicsBody一起使用的SCNGeometry。

我尝试了各种方法,但它们不起作用:

方法1

let scene = SCNScene(named: "art.scnassets/model.scn")!
let node = scene.rootNode.childNode(withName: "Group", recursively: true)!
guard let geo = node.geometry else { return }
// node.geometry is nil so returns here

let physicsBody = SCNPhysicsBody(type: .kinematic, shape: SCNPhysicsShape(geometry: geo))
// this is what I need the custom/aggregate geometry for

方法2

let scene = SCNScene(named: "art.scnassets/model.scn")!
let geoNode = SCNNode()
let node1 = scene.rootNode.childNode(withName: "Shape1", recursively: true)!
let node2 = scene.rootNode.childNode(withName: "Shape2", recursively: true)!
let node3 = scene.rootNode.childNode(withName: "Shape3", recursively: true)!
geoNode.addChildNode(node1)
geoNode.addChildNode(node2)
geoNode.addChildNode(node3)

// expected geoNode.geometry is not nil, but it is

根据Apple's documentation

  

节点只能连接一个几何体。要组合几何体以便可以控制它们或将它们一起动画化,创建一个没有几何体的节点并向其添加其他节点。

但它似乎不起作用,因为父节点的几何可选仍然是零。

我想要做的应该是简单的,但我会以错误的方式去做。我想使用我的dae / collada / scene文件中的几何体。我不想使用默认值(立方体,圆柱体,金字塔,球体,圆环等)。

我做错了什么?谢谢!

2 个答案:

答案 0 :(得分:0)

SceneKit不会自动为您合并SCNGeometry个实例。为此,您必须在创建合并的SCNGeometrySource之前创建新的SCNGeometryElementSCNGeometry个对象。

文档可能有点误导。它想要说的是,如果你想同时操作多个几何,那么在一个共同的父类下分组多个节点将使事情变得更容易,因为操纵这个单个节点会影响(平移,旋转,缩放)它的所有子节点。

请注意,在您的情况下,您可以使用init(shapes:transforms:)显式合并多个SCNPhysicsShape实例。首先为每个几何体创建一个形状,然后创建组合形状。 transforms参数将由在其公共父级下分组的transform个节点组成。

答案 1 :(得分:0)

常规SceneKit的游戏模板包含ship.scn文件。要访问节点的几何图形,只需为其子集合下标。为此,您需要使用childNodes[index]实例属性:

let scene = SCNScene(named: "art.scnassets/ship.scn")!
let ship = scene.rootNode.childNode(withName: "ship", recursively: true)!

print(ship.childNodes[0].geometry as Any)

它打印:

//  Optional(<SCNGeometry: 0x6000033097c0 'Scrap_MeshShape'>)

但是,如果您运行:

print(ship.geometry as Any)

它打印:

//  nil