左手坐标系、右手坐标系、笛卡尔坐标系

左手坐标系:伸开左手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。

右手坐标系:伸开右手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。

左右手坐标系的示意图如下:

左手和右手坐标注系的区别在于两者Z轴的方向是相反的。

在高等数学中使用的三维空间是笛卡尔坐标系,如下:

笛卡尔坐标系其实就是右手坐标系,OpenGL中使用右手坐标注系,Direct3D使用的是左手坐标系。

左手旋转规则、右手旋转规则

左右手旋转规则用于判断当前坐标系中物体旋转时正方向的判定。在右手坐标系中,确定旋转轴后,右手握成拳头,拇指指向旋转轴的正方向,其余手指的弯曲方向即为旋转的正方向,跟手指弯曲方向一致的旋转记为正向,相反则为负向。左手坐标注系中判断旋转方向的正负使用左手,其他规则一样。两者的示意图:

在OpenGL中,对物体的移动、缩放、旋转操作要使用模型变换,有三个模型变换函数:

  • glTranslatef     平移
  • glRotatef         旋转
  • glScalef           缩放

 平移:

glTranslatef (GLfloat x, GLfloat y, GLfloat z);

x,y,z分别表示物体在xyz方向上的平移,举例来说,glTransLatef(-5.0f,4.0f,-3.0f)表示物体沿x轴负方向移                 动5,y正方向移动4,z负方向移动3。



旋转:

glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);

第一个参数是旋转角度,后三个参数定义了旋转轴,这个旋转轴是由地当前坐标系的原点和点(x,y,z)的直               线。正方向是原点指向点(xyz)。如果要定义不经过原点的旋转轴,则需要先把物体的旋转轴平移到过原                 点,旋转之后,再经过平移的逆变换平移回去。



缩放:

glScalef (GLfloat x, GLfloat y, GLfloat z);

三个参数分别是物体在xyz三个方向上的缩放比例。

举例如下,原始图像:

平移:

旋转:

缩放:

坐标变换完整代码:

#include <glut.h>
#include <iostream> using namespace std; void myDisplay(void)
{
glClearColor(1,1,0.8,1);
glClear(GL_COLOR_BUFFER_BIT); //加载单位矩阵,在做坐标变换之前都要加载一下这个单位矩阵
//glLoadIdentity(); //将变换矩阵与当前矩阵相乘,之后所有的点都会左乘上该平移矩阵
glTranslatef(0.6,0,0);
glRotatef(45,0,0,1);
glScalef(0.5,0.5,0.5);
glColor3f(1,0,1);
glBegin(GL_POLYGON); //绘制一个多边形
{
glVertex2f(-0.4,-0.4);
glVertex2f(-0.4,0.4);
glVertex2f(0.4,0.4);
glVertex2f(0.4,-0.4);
}
glEnd();
glFlush();
} int main(int argc, char *argv[])
{
glutInit(&argc, argv); //初始化GLUT
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(500, 200);
glutInitWindowSize(400, 400);
glutCreateWindow("OpenGL");
glutDisplayFunc(&myDisplay); //回调函数
glutMainLoop(); //持续显示,当窗口改变会重新绘制图形
return 0;
}

OpenGL(四) 左右手坐标系及基本坐标变换的更多相关文章

  1. OpenGL: 你不知道的左右手坐标系

    左右手坐标系 众所周知,OpenGL使用的是右手坐标系,而Direct3D使用的是左手坐标系. 除了上面Z轴的方向不一样外,左右手坐标系的还有其他区别: 正向旋转方向:在左手系中用Left-Hand ...

  2. Unity3D的四种坐标系

    [Unity3D的四种坐标系] 1.World Space(世界坐标):我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的.transform.position可以获得该位置坐标. ...

  3. OpenGL中各种坐标系的理解[转]

    OPENGL坐标系可分为:世界坐标系和当前绘图坐标系. 世界坐标系:在OpenGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的.你面对 屏幕,你的右边是x正轴,上面是y正轴,屏幕 ...

  4. OpenGL中各种坐标系的理解

    转载:https://blog.csdn.net/meegomeego/article/details/8686816 OPENGL坐标系可分为:世界坐标系和当前绘图坐标系. 世界坐标系以屏幕中心为原 ...

  5. Cocos2d-x 核心概念 - 坐标系(UI.OpenGL.世界坐标系.模型坐标系)

    UI坐标系与OpenGL坐标系 UI坐标就是Android和IOS等应用开发时候使用的二维坐标系,原点在左上角 OpenGL坐标是三维坐标,由于Cocos2d-x Lua 底层采用OpenGL渲染,因 ...

  6. Unity 3D 的四种坐标系

    1, World Space(世界坐标): 我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的.transform.position可以获得该位置坐标. 2, Screen Spa ...

  7. [转]<Unity3D>Unity3D的四种坐标系

    http://blog.csdn.net/zuoyamin/article/details/8813424 World Space(世界坐标):我们在场景中添加物体(如:Cube),他们都是以世界坐标 ...

  8. 转:Unity3D的四种坐标系

    World Space(世界坐标):我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的.transform.position可以获得该位置坐标. Screen Space(屏幕坐标 ...

  9. android自定义控件(四)坐标系

    1.局部坐标系(Local Coordinate) 所谓本地坐标系,就是坐标系以物体的中心为坐标原点,物体旋转.平移等操作都是围绕局部坐标系进行的.这时当物体模型进行旋转.平移等操作时, 局部坐标系也 ...

随机推荐

  1. linux(debian)系统django配远程连接sqlserver数据库

    费了将近一天时间.最终解决,记下来留给须要的人 须要安装的: python-odbc : https://github.com/mkleehammer/pyodbc下载后install 安装pytho ...

  2. Kinect 骨骼映射---Let me dance for U!

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接: http://blog.csdn.net/cartzhang/article/details/45583443 作者:ca ...

  3. 【codeforces 742C】Arpa's loud Owf and Mehrdad's evil plan

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  4. Multi-Tenancy模式,基础服务大规模扩张的时候,是应该推进了。

    这不是技术介绍.这是我要推进的工作,记在这里.服务的对象太多,必须隔离为不同租户了.

  5. [Compose] Isomorphisms and round trip data transformations

    What is Isomorphisms?We have a value x, then apply function 'to' and 'from' to value 'x', the result ...

  6. 《TCP/IP具体解释卷2:实现》笔记--域和协议

    Net/3组把协议关联到一个域,而且用一个协议族常量来标识每一个域.Net/3还通过全部的编址方法将协议分组. 在一个域中 的每一个协议使用同类地址.而且每种地址仅仅被一个域使用.作为结果,一个域能通 ...

  7. 微信小程序从零开始开发步骤(三)

    上一章节,我们分享了如何创建一个新的页面和设置页面的标题,这一章我们来聊聊底部导航栏是如何实现的.即点击底部的导航,会实现不同对应页面之间的切换. 我们先来看个我们要实现的底部导航栏的效果图:(三个导 ...

  8. spring mvc controller接收请求值及controller之间跳转及传值

    spring接收请求参数: 1,使用HttpServletRequest获取 @RequestMapping("/login.do") public String login(Ht ...

  9. PhpStorm常用快捷键(不多够用)

    PhpStorm常用快捷键(不多够用) 一.总结 一句话总结: 1.前进 解答:Ctrl+shift+ z 2.跳转到指定行数 解答:Ctrl+G 3.块注释 解答:ctrl + shift + / ...

  10. Weblogic中可以使用的脚本

    启动被管服务器的脚本 rm -rf ../servers/server5002/stage/* rm -rf ../servers/server5002/tmp/* sleep 20 USER_MEM ...