Ios SceneKit:围绕节点自身旋转节点

Ios SceneKit:围绕节点自身旋转节点,ios,swift,3d,scenekit,arkit,Ios,Swift,3d,Scenekit,Arkit,我想绕其x轴旋转一个节点(更具体地说,我想转动一个轮子) 车轮是汽车的一个子节点。我在stackoverflow上发现了几个关于此问题的线程,例如,但没有一个解决方案适合我: 我尝试了以下代码: if let wheel = sceneView.scene.rootNode.childNode(withName: "WheelRearL", recursively: true) { // also tried: // wheel.pivot = SCNM

我想绕其x轴旋转一个节点(更具体地说,我想转动一个轮子)

车轮是汽车的一个子节点。我在stackoverflow上发现了几个关于此问题的线程,例如,但没有一个解决方案适合我:

我尝试了以下代码:

    if let wheel = sceneView.scene.rootNode.childNode(withName: "WheelRearL", recursively: true) {

        // also tried:
        // wheel.pivot = SCNMatrix4MakeTranslation(0.5, 0.5, 0.5)

        let (minVec, maxVec) = (wheel.boundingBox)
        wheel.pivot = SCNMatrix4MakeTranslation(-25, (maxVec.y - minVec.y) / 2 + minVec.y, (maxVec.z - minVec.z) / 2 + minVec.z)

    }
但是车轮仍然绕着整个汽车的中心转动

以下代码用于旋转本身,但我认为与解决方案无关:

        let spin = CABasicAnimation.init(keyPath: "rotation")
        spin.fromValue = NSValue(scnVector4: SCNVector4(x: 25, y: 0, z: 0, w: 0))
        spin.toValue = NSValue(scnVector4: SCNVector4(x:25, y: 0, z: 0, w: Float(CGFloat(2 * M_PI))))
        spin.duration = 3
        spin.repeatCount = .infinity
        let wheel = sceneView.scene.rootNode.childNode(withName: "WheelRearL", recursively: true)
        wheel?.addAnimation(spin, forKey: "spin around")

(顺便说一句:我需要在代码中更改pivot,而不必在SceneKit interface builder中设置额外的容器节点并将其移动到节点中心)

好吧,不知怎么地,我找到了一个可行的解决方案:(不知道这是否是最好的方法-但它确实对我有效。)


节点的局部轴通常不在几何体的中心,就像心脏的情况一样

有两个选项可以重新设置轴的中心。您可以向代码中添加函数

 func centerPivot(for node: SCNNode) {
    var min = SCNVector3Zero
    var max = SCNVector3Zero
    node.__getBoundingBoxMin(&min, max: &max)
    node.pivot = SCNMatrix4MakeTranslation(
        min.x + (max.x - min.x)/2,
        min.y + (max.y - min.y)/2,
        min.z + (max.z - min.z)/2
    )
}
调用函数

centrePivot(for: wheelNode)
将其应用于节点,如下所示。这将使轴位于节点边界框的中心。但我发现你有时需要修改这个函数,这取决于你需要从哪里开始旋转。。。它可以是一个反复试验的过程,直到它的位置完美为止

另一种方法是在3D创作工具(例如)中打开collada(dae文件),并在本例中将(每个车轮几何体)制作为零部件(如果尚未)。从中可以重置零部件轴,并将轴重新定位到每个车轮几何图形的中心


在许多情况下,汽车、直升机和其他要设置动画的模型等的自由dae模型不是由作者使用“意图设置动画”创建的,因此设置动画的几何体的几何体分组和轴不在正确的轴位置。您可能还希望轴位于旋转门等的铰链上,因此它将偏离中心,可以通过小提琴来获得正确的方向。因此,我认为最好知道如何在3D模型本身中进行轴调整(对于轴点)

我知道现在回答已经很晚了。但我找到了一种绕节点自身轴旋转节点的方法。关键点是:创建父节点并将目标节点添加为子节点。 您可以使用以下代码绕X轴旋转“hudNode”:

 let containerNode = SCNNode()
 containerNode.addChildNode(hudNode)  
 let roteAction = SCNAction.rotate(by: 3.14, around: SCNVector3(1,0,0), duration: 0)
        hudNode.runAction(roteAction)

然后你可以将containerNode放在你喜欢的任何地方。

检查此选项可能会对你有所帮助。恐怕这并没有真正的帮助,因为旋转本身是有效的,我认为真正的问题在于轴…尝试使用
SCNAction.rotate(by:value-around:scInvector3Make(1,0,0),持续时间:0.2)
尝试我发布的答案并让我知道,但请尝试一下
 let containerNode = SCNNode()
 containerNode.addChildNode(hudNode)  
 let roteAction = SCNAction.rotate(by: 3.14, around: SCNVector3(1,0,0), duration: 0)
        hudNode.runAction(roteAction)