精华内容
下载资源
问答
  • openGL坐标系

    2017-08-14 19:30:18
    openGL坐标系
    

    http://blog.csdn.net/hunter8777/article/details/5890899


    今天看3D模型动画代码中,发现用四元组来进行插值和旋转,了解了使用欧拉角做旋转会有万向锁的问题存在。但这个是建立在对模型坐标系进行旋转的基础上,于是又对OGL中矩阵变化的部分再次学习了一下。发现了一篇好文章,转发学习,留供查阅。

     

     

    openGL使用右手坐标

    从左到右,x递增
    从下到上,y递增
    从远到近,z递增


    --------------------------------------------------------------------------------

     

    OPENGL坐标系可分为:世界坐标系和当前绘图坐标系。

    世界坐标系以屏幕中心为原点(0, 0, 0)。你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定: 窗口范围按此单位恰好是(-1,-1)到(1,1)。

    当前绘图坐标系是 绘制物体时的坐标系。程序刚初始化时,世界坐标系和当前绘图坐标系是重合的。当用glTranslatef(),glScalef(), glRotatef()对当前绘图坐标系进行平移、伸缩、旋转变换之后, 世界坐标系和当前绘图坐标系不再重合。改变以后,再用glVertex3f()等绘图函数绘图时,都是在当前绘图坐标系进行绘图,所有的函数参数也都是相 对当前绘图坐标系来讲的

     


     

    OpenGL中的6种坐标系

    OpenGL中存在6种坐标系,

    1. Object or model coordinates

    2. World coordinates

    3. Eye (or Camera) coordinates

    4. Clip coordinates

    5. Normalized device coordinates

    6. Window (or screen) coordinates

    从object coordainates到world coordinates再到camera coordinate的变换,在OPENGL中统一称为model-view转换,初始化的时候,object coordinates和world coordinates还有camera coordinates坐标重合在原点,变换矩阵都为Identity。model-view matix转换points,vectorsd到camera坐标系。

     

    在opengl编程中,有个困惑的问题,就是那个坐标系是不动的,我想是你想参考坐标系是不动的。比如我想建立了一个object,放到 camera坐标系中,这时,我以camera的原点为参考点。当然,我想看这个物体的时候,我就以object的原点为参考点,移动camera坐标系的原点,就可以看到object了。好像写了一堆废话,呵呵。

     

     

    其中四种坐标经常要在程序中用到:世界坐标,物体坐标,设备坐标和眼坐标

     

    世界坐标是OpenGL中用来描述场景的坐标,Z+轴垂直屏幕向外,X+从左到右,Y+轴从下到上,是右手笛卡尔坐标系统。我们用这个坐标系来描述物体及光源的位置。

    将物体放到场景中也就是将物体平移到特定位置、旋转一定角度,这些操作就是坐标变换。OpenGL中提供了glTranslate*/glRotate*/glScale*三条坐标变换命令,利用OpenGL的矩阵运算命令,则可以实现任意复杂的坐标变换。

     

    非常重要:OpenGL 中有一个坐标变换矩阵栈(ModelView),栈顶就是当前坐标变换矩阵,进入OpenGL管道的每个坐标(齐次坐标)都会先乘上这个矩阵,结果才是对应点在场景中的世界坐标。OpenGL中的坐标变换都是通过矩阵运算完成的,与图形学课本的描述完全一致。要注意的是变换中的矩阵乘法是左乘,而矩阵乘法与算术乘法不同,不符合交换律(万一不明白去看矩阵代数书好了)。

     

    glTranslate*(x,y,z):平移,参数为各轴向的移动量。
    glRotate(d,x,y,z):旋转,第一个参数为转动的度数,后三个参数表明是否绕该轴旋转。通常x,y,z中只有一个为1,其余为0,用连续几条旋转命令完成复杂旋转。由于矩阵运算的左乘特点,旋转命令的顺序与旋转动作的顺序正好相反

     

    物体坐标是以物体某一点为原点而建立的“世界坐标”,该坐标系仅对该物体适用,用来简化对物体各部分坐标的描述。物体放到场景中时,各部分经历的坐标变换相同,相对位置不变,所以可视为一个整体,与人类的思维习惯一致。

     

    眼坐标是以视点为原点,以视线的方向为Z+轴正方向的坐标系中的方向。OpenGL管道会将世界坐标先变换到眼坐标,然后进行裁剪,只有在视线范围(视见体)之内的场景才会进入下一阶段的计算。

     

    同样的,有投影变换矩阵栈(Projection),栈顶矩阵就是当前投影变换矩阵,负责将场景各坐标变换到眼坐标,由所得到的结果是裁剪后的场景部分,称为裁剪坐标。前面提到过的视见体设定其实就是在建立该矩阵。

     

    设备坐标:OpenGL 的重要功能之一就是将三维的世界坐标经过变换、投影等计算,最终算出它在显示设备上对应的位置,这个位置就称为设备坐标。在屏幕、打印机等设备上的坐标是二维坐标。值得一提的是,OpenGL可以只使用设备的一部分进行绘制,这个部分称为视区或视口(viewport)。投影得到的是视区内的坐标(投影坐标),从投影坐标到设备坐标的计算过程就是设备变换了。

     

    矩阵栈切换:glMatrixMode(GL_MODELVIEWING或GL_PROJECTION);本命令执行后参数所指矩阵栈就成为当前矩阵栈,以后的矩阵栈操纵命令将作用于它。

     

    矩阵栈操纵命令:
    glPushMatrix(); 当前矩阵入栈,这时矩阵栈将栈顶值压入栈。
    glPopMatrix(); 栈顶出栈,通常与上一条命令配合使用。
    glLoadIdentity(); 将栈顶设为不变矩阵(就是对角线全为1其它为0的那个)。
    glMultMatrix(M);将栈顶T设为M·T。

    展开全文
  • OpenGL坐标系

    千次阅读 2014-08-19 13:00:11
    openGL坐标系- -   openGL使用右手坐标 从左到右,x递增 从下到上,y递增 从远到近,z递增 OPENGL坐标系可分为:世界坐标系和当前绘图坐标系。 世界坐标系以屏幕中心为原点(0, 0, 0)。你面对...

    openGL坐标系- -

                                          

    openGL使用右手坐标

    从左到右,x递增
    从下到上,y递增
    从远到近,z递增


    OPENGL坐标系可分为:世界坐标系和当前绘图坐标系。

    世界坐标系以屏幕中心为原点(0, 0, 0)。你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定: 窗口范围按此单位恰好是(-1,-1)到(1,1)。

    当前绘图坐标系是 绘制物体时的坐标系。程序刚初始化时,世界坐标系和当前绘图坐标系是重合的。当用glTranslatef(),glScalef(), glRotatef()对当前绘图坐标系进行平移、伸缩、旋转变换之后, 世界坐标系和当前绘图坐标系不再重合。改变以后,再用glVertex3f()等绘图函数绘图时,都是在当前绘图坐标系进行绘图,所有的函数参数也都是相 对当前绘图坐标系来讲的。

     

    openGL坐标变换

                                          

    坐标变换:OPENGL的每一种变换都是一个矩阵的运算。假设当前某顶点坐标为C,现在要做某种变换(设矩阵为M)得到新的坐标C1,那么运算过程就是C1=T×C。OpenGL应用左乘规则,坐标的变换就是用变换矩阵乘以坐标向量

    OpenGL变换在编程的时候顺序是反过来的。想对目标 glutWireSphere(0.2, 10, 8);//draw earth 做R2,T,R1的变换,在写的时候就要:

             glRotatef(year, 0.0, 1.0,0.0);//旋转矩阵R1
             glTranslatef(2.0, 0.0, 0.0);//平移矩阵T
             glRotatef(day, 0.0, 1.0, 0.0);//旋转矩阵R2

             glutWireSphere(0.2, 10, 8);//draw earth


     

     三维观察原理类似于拍一张照片的过程。(类似于red book )

    第一步是将照相机调整位置置于三角架上;
    第二步是 将物体调整位置放在相机的视野当中。实际上,相机和三维物体是相对位置,相机移动位置也可以理解为物体反向移动位置,因此这两步可以理解为一步,即调整三 维物体和视点的位置,将世界坐标系下的物体变换到观察坐标系下。在计算机图形学中,定义模型矩阵(Modeling Matrix)实现了三维图形的几何变换,即平移、旋转和缩放。
    第三步相机进行调焦以便看清楚物体,并按下快门将三维物体投影在二维胶片上;在计算机图形学中,定义相应的投影矩阵(ProjectionMatrix),进行投影变换,把三维物体从观察坐标系转换到投影坐标系中。
    第四步是胶片的冲洗和裁剪。相应计算机图形学中,定义视口矩阵(ViewingMatrix),进行视口变换和裁剪,决定二维图象的大小。将物体从二维投影坐标系下转换到设备坐标系下。
    这样,一个三维空间里的物体被投影到二维平面上了,也就能在二维的计算机屏幕上正确显示了。

    屏幕坐标点 = 3D 模型点 * 几何变换栈矩阵(n...1) * 投影变换栈矩阵(n...1)
    OpenGL 维护两个栈: 投影变换栈, 几何变换栈。
    投影:glOrtho,gluPerspective--------------------glMatrixMOde(GL_PROJECTION);
    几何变换:glTranslatef,glRotatef,glScalef--------glMatrixMOde(GL_MODELVIEW);

      http://my.sdlgame.com/content/view/336/6.html

    展开全文
  • opengl 坐标系

    2014-06-22 15:03:12
    OPENGL坐标系可分为:世界坐标系和当前绘图坐标系。 世界坐标系以屏幕中心为原点(0, 0, 0)。你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定: 窗口范围按此单位恰好是(-1,-1...

    http://blog.csdn.net/hunter8777/article/details/5890899


    OPENGL坐标系可分为:世界坐标系和当前绘图坐标系。

    世界坐标系以屏幕中心为原点(0, 0, 0)。你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定: 窗口范围按此单位恰好是(-1,-1)到(1,1)。

    当前绘图坐标系是 绘制物体时的坐标系。程序刚初始化时,世界坐标系和当前绘图坐标系是重合的。当用glTranslatef(),glScalef(), glRotatef()对当前绘图坐标系进行平移、伸缩、旋转变换之后, 世界坐标系和当前绘图坐标系不再重合。改变以后,再用glVertex3f()等绘图函数绘图时,都是在当前绘图坐标系进行绘图,所有的函数参数也都是相 对当前绘图坐标系来讲的

     


     

    OpenGL中的6种坐标系

    OpenGL中存在6种坐标系,

    1. Object or model coordinates

    2. World coordinates

    3. Eye (or Camera) coordinates

    4. Clip coordinates

    5. Normalized device coordinates

    6. Window (or screen) coordinates

    从object coordainates到world coordinates再到camera coordinate的变换,在OPENGL中统一称为model-view转换,初始化的时候,object coordinates和world coordinates还有camera coordinates坐标重合在原点,变换矩阵都为Identity。model-view matix转换points,vectorsd到camera坐标系。

     

    在opengl编程中,有个困惑的问题,就是那个坐标系是不动的,我想是你想参考坐标系是不动的。比如我想建立了一个object,放到 camera坐标系中,这时,我以camera的原点为参考点。当然,我想看这个物体的时候,我就以object的原点为参考点,移动camera坐标系的原点,就可以看到object了。好像写了一堆废话,呵呵。

     

     

    其中四种坐标经常要在程序中用到:世界坐标,物体坐标,设备坐标和眼坐标

     

    世界坐标是OpenGL中用来描述场景的坐标,Z+轴垂直屏幕向外,X+从左到右,Y+轴从下到上,是右手笛卡尔坐标系统。我们用这个坐标系来描述物体及光源的位置。

    将物体放到场景中也就是将物体平移到特定位置、旋转一定角度,这些操作就是坐标变换。OpenGL中提供了glTranslate*/glRotate*/glScale*三条坐标变换命令,利用OpenGL的矩阵运算命令,则可以实现任意复杂的坐标变换。

     

    非常重要:OpenGL 中有一个坐标变换矩阵栈(ModelView),栈顶就是当前坐标变换矩阵,进入OpenGL管道的每个坐标(齐次坐标)都会先乘上这个矩阵,结果才是对应点在场景中的世界坐标。OpenGL中的坐标变换都是通过矩阵运算完成的,与图形学课本的描述完全一致。要注意的是变换中的矩阵乘法是左乘,而矩阵乘法与算术乘法不同,不符合交换律(万一不明白去看矩阵代数书好了)。

     

    glTranslate*(x,y,z):平移,参数为各轴向的移动量。
    glRotate(d,x,y,z):旋转,第一个参数为转动的度数,后三个参数表明是否绕该轴旋转。通常x,y,z中只有一个为1,其余为0,用连续几条旋转命令完成复杂旋转。由于矩阵运算的左乘特点,旋转命令的顺序与旋转动作的顺序正好相反

     

    物体坐标是以物体某一点为原点而建立的“世界坐标”,该坐标系仅对该物体适用,用来简化对物体各部分坐标的描述。物体放到场景中时,各部分经历的坐标变换相同,相对位置不变,所以可视为一个整体,与人类的思维习惯一致。

     

    眼坐标是以视点为原点,以视线的方向为Z+轴正方向的坐标系中的方向。OpenGL管道会将世界坐标先变换到眼坐标,然后进行裁剪,只有在视线范围(视见体)之内的场景才会进入下一阶段的计算。

     

    同样的,有投影变换矩阵栈(Projection),栈顶矩阵就是当前投影变换矩阵,负责将场景各坐标变换到眼坐标,由所得到的结果是裁剪后的场景部分,称为裁剪坐标。前面提到过的视见体设定其实就是在建立该矩阵。

     

    设备坐标:OpenGL 的重要功能之一就是将三维的世界坐标经过变换、投影等计算,最终算出它在显示设备上对应的位置,这个位置就称为设备坐标。在屏幕、打印机等设备上的坐标是二维坐标。值得一提的是,OpenGL可以只使用设备的一部分进行绘制,这个部分称为视区或视口(viewport)。投影得到的是视区内的坐标(投影坐标),从投影坐标到设备坐标的计算过程就是设备变换了。

     

    矩阵栈切换:glMatrixMode(GL_MODELVIEWING或GL_PROJECTION);本命令执行后参数所指矩阵栈就成为当前矩阵栈,以后的矩阵栈操纵命令将作用于它。

     

    矩阵栈操纵命令:
    glPushMatrix(); 当前矩阵入栈,这时矩阵栈将栈顶值压入栈。
    glPopMatrix(); 栈顶出栈,通常与上一条命令配合使用。
    glLoadIdentity(); 将栈顶设为不变矩阵(就是对角线全为1其它为0的那个)。
    glMultMatrix(M);将栈顶T设为M·T。


    展开全文
  • opengl坐标系

    2017-07-14 15:54:04
    openGL 坐标系: 分3个轴,x,y,z 中心点为o, 箭头方向为正方向,最大与最小值为1和-1,这是经过归一化处理的。这样设计是为了显卡计算方便。   屏幕坐标系,就是应用在设备屏幕上的坐标系。也...

    了解坐标系是绘制图形的基础。在使用openGL的场景中,有世界坐标,局部坐标,纹理坐标,和屏幕坐标几种。

    openGL 坐标系:


    分3个轴,x,y,z 中心点为o, 箭头方向为正方向,最大与最小值为1和-1,这是经过归一化处理的。这样设计是为了显卡计算方便。

     

    屏幕坐标系,就是应用在设备屏幕上的坐标系。也就是图形最终绘制的地方。


    左上角为原点,箭头为正方向,大小又屏幕像素大小决定。openGL的屏幕坐标系,Y轴向上为正。相当于上面那个三维坐标系截取一个二维的XY。

     

    纹理坐标系:


    也做了归一化处理。这个坐标就代表了一个纹理。openGL是基于定点的网格绘制。就是说,openGL的图形都是由很多顶点,按照一定的规则链接起来构成的图形。那么纹理坐标的4个坐标点,映射到顶点上。openGL就会把这个纹理应用到4个定点构成的图形上。

     

    一般我们会把openGL的坐标系的中心点,与屏幕的中心点重合。如下:


    矩形为屏幕的区域。openGL的绘制方法会把这个坐标系的顶点,组合成图形呈现在屏幕上。当然这个还涉及到摄像机的位置,屏幕剪裁等设置。这里不考虑。

    那么什么是顶点呢,就是一个有xyz坐标的点。如(0,0,0)或(1,1,1)。XY就和通常的二维坐标一样定位平面的位置。Z轴表示的是深度,openGL就是为了绘制3D图形而诞生的。顶点坐标是做了归一化处理的float类型。那么这里就会涉及到屏幕坐标系到openGL坐标系的转化工作。

     

    如图:


    屏幕坐标系,左上点为(0,0) 那么屏幕中心点坐标,就是(sreenWidth / 2, screenHeight / 2)。而对应openGL坐标系的归一化坐标就是(0,0,0)。所以这里需要把屏幕坐标转换成openGL的归一化坐标。


    [java]  view plain  copy
    1. /** 
    2.    * Convert x to openGL 
    3.    *  
    4.    * @param x 
    5.    *            Screen x offset top left 
    6.    * @return Screen x offset top left in OpenGL 
    7.    */  
    8.   public static float toGLX(float x) {  
    9.       return -1.0f * ratio + toGLWidth(x);  
    10.   }  
    11.    
    12.   /** 
    13.    * Convert y to openGL y 
    14.    *  
    15.    * @param y 
    16.    *            Screen y offset top left 
    17.    * @return Screen y offset top left in OpenGL 
    18.    */  
    19.   public static float toGLY(float y) {  
    20.       return 1.0f - toGLHeight(y);  
    21.   }  
    22.    
    23.   /** 
    24.    * Convert width to openGL width 
    25.    *  
    26.    * @param width 
    27.    * @return Width in openGL 
    28.    */  
    29.   public static float toGLWidth(float width) {  
    30.       return 2.0f * (width / screenWidth) * ratio;  
    31.   }  
    32.    
    33.   /** 
    34.    * Convert height to openGL height 
    35.    *  
    36.    * @param height 
    37.    * @return Height in openGL 
    38.    */  
    39.   public static float toGLHeight(float height) {  
    40.       return 2.0f * (height / screenHeight);  
    41.   }  
    42.    
    43.   /** 
    44.    * Convert x to screen x 
    45.    *  
    46.    * @param glX 
    47.    *            openGL x 
    48.    * @return screen x 
    49.    */  
    50.   public static float toScreenX(float glX) {  
    51.       return toScreenWidth(glX - (-1 * ratio));  
    52.   }  
    53.    
    54.   /** 
    55.    * Convert y to screent y 
    56.    *  
    57.    * @param glY 
    58.    *            openGL y 
    59.    * @return screen y 
    60.    */  
    61.   public static float toScreenY(float glY) {  
    62.       return toScreenHeight(1.0f - glY);  
    63.   }  
    64.    
    65.   /** 
    66.    * Convert glWidth to screen width 
    67.    *  
    68.    * @param glWidth 
    69.    * @return Width in screen 
    70.    */  
    71.   public static float toScreenWidth(float glWidth) {  
    72.       return (glWidth * screenWidth) / (2.0f * ratio);  
    73.   }  
    74.    
    75.   /** 
    76.    * Convert height to screen height 
    77.    *  
    78.    * @param glHeight 
    79.    * @return Height in screen 
    80.    */  
    81.   public static float toScreenHeight(float glHeight) {  
    82.       return (glHeight * screenHeight) / 2.0f;  
    83.   }  
    0
    展开全文
  • OpenGL 坐标系

    2015-10-07 23:03:16
    OPENGL坐标系可分为:世界坐标系和当前绘图坐标系。 世界坐标系以屏幕中心为原点(0, 0, 0)。你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定: 窗口范围按此单位恰好是(-1,-1...
  • 主要介绍了Cocos2d-x学习笔记之世界坐标系、本地坐标系、opengl坐标系、屏幕坐标系,本文用代码和注释讲解了Cocos2d-x中的坐标体系,需要的朋友可以参考下
  • openGL 坐标系

    2012-11-21 11:12:41
    openGL使用右手坐标 从左到右,x递增 从下到上,y递增 从远到近,z递增 ...OPENGL坐标系可分为:世界坐标系和当前绘图坐标系。 世界坐标系以屏幕中心为原点(0, 0, 0)。你面对屏幕,你的右边是x正轴,上面是y正
  • OpenGL 坐标系定义

    2012-06-24 16:14:51
    OpenGL 坐标系定义
  • OpenGL 坐标系讲解

    2011-01-11 15:21:00
    OpenGL 坐标系讲解,详细讲解OpenGL的坐标关系,坐标装换
  • 一、 常用的坐标系 ...2. opengl坐标系中采用的是3维坐标: static final float COORD[] = { -1.0f, -1.0f, //1 1.0f, -1.0f, //2 -1.0f, 1.0f, //3 1.0f, 1.0f, //4 }; 坐标原点默...
  • OPENGL坐标系

    千次阅读 2006-09-06 17:05:00
    openGL坐标系- - openGL使用右手坐标从左到右,x递增从下到上,y递增从远到近,z递增OPENGL坐标系可分为:世界坐标系和当前绘图坐标系。世界坐标系以屏幕中心为原点(0, 0, 0)。你面对屏幕,你的右边是x正轴,上面是...
  • OpenGL坐标系和像素坐标系

    千次阅读 2016-05-27 13:06:58
    OpenGL坐标系原点在中心,并且做了归一化处理。就是说xy轴,都是从[-1, 1]之间。而像素坐标系是同样的中心点,右上是正方向,只是没有做归一化处理,是以像素为单位的。那么,归一化的坐标系和像素坐标最大的区别...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,565
精华内容 8,226
关键字:

opengl坐标系