将世界空间中的旋转角度转换为局部空间cocos2d

时间:2013-08-30 11:51:01

标签: cocos2d-iphone cocos2d-x

是否有一种简单的方法(即api)将世界空间中的旋转角度转换为CCNode的局部空间?我知道一个节点需要在屏幕上的旋转角度,但是节点深深地嵌套在节点层次结构中,我想设置它的角度以便它匹配我想要的。如果没有api,我应该做什么CC api调用?像这样:

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

1 个答案:

答案 0 :(得分:0)

我认为最好的方法是获得两个参考点,一个代表原点,另一个代表旋转矢量。将这2个点转换为节点空间,测量它们之间的向量(减法)并将其转换为角度。这里有2个方法,应该是CCNode的一个类别(注意:我指的是self),一个到世界,另一个到节点。

-(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));
}