我有一个圆盘精灵,它总是围绕它的中心旋转,像轮子一样旋转。我想在 3d 空间中重新定位它并保持它的旋转。我试过弄乱网格属性、skewX/Y、相机,我能找到的一切,但我不知道如何通过旋转产生这种效果。
问问题
2926 次
2 回答
2
几条路线:
找出数学以获得旋转值的正确偏斜值。(我不知道,抱歉,尽管您可能可以从选项 2 对其进行逆向工程)
您可以子类化
CCSprite
,覆盖CCNode
的- (CGAffineTransform)nodeToParentTransform
方法,并且必须首先应用倾斜,然后旋转,以获得您想要的效果。这使您不必以相当笨拙的精灵子类为代价来计算正确的偏斜计算。
您可以从中CCNode.h
了解其当前的操作顺序:
/* Order in transformations with grid disabled
-# The node will be translated (position)
-# The node will be rotated (rotation)
-# The node will be skewed (skewX, skewY)
-# The node will be scaled (scale, scaleX, scaleY)
-# The node will be moved according to the camera values (camera)
... etc. */
这是该方法的一个破解版本,首先是倾斜:(缺少原始方法中的优化CCNode.m
)
- (CGAffineTransform)nodeToParentTransform
{
if ( isTransformDirty_ ) {
// Translate values
float x = position_.x;
float y = position_.y;
if ( ignoreAnchorPointForPosition_ ) {
x += anchorPointInPoints_.x;
y += anchorPointInPoints_.y;
}
transform_ = CGAffineTransformMake(1.0f, tanf(CC_DEGREES_TO_RADIANS(skewY_)),
tanf(CC_DEGREES_TO_RADIANS(skewX_)), 1.0f,
x, y );
// Rotation values
float c = 1, s = 0;
if( rotation_ ) {
float radians = -CC_DEGREES_TO_RADIANS(rotation_);
c = cosf(radians);
s = sinf(radians);
}
CGAffineTransform rotMatrix = CGAffineTransformMake( c * scaleX_, s * scaleX_,
-s * scaleY_, c * scaleY_,
0.0f, 0.0f );
transform_ = CGAffineTransformConcat(rotMatrix, transform_);
// adjust anchor point
if( ! CGPointEqualToPoint(anchorPointInPoints_, CGPointZero) )
transform_ = CGAffineTransformTranslate(transform_, -anchorPointInPoints_.x, -anchorPointInPoints_.y);
isTransformDirty_ = NO;
}
return transform_;
}
于 2012-08-06T21:24:54.117 回答
2
HachiEthan 的回答很好,它允许您在保持旋转的同时使用 skewX/skewY 设置视角。但是,我认为使用相机设置视角更容易。在这种情况下,您可以通过将旋转精灵包装在父节点中来实现效果。
例如:
CCNode *node3D;
CCSprite *sprite;
node3D = [CCNode node];
sprite = [CCSprite spriteWithFile:@"HugeDisc_Red.png"];
//[[node3D camera] setCenterX:15 centerY:45 centerZ:40]; // You can use the camera
[node3D setSkewX:25]; // Skew also works if you prefer it
[node3D setRotation:145]; // Skew + rotation looks pretty convincing
[node3D setPosition:ccp(middleX+105, middleY-110)];
[node3D setIgnoreAnchorPointForPosition:NO];
[node3D setAnchorPoint:ccp(0.5f,0.5f)];
[sprite setPosition:ccp(node3D.contentSize.width/2, node3D.contentSize.height/2)];
[sprite runAction:rotate];
[node3D addChild:sprite];
最终,它归结为偏好问题。你想为此制作一个自定义精灵对象吗?你更喜欢相机,还是倾斜?根据您的需要,其中之一应该适合您的需要。
于 2012-08-07T05:35:38.367 回答