Преобразование вложенной позиции SCNNode в CGPoint в пространстве экрана

Я пытаюсь преобразовать 3D-позицию вложенного SCNNode в координату x, y (CGPoint) (для наложения вида на объект).

Моя структура SCNNode выглядит так:

      +-----------+
      | Root node |
      +-----+-----+
            |
            |
       +----+---+
    +--+ Node A +--+
    |  +--------+  |
    |              |
    |              |
    |              |
+---+----+    +----+---+
| Node B |    | Node C |
+--------+    +--------+

Я хотел бы получить 2d-позицию NodeB на экране. Мне известно о convertPosition: и projectPoint: методы, но я не думаю, что использую их правильно.

Любые указатели?

Редактировать:

В настоящее время пытается что-то вроде этого:

SCNVector3 rootPosition = [[[[self view3D] scene] rootNode] convertPosition:[nodeB position] fromNode:nodeB];
SCNVector3 projectedPoint = [[self view3D] projectPoint:rootPosition];
NSLog(@"x %f y %f z %f", projectedPoint.x, projectedPoint.y, projectedPoint.z);

Результирующие значения x, y, z далеки (а иногда и отрицательны, что не имеет смысла в пространстве экрана, поскольку объект явно виден).


person jxd    schedule 04.12.2015    source источник
comment
Можете ли вы опубликовать то, что у вас есть до сих пор?   -  person wogsland    schedule 04.12.2015
comment
@wogsland Отредактировано с кодом.   -  person jxd    schedule 04.12.2015


Ответы (2)


Положение NodeB указывается в системе координат NodeA. Поэтому я верю, что ты хочешь

rootPosition = [rootNode convertPosition:nodeB.position fromNode:nodeA]
person Hal Mueller    schedule 04.12.2015

На swift4:

nodeAchildPosition = scnScene.rootNode.convertPosition(nodeA.position, from: nodeAchild)
person Sergey Di    schedule 03.02.2019
comment
Получает ли этот ответ позицию nodeB или nodeA? (Это кажется обратным от ответа Хэла Мюллера!) И есть ли какая-то (какая-либо?) Причина, по которой вы не можете просто использовать nodeB.parent для параметра from? - person livingtech; 29.09.2020