技术标签: 笔记 矩阵变换 3D旋转 iOS动画 CoreAnimation iOS编程 CATransform3D
关于图层的几个坐标系。
对于ios来说,坐标系的(0,0)点在左上角,就是越往下,Y值越大。越往右,X值越大。
一个图层的frame,它是position,bounds,anchorPoint和transform属性的一部分。
设置一个新的frame将会相应的改变图层的position和bounds,但是frame本身并没有保存。
position:是一个CGPoint值,它指定图层相当于它父图层的位置,该值基于父图层的坐标系。
bounds:是一个CGRect值,指定图层的大小(bounds.size)和图层的原点(bounds.origin),这个坐标系是基于自身的。如果改变bounds的origin,那么在该图层的子图层,坐标会跟着改变。也就是说,改变自身的坐标系,本身在父图层的位置不变,但它上的子图层位置变化。
anchorPoint:是一个CGPoint值,它是指定了一个基于bounds的符合坐标系的位置。锚点(anchorpoint)制定了bounds相对于position的值,同时也作为一个变化时候的中心点。锚点使用空间坐标系取值范围是0-1之间的数。默认是0.5,也就是秃瓢的中心点,如果是(0,0)那么,图层向左上方移动。如果是(1,1)就向右下方移动。
看下面的两个图,就能够够清晰的看出锚点变化所带来的不一样。(此图为MACOS 坐标系,如果是IOS,那么(0,0)点在图的左上方。)
对于anchorPoint的解释在ios中如图:
下图中的红点位置就是锚点的位置:默认为(0.5,0.5)。在对图像进行变换时,都是按照这个点来进行缩放,偏移等。
一旦修改锚点的位置为:(0,0),那么图像就会变成下图。各种变换就会按照这个点来运动。
所以说,在ios系统中,锚点的坐标系是:左上角为(0,0),右下角为(1,1)。
根据此图,在理解上面的定义,就直观了一些。
//
//
//
图层的几何变换。
可以通过矩阵来改变一个图层的几何形状。
CATransform3D的数据结构定义了一个同质的三维变换(4x4CGFloat值的矩阵),用于图层的旋转,缩放,偏移,歪斜和应用的透视。
图层的2个属性指定了变换矩阵:transform和 sublayerTransform。
transform : 是结合anchorPoint(锚点)的位置来对图层和图层上的子图层进行变化。
sublayerTransform:是结合anchorPoint(锚点)的位置来对图层的子图层进行变化,不包括本身。
CATransform3DIdentity是单位矩阵,该矩阵没有缩放,旋转,歪斜,透视。该矩阵应用到图层上,就是设置默认值。
//
//
//
变换函数
CATransform3DMakeTransla
官方文档:
Returns atransform that translates by '(tx, ty, tz)'. t' = [1 0 0 0; 0 1 00; 0 0 1 0; tx ty tz 1].
CATransform3D CATransform3DMakeTransla
做一个解释,对于初学者来说,可能没有看明白是什么意思。我详细说下
对于CATransform3D来说,它是一个4x4CGFloat的矩阵。
而上面给的值:[10 0 0; 0 1 0 0; 0 0 1 0; tx ty tz 1].
给竖起来后。就发现:
1
0
0
tx
竖起来看就很明显了。
CATransform3D
struct
CATransform3D
{
CGFloat m11(x缩放), m12(y切变),
m13(旋转),
m14();
CGFloat m21(x切变),
m22(y缩放),
m23(),
m24();
CGFloat m31(旋转),
m32(),
m33(),
m34(透视效果,要操作的这个对象要有旋转的角度,否则没有效果。正直/负值都有意义);
CGFloat m41(x平移),
m42(y平移),
m43(z平移),
m44();
};
CATransform3DCATransform3DMakeTransla
的参数意思就是
tx::x平移。
换换函数:
CATransform3DCATransform3DMakeTransla
tx:X轴偏移位置,往下为正数。
ty:Y轴偏移位置,往右为正数。
tz:Z轴偏移位置,往外为正数。
例:
如果有2个图层,一个是绿色的,一个是红色的。先加载绿色,后加载红色。
tx,ty的左右偏移先不说了。
如果绿色的tz为-10
如果绿色的tz为
对于tz来说,值越大,那么图层就越往外(接近屏幕),值越小,图层越往里(屏幕里)。
CATransform3D CATransform3DTranslate (CATransform3D t, CGFloat tx,CGFloat ty, CGFloat tz);
t:就是上一个函数。其他的都一样。
就可以理解为:函数的叠加,效果的叠加。
CATransform3D CATransform3DMakeScale(CGFloat sx, CGFloat sy, CGFloat sz);
sx:X轴缩放,代表一个缩放比例,一般都是0 --- 1 之间的数字。
sy:Y轴缩放。
sz:整体比例变换时,也就是m11(sx)==m22(sy)时,若m33(sz)>1,图形整体缩小,若0<1,图形整体放大,若m33(sz)<0,发生关于原点的对称等比变换。
当sx = 1,sy =1时。如图:
当sx = 0.5,sy =0.5时。如图:
CATransform3D CATransform3DScale(CATransform3D t, CGFloat sx, CGFloat sy, CGFloatsz)
t:就是上一个函数。其他的都一样。
就可以理解为:函数的叠加,效果的叠加。
CATransform3D CATransform3DMakeRotatio
旋转效果。
angle:旋转的弧度,所以要把角度转换成弧度:角度* M_PI / 180。
x:向X轴方向旋转。值范围-1--- 1之间
y:向Y轴方向旋转。值范围-1 ---1之间
z:向Z轴方向旋转。值范围-1 ---1之间
例:向X轴旋转60度。
向X轴,Y轴都旋转60度,就是沿着对角线旋转。
可以通过X,Y,Z轴同时变化,来旋转图像。
CATransform3D CATransform3DRotate (CATransform3D t, CGFloat angle,CGFloat x, CGFloat y, CGFloat z);
t:就是上一个函数。其他的都一样。
就可以理解为:函数的叠加,效果的叠加。
CATransform3D CATransform3DInvert (CATransform3D t);
翻转效果。
CGAffineTransform CATransform3DGetAffineTr
bool CATransform3DIsAffine (CATransform3D t);
仿射效果。
就是把一个 CATransform3D 对象转换成一个 CGAffineTransform 对象。
也就是把 CATransform3D 矩阵转换成 CGAffineTransform 矩阵
变换函数同时提供了可以比较一个变换矩阵是否是单位矩阵,或者两个矩阵是否相等。
bool CATransform3DIsIdentity (CATransform3D t);
boolCATransform3DEqualToTran
也可以通过修改数据结构和键值来设置变换效果。
struct CATransform3D
{
CGFloat m11, m12, m13, m14;
CGFloat m21, m22, m23, m24;
CGFloat m31, m32, m33, m34;
CGFloat m41, m42, m43, m44;
}
可以直接修改 其中的一个值,来达到相同的效果。
或者修改键值
[myLayer setValue:[NSNumber numberWithInt:0] forKeyPath:@"transform.rotation.x"];
3D,顾名思义就是可以在z轴上动作,这里列举三个用例
第一部分、前几天做动画,使用到了CATransform3D ,由于没有学过计算机图形学,矩阵中m11--m44的各个含义都不清楚,经过几天研究总结如下:(供和我一样的菜鸟学习)
ps:
#import <QuartzCore/CATransform3D.h>。
iphone 透视效果(perspective)
第二行一定要写在第三行的前面!自己理解!
第二部分1. CATransform3D结构成员的意义。
struct
CATransform3D
{
CGFloat m11(x缩放), m12(y切变), m13(旋转), m14();
CGFloat m21(x切变), m22(y缩放), m23(), m24();
CGFloat m31(旋转), m32(), m33(), m34(透视效果,要操作的这个对象要有旋转的角度,否则没有效果。正直/负值都有意义);
CGFloat m41(x平移), m42(y平移), m43(z平移), m44();
};
|
ps:整体比例变换时,也就是m11==m22时,若m33>1,图形整体缩小,若0<m33<1,图形整体放大,若s<0,发生关于原点的对称等比变换。
()空的地方以后补充。
2. CATransform3DMakeTranslation
CATransform3DMakeTranslation(0, 0, 0) 创建了一个4*4的单位矩阵。
3. CATransform3DMakeRotation And CATransform3DRotate
CATransform3DMakeRotation()
4. 翻转的动画
made, 我发现这个东西确实很难讲清楚,主要是因为我理论薄弱,
【1】针对X轴旋转,就是1,0,0,针对Y轴旋转,就是0,1,0...下面那行也要进行正确的转换。
【2】此处应该是和 anchorPoint有关系的。
【3】这个值会影响类似于深度的东西,比如说Cube会离我们更近,或者是更远。(但是,似乎不算是透视关系)
参考:http://blog.sina.com.cn/s/blog_8f5097be0101b91z.html
http://blog.csdn.net/yongyinmg/article/details/37931537
http://blog.csdn.net/ch_soft/article/details/7351896
for 循环的语法格式如下:for 迭代变量 in 字符串|列表|元组|字典|集合: 代码块格式中,迭代变量用于存放从序列类型变量中读取出来的元素,所以一般不会在循环中对迭代变量手动赋值;代码块指的是具有相同缩进格式的多行代码(和 while 一样),由于和循环结构联用,因此代码块又称为循环体。for 循环语句的执行流程如图 1 所示。下面的程序演示了 for 循环的具体用法:add = "http://www.baidu.com/python/"#for循环,遍历 add 字符串._使用列表for循环while循环做的python项目
sql loader 参数详解Sqlldr sql loader可以把一些以文本格式存放的数据顺利地导入到oracle数据库中,它是一种在不同数据库之间进行数据迁移非常方便而且通用的工具。缺点就是速度比较慢,另外对blob等类型的数据就有点麻烦了。一、用法: SQLLDR keyword=value [,keyword=value,...]二、_sqlload 参数
vue动态路由_vue的路由不停刷新
作者:小智,赵钰莹,张晓楠 链接:https://www.infoq.cn/article/yeQU4f_BujTYCMxaXNFc?utm_source=tuicool&utm_medium=referral 工欲善其事必先利其器,一个优秀的程序员除了代码写得好,善于利用各种开发工具同样可以事半功倍。以 BAT 为代表的各大厂程序员们在平时的工作中都用什么开发工..._typescript json序列化库
1.Char 5: fatal error: control may reach end of non-void function [-Wreturn-type]}1.Char 5: fatal error: control may reach end of non-void function [-Wreturn-type] }这类报错的含义是:没有考虑所有可能的返回值情况什么意思呢,比如我们的Java程序的一个方法:public int fun(int a){ if(a.
b端产品,适用对象是企业或组织,用来解决企业某类经营管理问题。1、核心价值:规模(提升收入)、成本(降低成本)、效率(提高效率)、品质(保证品质)、风控好的b端产品提供长期的核心价值2、分类方式1)按照部署方式:私有化、云端部署2)技术架构:c/s(client/server)客户端,b/s(browser/server)浏览器3)业务方向:对企业内、对企业外、saas。_b端学习笔记
给图片中的人脸添加特效(帽子)人脸特效流程和原理拆解1数据准备首先要准备帽子和人脸照片,加载到项目的目录中2人脸检测首先调用OpenCV中的库函数对照片进行人脸检测,得到人脸矩形的各参数值,从而可以得到帽子要加在什么位置上去,由于人脸照片和帽子照片的大小位置的不同,所以当我们要将两个照片进行拼接的时候就得取人脸的上部分即额头的那一部分(如下图)之后按照这个尺寸重新规划帽子的尺寸。3灰度化帽子因为我们要想得到两张照片拼接的样子,这就必须得用到OpenCV的另一个对图像处理的函数按像素相或的操_python 将头饰特效加到人像上
ubuntu用apt-get命令安装一些软件包时,总报错:E:could not get lock /var/lib/dpkg/lock -open等出现这个问题的原因可能是有另外一个程序正在运行,导致资源被锁不可用。而导致资源被锁的原因,可能是上次安装时没正常完成,而导致出现此状况。解决方法:输入以下命令sudo rm /var/cache/apt/archives/locksu
netstat命令教程视频1、-e 以太网查看C:\>netstat -e接口统计 接收的 发送的字节 1663186062 243565560单播数据包 1820964 1413096非单播数据包 ...
$("#addtemplate").click(function(){//新增模板varliEl=document.createElement('li');varaEl=document.createElement('a');aEl.contentEditable=true;aEl.classList.add("aaa");$(aE..._contenteditable 值
1 有宽高 line-height<view class='container'> 666</view>.container{ border: 2rpx black solid; width: 400rpx; height: 200rpx; text-align: center; /* 左右居中 */ line-height: 200rpx; /* 设置行高 使文字上下居中 */}2 使用flex布局<view class='c
一进公司,总听同事说WAS环境。。。 俺也不敢问,今天找个比较熟的同事问了这个弱智的问题。。。原来was就是一直在用的Websphere 我真晕死了~_websphere大家为啥叫was