调用所有父子节点 - SceneKit
Calling all parent and child nodes - SceneKit
我有一个 3D 汽车对象,上面有一些平移和点击手势,一切正常。
问题是,当我将它放大为汽车并且有这么多零件时,我发现自己需要特定的角度让相机查看每个零件,所以我写了所有父节点和子节点来指定它们中的每一个。
但我觉得这不是一个好习惯。
还有其他方法吗?
let parentNodeName = result.node.parent?.name
if parentNodeName == "up-side"{
scnCameraOrbit.eulerAngles.x = 2.3 + Float.pi
scnCameraOrbit.eulerAngles.y = Float.pi * 1.0
}
else if parentNodeName == "front-side"{
if nodeName == "window-front"{
scnCameraOrbit.eulerAngles.x = 2.8 + Float.pi
scnCameraOrbit.eulerAngles.y = Float.pi + 3.16
}
else if nodeName == "hood"{
scnCameraOrbit.eulerAngles.x = 2.95 + Float.pi
scnCameraOrbit.eulerAngles.y = Float.pi + 3.16
}
else if nodeName == "bumper-front"{
scnCameraOrbit.eulerAngles.x = 3.45 + Float.pi
scnCameraOrbit.eulerAngles.y = Float.pi + 3.16
}
else{
scnCameraOrbit.eulerAngles.x = 3.45 + Float.pi
scnCameraOrbit.eulerAngles.y = Float.pi + 3.16
}
}
else if parentNodeName == "back-side"{
if nodeName == "window-rear"{
scnCameraOrbit.eulerAngles.x = 2.9 + Float.pi
scnCameraOrbit.eulerAngles.y = Float.pi * 1.0
}
else if nodeName == "bumper-rear"{
scnCameraOrbit.eulerAngles.x = 3.4 + Float.pi
scnCameraOrbit.eulerAngles.y = Float.pi * 1.0
}
else if nodeName == "trunk"{
scnCameraOrbit.eulerAngles.x = 3.0 + Float.pi
scnCameraOrbit.eulerAngles.y = Float.pi * 1.0
}
else{
scnCameraOrbit.eulerAngles.x = 3.4 + Float.pi
scnCameraOrbit.eulerAngles.y = Float.pi * 1.0
}
}
else if parentNodeName == "left-side"{
scnCameraOrbit.eulerAngles.x = -Float.pi * 0.0
scnCameraOrbit.eulerAngles.y = -3 * Float.pi * 1.2
}
else if parentNodeName == "right-side"{
scnCameraOrbit.eulerAngles.x = -Float.pi * 0.0
scnCameraOrbit.eulerAngles.y = -2 * Float.pi * 1.2
}
else{
return
}
IF 测试只在命中测试(点击)时调用一次,对吧?如果是这样...
为了避免嵌套 IF 的某些复杂性,您可以尝试一些枚举技术 < 24701075 >,这里有很多示例 post - 仔细阅读,其中一些是过时的和新的 Swift 功能可用。您将需要 2 组(我相信),一组用于父节点名称,然后一组用于节点名称。不确定效率,但清晰度会提高...意见各不相同,但代码可读性和避免调试问题通常对我来说更重要,除非性能是一个真正的问题。
我有一个 3D 汽车对象,上面有一些平移和点击手势,一切正常。 问题是,当我将它放大为汽车并且有这么多零件时,我发现自己需要特定的角度让相机查看每个零件,所以我写了所有父节点和子节点来指定它们中的每一个。 但我觉得这不是一个好习惯。 还有其他方法吗?
let parentNodeName = result.node.parent?.name
if parentNodeName == "up-side"{
scnCameraOrbit.eulerAngles.x = 2.3 + Float.pi
scnCameraOrbit.eulerAngles.y = Float.pi * 1.0
}
else if parentNodeName == "front-side"{
if nodeName == "window-front"{
scnCameraOrbit.eulerAngles.x = 2.8 + Float.pi
scnCameraOrbit.eulerAngles.y = Float.pi + 3.16
}
else if nodeName == "hood"{
scnCameraOrbit.eulerAngles.x = 2.95 + Float.pi
scnCameraOrbit.eulerAngles.y = Float.pi + 3.16
}
else if nodeName == "bumper-front"{
scnCameraOrbit.eulerAngles.x = 3.45 + Float.pi
scnCameraOrbit.eulerAngles.y = Float.pi + 3.16
}
else{
scnCameraOrbit.eulerAngles.x = 3.45 + Float.pi
scnCameraOrbit.eulerAngles.y = Float.pi + 3.16
}
}
else if parentNodeName == "back-side"{
if nodeName == "window-rear"{
scnCameraOrbit.eulerAngles.x = 2.9 + Float.pi
scnCameraOrbit.eulerAngles.y = Float.pi * 1.0
}
else if nodeName == "bumper-rear"{
scnCameraOrbit.eulerAngles.x = 3.4 + Float.pi
scnCameraOrbit.eulerAngles.y = Float.pi * 1.0
}
else if nodeName == "trunk"{
scnCameraOrbit.eulerAngles.x = 3.0 + Float.pi
scnCameraOrbit.eulerAngles.y = Float.pi * 1.0
}
else{
scnCameraOrbit.eulerAngles.x = 3.4 + Float.pi
scnCameraOrbit.eulerAngles.y = Float.pi * 1.0
}
}
else if parentNodeName == "left-side"{
scnCameraOrbit.eulerAngles.x = -Float.pi * 0.0
scnCameraOrbit.eulerAngles.y = -3 * Float.pi * 1.2
}
else if parentNodeName == "right-side"{
scnCameraOrbit.eulerAngles.x = -Float.pi * 0.0
scnCameraOrbit.eulerAngles.y = -2 * Float.pi * 1.2
}
else{
return
}
IF 测试只在命中测试(点击)时调用一次,对吧?如果是这样...
为了避免嵌套 IF 的某些复杂性,您可以尝试一些枚举技术 < 24701075 >,这里有很多示例 post - 仔细阅读,其中一些是过时的和新的 Swift 功能可用。您将需要 2 组(我相信),一组用于父节点名称,然后一组用于节点名称。不确定效率,但清晰度会提高...意见各不相同,但代码可读性和避免调试问题通常对我来说更重要,除非性能是一个真正的问题。