iOS的UIView的三维透视投影变换

使用下面的代码,既可以获得某个CATransform3DMake...()方法获取的变换的透视投影效果。

最后,将该函数的返回值赋给某个UIView或者其子类对象的layer属性的transform属性即可。


// 实现带透视投影缩放效果的三维变换。

CATransform3D get3DPerspectiveTransform(CATransform3D t, CGPoint center, float disZ)

{

    /**************************************************************

    *   CATransform3DConcat(CATransform3D a, CATransform3D b)的含义

    * 是先进行a变换,再进行b变换。b变换在a变换的基础上进行。

    **************************************************************/

    

    

    // 将某个view移动到坐标系原点的变换矩阵。

    CATransform3D transToOrigin = CATransform3DMakeTranslation(-center.x, -center.y, 0);

    

    // view移动回初始位置的变换矩阵。

    CATransform3D transBack = CATransform3DMakeTranslation(center.x, center.y, 0);

    

    // 计算透视缩放矩阵。

    // 透视投影的m34即表示透视缩放系数。这个值越小,则透视效果越明显(即越近越大,越远越小)。

    CATransform3D scale = CATransform3DIdentity;

    // 注意这里是-1,从而保证从坐标轴正方向向负方向看去,逆时针旋转为正。

    scale.m34 = -1.0f/disZ;

    

    // 获取完整的透视变换矩阵。

    CATransform3D perspTrans = CATransform3DConcat(CATransform3DConcat(transToOrigin, scale), transBack);


    // iOS的标准正投影添加透视投影变换效果。

    CATransform3D result = CATransform3DConcat(t, perspTrans);

    

    return result;

}




例:在某个ViewController的viewDidLoad中,初始化一个计时器,每1/60秒调用一次:

[NSTimer scheduledTimerWithTimeInterval:1/60

                                     target:self

                                   selector:@selector(callFuncPerFrame:)

                                   userInfo:nil

                                    repeats:YES];



#pragma mark - 定时器回调方法,实现动态效果。

- (void)callFuncPerFrame:(NSTimer *)timer

{

    static float angle = 0.0f;

    CATransform3D t = get3DPerspectiveTransform(CATransform3DMakeRotation(angle, 0, 1, 0),

                                                CGPointZero,

                                                500);

    

    [imgView.layer setTransform:t];

    

    angle += 0.01f;

    angle = (angle == 360.0f ? 0.0f : angle);

}



最终效果如下图所示:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值