SceneKit Панорамирование дочернего узла локального с мировыми координатами - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть два узла

 var rotatable : SCNNode!
 var bluePeg : SCNNode!
...
rootnode.addchildNode(rotatable)
rotatable.addChildNode(bluePeg)

, оба правильно добавляют к сцене, при панорамировании вращающихся оба узла вращаются правильно.Проблема при панорамировании bluePeg с помощью следующего кода в viewController

if gestureRecognize.state == .changed {
            if rotating {
                angle = rotatePanel(xTranslation: Float(gestureRecognize.translation(in: gestureRecognize.view).x))
            }
            else {
                let touchLocation = gestureRecognize.location(in: sceneView)//sceneView
                let hitResults = sceneView.hitTest(touchLocation, options: [.searchMode: 1, .ignoreHiddenNodes: false])

                for result in hitResults {
                    if result.node.name == "xzPlane" {
                        let newRotation = SCNVector3Make(0,-1.0 * (self.scene?.rotatable.eulerAngles.y)!, 0)
                        selectedNode.eulerAngles = newRotation //selectedNode is bluePeg Node
                        selectedNode.position = scene!.rotatable.convertVector((selectedNode.position), to: nil)//rotatable is the parent of selectedNode
                        os_log("rotatble Euler: %f, %f, %f",((scene?.rotatable.eulerAngles.x)!), ((scene?.rotatable.eulerAngles.y)!),((scene?.rotatable.eulerAngles.z)!))
                        os_log("selectedNode Euler: %f, %f, %f",(selectedNode.eulerAngles.x), (selectedNode.eulerAngles.y),(selectedNode.eulerAngles.z))
                        selectedNode.position.x = result.worldCoordinates.x
                        selectedNode.position.z = result.worldCoordinates.z
                        //selectedNode.position = selectedNode.convertPosition(selectedNode.position, to: nil)
                        return;
                    }

                }
            }
        }

Для дальнейшего уточнения, вращающийся узел вращается вокруг оси Y с дочерними элементами.Для панорамирования bluePeg я попытался удалить величину поворота из локальных координат, а затем выполнить панорамирование, используя мировые координаты, поскольку позиция вращающегося узла всегда является нулевым вектором.

Что я здесь не так делаю?Пожалуйста, помогите

1 Ответ

0 голосов
/ 18 ноября 2018

Я понял это после того, как сделал перерыв и уснул :).

if gestureRecognize.state == .changed {
            if rotating {
                angle = rotatePanel(xTranslation: Float(gestureRecognize.translation(in: gestureRecognize.view).x))
            }
            else {
                let touchLocation = gestureRecognize.location(in: sceneView)//sceneView
                let hitResults = sceneView.hitTest(touchLocation, options: [.searchMode: 1, .ignoreHiddenNodes: false])

                for result in hitResults {
                    if result.node.name == "xzPlane" {
                       selectedNode.position = result.node.convertVector(result.worldCoordinates, to: scene?.rotatable) //rotatble is the parent of bluePeg
                        os_log("rotatble Euler: %f, %f, %f",((scene?.rotatable.eulerAngles.x)!), ((scene?.rotatable.eulerAngles.y)!),((scene?.rotatable.eulerAngles.z)!))
                        os_log("selectedNode Euler: %f, %f, %f",(selectedNode.eulerAngles.x), (selectedNode.eulerAngles.y),(selectedNode.eulerAngles.z))

                    }

                }
            }
        }
...