Переместите подчиненный узел SCNNode в корневой узел, сохранив позицию

У меня возникли проблемы с сохранением позиции подузла, удаленного и добавленного в rootNode. И родительский узел, и подузел имеют перевод pivot, что, как мне кажется, является частью проблемы. Я попытался установить свойство transform в свойство worldtransform, а затем удалить и снова присоединить узел к корню. Но позиция немного сдвигается. Я попытался удалить поворотное преобразование, добавить worldtransform к корневому узлу и восстановить поворотное. Иногда мне кажется, что я решил эту проблему, тогда конкретный узел перескакивает при повторном подключении в качестве корневого узла.

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

Есть ли способ добавить подузел к корневому узлу, сохраняя при этом его физическое положение/поворот.

Любые указатели будут оценены.


person BassetMan    schedule 03.05.2015    source источник


Ответы (2)


для этого нет API. Но SceneKit предоставляет утилиты преобразования, такие как -[SCNNode convertTransform:toNode:] и -[SCNNode convertPosition:toNode:].

Следующее, вероятно, то, что вы хотите:

node.transform = [node.parentNode convertTranform:node.transform toNode:nil];
[node removeFromParentNode];
[scene.rootNode addChildNode:node];
person mnuages    schedule 03.05.2015
comment
Спасибо за ваш ответ, это работает только в том случае, если опорной точкой родительского узла является SCNMatrix4Identity. Если родитель имеет поворотный перевод, то повторно присоединенный узел смещает позицию. - person BassetMan; 03.05.2015

Я также не понимаю, почему worldTransforms или worldPosition включают в себя точку опоры, которая является своего рода инсайдерской информацией для узла.

Во всяком случае, мое решение:

MoveNode.transform = [newParentNode convertTransform:MoveNode.transform fromNode:[MoveNode parentNode]];
person diviaki    schedule 14.09.2017