Конвертировать угол поворота в мировом пространстве в локальное пространство 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));
}