Как масштабировать и перемещать все узлы одновременно?ARKit Swift - PullRequest
1 голос
/ 21 марта 2019

Я получил эти функции, которые масштабируют и перемещают 3D-объект, отображаемый на экране при нажатии на него.Проблема состоит в том, что если я переместлю или масштабирую узел (трехмерный объект), он будет только увеличивать или уменьшать одну часть узла, и я хочу масштабировать все.

Я знаю, что одним из решений является объединение 3D-объекта в Blender как одного, но позже я хочу добавить определенную анимацию к определенным узлам, и поэтому я не хочу присоединяться к ним.

Вот код, который я использую для масштабирования и перемещения объектов:

@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 
    }
}

Я не знаю, еслиэто помогает, но вот изображение узлов: Изображение узлов

Заранее спасибо!

1 Ответ

1 голос
/ 19 июня 2019

Для достижения «группировки», которую вы ищете, вы должны создать пустой узел сцены, который будет корнем для всех остальных узлов.

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

Затем добавьте все новые узлы в сцене к myRootNode, чтобы все ваши модели были связаны с одним и тем же узлом.

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

Затем вы можете применить переводы к myRootNode, чтобы переместить его вместе со всеми дочерними узлами.Также дочерние узлы остаются отдельными моделями, которые можно перемещать (переводить / поворачивать) по отдельности или в виде одной группы.

В рамках теста на попадание вы должны масштабировать и вращать myRootNode вместо отдельной модели.

...