【问题标题】:How to scale and move all nodes at once? ARKit Swift如何一次扩展和移动所有节点? ARKit 斯威夫特
【发布时间】:2019-08-12 19:40:48
【问题描述】:

我获得了这些功能,可以在点击屏幕时缩放和移动屏幕上显示的 3D 对象。问题在于,如果我移动或缩放节点(3D 对象),它只会使节点的一部分变大或变小,我想缩放所有东西。

我知道一种解决方案是将 Blender 中的 3D 对象作为一个对象加入,但稍后,我想将特定动画添加到特定节点,这就是我不想加入它们的原因。

以下是我用于缩放和移动对象的代码:

@objc func panned(recognizer :UIPanGestureRecognizer)
{
    //This function is for scaling
    if recognizer.state == .changed
    {
        guard let sceneView = recognizer.view as? ARSCNView
    else
    {
        return
    }

    let touch = recognizer.location(in: sceneView)
    let translation = recognizer.translation(in: sceneView)

    let hitTestResults = self.sceneView.hitTest(touch, options: nil)

        if let hitTest = hitTestResults.first
        {
            let planeNode = hitTest.node

            self.newAngleY = Float(translation.x) * (Float) (Double.pi)/180
            self.newAngleY += self.currentAngleY
            planeNode.eulerAngles.y = self.newAngleY
        }
        else if recognizer.state == .ended
        {
            self.currentAngleY = self.newAngleY
        } 
    }

}

还有这个:

@objc func pinched(recognizer :UIPinchGestureRecognizer)
{
    if recognizer.state == .changed
    {
        guard let sceneView = recognizer.view as? ARSCNView
            else
            {
                return
            }
    }

    let touch = recognizer.location(in: sceneView)

    let hitTestResults = self.sceneView.hitTest(touch, options: nil)

    if let hitTest = hitTestResults.first
    {

        let planeNode = hitTest.node

        let pinchScaleX = Float(recognizer.scale) * planeNode.scale.x
        let pinchScaleY = Float(recognizer.scale) * planeNode.scale.y
        let pinchScaleZ = Float(recognizer.scale) * planeNode.scale.z

        planeNode.scale = SCNVector3(pinchScaleX, pinchScaleY, pinchScaleZ)

        recognizer.scale = 1 
    }
}

我不知道这是否有帮助,但这是节点的图像: Image of the nodes

提前致谢!

【问题讨论】:

    标签: ios swift xcode scenekit arkit


    【解决方案1】:

    为了实现您正在寻找的“分组”,您必须创建一个空场景节点,该节点将成为所有其他节点的根。

    let myRootNode : SCNNode = SCNNode()
    sceneView.scene.rootNode.addChildNode(myRootNode)
    

    接下来将场景中的所有新节点附加到myRootNode,这样您的所有模型都将成为同一个节点的父节点。

    let newChildNode : SCNNode = SCNNode()
    myRootNode.addChildNode(newChildNode)
    

    然后您可以将翻译应用到myRootNode 以将其与所有子节点一起移动。此外,子节点仍然是单独的模型,可以单独或作为一个组移动(平移/旋转)。

    在命中测试中,您应该缩放和旋转 myRootNode 而不是单个模型。

    【讨论】:

      猜你喜欢
      • 2018-12-05
      • 2017-07-22
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 2014-09-14
      相关资源
      最近更新 更多