0

ワールド空間の回転角度を CCNode のローカル空間に変換する簡単な方法 (API など) はありますか? ノードが画面上で持つ必要がある回転角度はわかっていますが、ノードはノード階層に深くネストされており、希望する角度に一致するように角度を設定したいと考えています。API がない場合、どの CC API 呼び出しを行う必要がありますか? このようなもの:

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

1 に答える 1

0

最善の方法は、2 つの基準点を取得することだと思います。1 つは原点を表し、もう 1 つは回転ベクトルを表します。これらの 2 つのポイントをノード空間に変換し、それらの間のベクトルを測定し (減算)、それを角度に変換します。CCNode のカテゴリにする必要がある 2 つのメソッドを次に示します (注: 私は自分自身を参照します)。1 つはワールド、もう 1 つはノードです。

-(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));
}
于 2014-02-20T16:14:13.327 に答える