您的位置:首页 > 移动开发 > IOS开发

ios开发之3D效果(一)

2015-08-25 15:59 621 查看
1.CATransform是加载在view的layer上的。

实现普通的放大,缩小,旋转等可用:

imageView.layer.transform = CATransform3DMakeRotation(M_PI/6, 0, 1, 0);

2.实现近大远小的立体效果先定义两个方法:(我是另建一个头文件实现的)

CATransform3D CATransform3DMakePerspective(CGPoint center, float disZ)

{

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

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

CATransform3D scale = CATransform3DIdentity;

scale.m34 = -1.0f/disZ;

return CATransform3DConcat(CATransform3DConcat(transToCenter,
scale), transBack);

}

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

{

return CATransform3DConcat(t, CATransform3DMakePerspective(center,
disZ));

}

3.在自定义方法的基础上,定义一个计时器。

@interface ViewController ()

{

UIImageView *imageView;

UIImageView *imageView1;

UIImageView *imageView2;

UIImageView *imageView3;

NSTimer *timer;

}

- (void)viewDidLoad {

[super viewDidLoad];

imageView = [[UIImageView alloc]initWithFrame:CGRectMake(20, 100, 329, 220)];

imageView.image = [UIImage imageNamed:@"image1.png"];

[self.view addSubview:imageView];

imageView1 = [[UIImageView alloc]initWithFrame:CGRectMake(20, 100, 329, 220)];

imageView1.image =
[UIImage imageNamed:@"image1.png"];

[self.view addSubview:imageView1];

imageView2 = [[UIImageView alloc]initWithFrame:CGRectMake(20, 100, 329, 220)];

imageView2.image =
[UIImage imageNamed:@"image1.png"];

[self.view addSubview:imageView2];

imageView3 = [[UIImageView alloc]initWithFrame:CGRectMake(20, 100, 329, 220)];

imageView3.image =
[UIImage imageNamed:@"image1.png"];

[self.view addSubview:imageView3];

//绕Z轴旋转:默认使用正交投影,没有近大远小

//imageView.layer.transform = CATransform3DMakeRotation(M_PI/6, 0, 1, 0);

//CATransform3D rotate = CATransform3DMakeRotation(M_PI/6, 0, 1, 0);

//imageView.layer.transform = CATransform3DPerspect(rotate, CGPointMake(0, 0), 200);

timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:selfselector:@selector(update) userInfo:nil repeats:YES];

// Do any additional setup after loading the view, typically from a nib.

}

- (void)update

{

//static float angle= 0;

//angle+=0.05;

//

//CATransform3D transloate = CATransform3DMakeTranslation(0, 0, -200);

//CATransform3D rotate = CATransform3DMakeRotation(angle, 0, 1, 0);

//CATransform3D mat = CATransform3DConcat(rotate, transloate);

//imageView.layer.transform = CATransform3DPerspect(mat, CGPointMake(0, 0), 500);

static float angle= 0;

angle+=0.05;

CATransform3D move = CATransform3DMakeTranslation(0, 0, 160);

CATransform3D back = CATransform3DMakeTranslation(0, 0,
-160);

CATransform3D rotate0 = CATransform3DMakeRotation(-angle, 0, 1, 0);

CATransform3D rotate1 = CATransform3DMakeRotation(M_PI_2-angle, 0, 1, 0);

CATransform3D rotate2 = CATransform3DMakeRotation(M_PI_2*2-angle, 0, 1, 0);

CATransform3D rotate3 = CATransform3DMakeRotation(M_PI_2*3-angle, 0, 1, 0);

CATransform3D mat0 = CATransform3DConcat(CATransform3DConcat(move,
rotate0), back);

CATransform3D mat1 = CATransform3DConcat(CATransform3DConcat(move,
rotate1), back);

CATransform3D mat2 = CATransform3DConcat(CATransform3DConcat(move,
rotate2), back);

CATransform3D mat3 = CATransform3DConcat(CATransform3DConcat(move,
rotate3), back);

imageView.layer.transform = CATransform3DPerspect(mat0, CGPointZero, 500);

imageView1.layer.transform = CATransform3DPerspect(mat1, CGPointZero, 500);

imageView2.layer.transform = CATransform3DPerspect(mat2, CGPointZero, 500);

imageView3.layer.transform = CATransform3DPerspect(mat3, CGPointZero, 500);

}

4.加上一个公式,以后可以参考

struct
CATransform3D


{


CGFloat m11(x缩放),m12(y切变),
m13(旋转), [code]
m14();

[/code]

CGFloat m21(x切变), 
m22(y缩放), [code] 
m23(),
m24();

[/code]

CGFloat m31(旋转), 
m32( ), [code] 
m33(),
 
m34(透视效果,要操作的这个对象要有旋转的角度,否则没有效果。正直/负值都有意义);

[/code]

CGFloat m41(x平移),
m42(y平移),[code] 
m43(z平移),
m44();[/code]

};


参考网址:

http://blog.sina.com.cn/s/blog_8f5097be0101b91z.html

http://blog.sina.com.cn/s/blog_71715bf801019ut9.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: