iOS 坐标系
参考链接: http://www.jianshu.com/p/34dc7c2c974f
笛卡尔发明了平面直角坐标系,坐标系的作用是为了便于描述点的位置。(极坐标系,通过到原点的距离以及夹角角度来表示一个点。)在笛卡尔的平面坐标系的基础上出现了三维坐标系,常用的三维坐标系分两种:左手坐标系和右手坐标系。(大拇指指向z轴,其他四指沿着x轴到y轴方向)
在Mac,IOS中各种坐标系交错使用,然而,z轴的正方向总是指向观察者,也就是垂直屏幕平面向上。
Mac
在Mac中NSView的坐标系默认是右手坐标系
(View其实是二维坐标系,但是为了方便我们可以假设其是三维坐标系,只是所有界面的变化都是在xy平面上),原点在左下角
. NSView提供了一个可以用于覆盖的方法
-(BOOL)isFlipped;
此默认返回NO,当返回YES的时候,则坐标系变成左手坐标系,坐标原点变成左上角。
IOS
在iOS的UIView中,没有所谓的Flipped Coordinate的概念,统一使用左手坐标系,也就是坐标原点在左上角
.然而不同的框架下却有不同:
UIKit(cocoa Touch层核心framework) Y轴向下 左手坐标系
CALayer Y轴向下 左手坐标系
Core Graphics(Quartz) Y轴向上 右手坐标系
-
OpenGL ES Y轴向上 右手坐标系
Core Animation可以通过 CALayer的geometryFlipped 属性来适配这两种情况,它决定了
一个图层的坐标是否相对于父图层垂直翻转
,是一个BOOL类型。我们可以设置它为YES则子图层将会被垂直翻转。OpenGL-ES是 iPhone SDK的2D和3D绘制引擎,它使用右手坐标系,它的坐标系也是y轴向上的,如果不考虑z轴,在二维下它的坐标系和Quartz是一样的.(OpenGL 渲染处理 1.0,2.0 截止到现在3.0,从固定管线到可编程管线,已经提供很大程度自定义操作,在人们通过眼睛看到世间物体到最后通过设备进行输出显示在计算机屏幕,手机屏幕上这一过程 。。。==后续总结)
** 使用Core Graphics画图的坐标系都是右手坐标系,由于UIKit的提供的高层方法会自动处理CTM(比如drawInRect方法),所以无需自己在CG的上下文中做处理,然而当使用CG的相关函数画图到UIView上的时候,需要注意CTM的Flip变换,要不然会出现界面上图形倒过来的现象:**
在绘制到context前翻转坐标系
CGContextTranslateCTM(context, 0, height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), uiImage.CGImage);
垂直翻转投影矩阵
// 图片被颠倒的绘制到context
CGContextDrawImage(context, CGRectMake(0, 0, width, height), uiImage.CGImage);
// 设置上下颠倒的投影矩阵(则原来颠倒的图片回到了正确的方向)
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof( 0, framebufferWidth, framebufferHeight, 0, -1, 1 );