如何在SceneKit编辑器中居中模型的轴点

3

有没有办法将模型的中心点居中?目前(默认情况下)它设置在左下角。我想将其设置为中心。我该如何做?

这是图片:

enter image description here

更新: 我添加了另一个节点并将椅子添加为其子节点。

现在,它工作得更好了,但如果我继续旋转,它不会旋转到最后,并且会重置位置。这是平移操作的代码:

  @objc func panned(recognizer :UIPanGestureRecognizer) {

        var newAngleY :Float = 0.0

        if recognizer.state == .changed {

            let sceneView = recognizer.view as! ARSCNView
            let touchPoint = recognizer.location(in: sceneView)
            let translation = recognizer.translation(in: sceneView)

            print(translation.x)

            let scnHitTestResults = self.sceneView.hitTest(touchPoint, options: nil)

            if let hitTestResult = scnHitTestResults.first {

                if let parentNode = hitTestResult.node.parent {

                    newAngleY = (Float)(translation.x)*(Float)(Double.pi)/180
                    newAngleY += currentAngleY
                    parentNode.eulerAngles.y = newAngleY
                }

            }
        }

        else if recognizer.state == .ended {
            currentAngleY = newAngleY
        }

    }
1个回答

8

您可以使用SCNNode的 pivot 属性(Apple Documentation)来更改椅子的中心轴。

您可以使用 SCNMatrix4MakeTranslation 来进行更改,例如:

nodeToAdd.pivot = SCNMatrix4MakeTranslation(0,0,0)

这可能解决问题:

    //1. Get The Bounding Box Of The Node
    let minimum = float3(nodeToAdd.boundingBox.min)
    let maximum = float3(nodeToAdd.boundingBox.max)
    
    //2. Set The Translation To Be Half Way Between The Vector
    let translation = (maximum + minimum) * 0.5

    //3. Set The Pivot
    nodeToAdd.pivot = SCNMatrix4MakeTranslation(translation.x, translation.y, translation.z)

你也可以在类似于Blender或者Maya的程序中进行更改。

或者,而且可能更加容易,就是直接在 SceneKit 编辑器中编辑模型本身。

如果你无法修复它的枢轴,那么你可以创建一个空节点,然后将椅子作为其子项添加进去,确保它在其中居中对齐。

这样你就可以更准确地转换它的旋转等属性了。


谢谢!我使用了最后一种方法,但是由于某些原因旋转仍然有问题。即使我旋转的是parentNode而不是chair Node,它仍然会导致问题。也许这是模型本身的问题。 - john doe
我使用了您上面的代码,但它并没有按预期工作。椅子旋转了,但仍然是使用原始坐标系旋转。我认为这个模型有问题。 - john doe
更新了问题并取得了更多进展。 - john doe
你尝试过移除 var newAngleY :Float = 0.0 这一行,并在这里设置它吗:var newAngleY = (Float)(translation.x)*(Float)(Double.pi)/180? - BlackMirrorz
谢谢Josh!就是这样 :) - john doe
计算包围盒中心点的正确方法是(最大值 + 最小值) * 0.5,而不是(最大值 - 最小值) * 0.5,我会编辑答案。基本上,我们不需要间隔的一半,我们需要在最大值和最小值之间得到中心位置。 - kelin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接