从我之前的问题来看,我相信克隆SCNNode是解决加载多个对象问题的方法。然而,我意识到有些不对劲。
我做了类似的事情
arrow = scnScene.rootNode.childNode(withName: "arrow", recursively:true)
arrow.rotation = SCNVector4(0, 0, 1, M_PI_2)
arrow.position = SCNVector3(x: 0, y: 0, z: -3);
let sign = SCNNode()
for i in 0..<10{
let node = arrow.clone()
node.position = SCNVector3(i+1,0,0)
sign.addChildNode(node)
}
arrow.addChildNode(sign)
我期望显示一行箭头,但实际上显示一列箭头(在 x 轴平移但实际上影响 y 轴,似乎克隆节点的坐标系已更改)显示并且所有子对象旋转 180 度。为什么?
在Karl Sigiscar告诉我使用SCNReferenceNode之前,我不确定我应该如何使用它,它会达到我的目的吗?
更新:
我尝试了这样的 SCNReferenceNode:
let scnScene = SCNScene()
if let filePath = Bundle.main.path(forResource: "arrowsign", ofType: "dae", inDirectory: "art.scnassets") {
// ReferenceNode path -> ReferenceNode URL
let referenceURL = NSURL(fileURLWithPath: filePath)
if #available(iOS 9.0, *) {
arrow = SCNReferenceNode(url: referenceURL as URL!)!
arrow.load()
arrow.rotation = SCNVector4(0, 0, 1, -M_PI_2)
arrow.position = SCNVector3(0,0,-5)
// Create reference node
for i in 0..<10{
let referenceNode : SCNReferenceNode = SCNReferenceNode(url: referenceURL as URL)!
referenceNode.load()
referenceNode.position = SCNVector3(i+1, 0, 0);
arrow.addChildNode(referenceNode)
}
}
}
scnScene.rootNode.addChildNode(arrow)
我没有旋转子节点,但当我运行它时它们会自动旋转(-M_PI_2 度)。我确实在 x 轴上进行了平移,但实际上显示的是一列箭头,而不是一行箭头。这是子父节点的特性吗?
使用SCNReferenceNode后,我发现如果将一个节点添加到另一个节点作为子节点,子节点将被设置为父节点的位置。例如,位置(3,4,5)有一个父节点,那么它的所有子节点将首先位于(3,4,5)(稍后可以修改)。所以如果你想要一排箭头,只需修改子节点的x并保持y和z值等于0即可。 如果父节点应用旋转,则旋转也将应用到子节点。
在场景图中,节点的世界变换与其父节点的变换相关。因此,如果您旋转、平移或缩放父级,它将应用于其所有子级。我不认为它特定于 SCNReferenceNode,而是它在场景图中的工作方式。