6

我试图在圆圈中排列 12 个对象,以便每个对象都与其逆时针相邻对象重叠。

像这样的东西:

在此处输入图像描述

问题是,如果我只依赖绘图顺序,其中一个总是会完全在最上面,在这种情况下是 12 点钟的红色。

我试过使用

    {
        GlowButton* G = glowButton[ 0 ];

        float theta = 0.3;
        G.layer.transform = CATransform3DMakeRotation( theta, 0, 1, 0 );
    }

试图围绕垂直轴旋转,从而将一侧塞到邻居后面,但这不起作用。

有人告诉我这是因为核心动画不支持深度测试。

有没有办法做到这一点而不会闯入 GL?

4

2 回答 2

6

我可以想到两种方法来避免这个问题:

  1. 将每个对象分成两半。首先绘制相邻对象后面的那些半部分,然后将这些部分绘制在相邻对象的顶部。

  2. 使用剪切区域并分两步绘制圆圈。第一个剪切区域将绘图限制在图片的左半部分。第二个剪辑区域被限制在右半边。每次,您绘制所有对象。但是您必须从底部或顶部元素开始。

我不太确定你在用 Core Animation 做什么,所以其中一种方法可能更适合或需要一些适应。

于 2011-08-30T13:59:45.353 回答
4

我现在可以完美地工作了。我很欣慰不必去 GL。

在此处输入图像描述

我基本上画了第一个(红色 - 在 12 点钟方向)的宝石,带有一个只允许右半部分可见的蒙版。

然后我画出剩下的 11 个。

然后我再次绘制第一个,这次将蒙版设置为仅显示左半部分。

    for( int i = 0; i <= 12; i++ )
    {
        for ( int dullGlow = 0; dullGlow <= 1; dullGlow++ )
        {
            BOOL isDull = ( dullGlow == 0 ) ? YES : NO;

            CALayer* L = [CALayer layer];

            CGImageRef dullImage = [ButtonImages dullImage: i % 12];
            CGImageRef glowImage = [ButtonImages glowImage: i % 12];

            L.contents = (id) ( isDull ? dullImage : glowImage );

            L.bounds = CGRectMake( 0, 0, buttonSize, buttonSize ); 

            L.opacity = ( isDull ? 1.0 : 0.0 );

            if( i == 0  ||  i == 12 )
            {
                CGFloat halfSize = buttonSize / 2.0;

                CGRect keepLeftHalf = CGRectMake( 0, 0, 
                                                 halfSize, buttonSize );

                CGRect keepRightHalf = CGRectMake( halfSize,  0, 
                                                  halfSize, buttonSize );

                CALayer* maskLayer = [CALayer layer];
                maskLayer.frame = ( i == 0 ) ? keepRightHalf : keepLeftHalf;
                maskLayer.backgroundColor = [UIColor greenColor].CGColor;

                maskLayer.edgeAntialiasingMask = 0x0;

                [L setMask: maskLayer];
            }

            [self.layer addSublayer: L];

            layers[ dullGlow ] [ i ] = L;

        } // dullGlow

    } // i

在所有 4 个边缘上将 edgeAntialiasingMask 的 4 个最低有效位设置为 0 项的抗锯齿——没有这条线,我得到了一个接缝。

如果有人能解释屏蔽过程的机制,我将不胜感激——尽管我得到了正确的结果,但我是通过反复试验来做到的。

请注意,蒙版设置为(不透明)绿色,并且它是可见的蒙版区域 - 即第一次通过时,绿色矩形覆盖了图像的右半部分,正是这种爱被显示出来。

我猜测对于每个像素,它将图层像素 RGBA 乘以掩码像素上的 alpha 值

于 2011-08-31T07:33:06.970 回答