Конвертировать угол поворота в мировом пространстве в локальное пространство cocos2d

Есть ли простой способ (то есть API), который преобразует угол поворота в мировом пространстве в локальное пространство CCNode? Я знаю угол поворота, который должен иметь узел на экране, но узел глубоко вложен в иерархию узлов, и я хотел бы установить его угол так, чтобы он соответствовал тому, что я хочу. Если нет никаких API, какие звонки CC API я должен сделать? Что-то вроде этого:

CCNode * myLocalNode;
float myLocalAngle = CCAngleConvertFromWorldToNode(myLocalNode,myWorldAngle);
myLocalNode -> setRotation(myLocalAngle);

1 ответ

Я думаю, что лучший способ сделать это - получить две опорные точки, одну представляющую начало координат, а другую представляющую вектор вращения. Преобразовать эти 2 точки в пространство узлов, измерить вектор между ними (вычитание) и преобразовать его в угол. Вот 2 метода, которые должны быть категорией CCNode (примечание: я имею в виду себя), один для мира, а другой для узла.

-(float) convertRotationToWorldSpace:(float)rotation
{
    CGPoint rot = ccpForAngle(-CC_DEGREES_TO_RADIANS(rotation));

    CGPoint worldPt = [self convertToWorldSpace:rot];
    CGPoint worldOriginPt = [self convertToWorldSpace:CGPointZero];

    CGPoint worldVec = ccpSub(worldPt, worldOriginPt);

    return -CC_RADIANS_TO_DEGREES(ccpToAngle(worldVec));
}

-(float) convertRotationToNodeSpace:(float)rotation
{
    CGPoint rot = ccpForAngle(-CC_DEGREES_TO_RADIANS(rotation));

    CGPoint nodePt = [self convertToNodeSpace:rot];
    CGPoint nodeOriginPt = [self convertToNodeSpace:CGPointZero];

    CGPoint nodeVec = ccpSub(nodePt, nodeOriginPt);

    return -CC_RADIANS_TO_DEGREES(ccpToAngle(nodeVec));
}
Другие вопросы по тегам