`
xuela_net
  • 浏览: 496759 次
文章分类
社区版块
存档分类
最新评论

glLoadIdentity()与glTranslatef()和glRotatef()--坐标变换

 
阅读更多

glLoadIdentity()


将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作
1.X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。
2.OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。
3.中心左面的坐标值是负值,右面是正值。
   移向屏幕顶端是正值,移向屏幕底端是负值。
   移入屏幕深处是负值,移出屏幕则是正值。

glTranslatef(x, y, z)

沿着 X, Y 和 Z 轴移动。

注意在glTranslatef(x, y, z)中,当您移动的时候,您并不是相对屏幕中心移动,而是相对与当前所在的屏幕位置。其作用就是将你绘点坐标的原点在当前原点的基础上平移一个(x,y,z)向量。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////

glLoadIdentity();         

glTranslatef(-1.5f,0.0f,-6.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f,0.0f, 0.0f);
glVertex3f(1.0f,0.0f, 0.0f);
glVertex3f(0.0f,1.0f, 0.0f);
glEnd();

glLoadIdentity();
glTranslatef(0.0f,0.0f,-6.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f,0.0f, 0.0f);
glVertex3f(1.0f,0.0f, 0.0f);
glVertex3f(0.0f,1.0f, 0.0f);
glEnd();

/////////////////////////////////////////////////////////////////////////////////////

程序的运行结果如下:

左边的三角形是第一步绘制的,可以看到该三角形绘制的坐标系,实际上是以(-1.5f,0.0f,-6.0f)为原点的。

第二个三角形绘制的时候,由于使用glLoadIdentity()使原点重新回到屏幕中心来,因此其原点位于屏幕的中心。

glRotatef(angle, x, y, z)
与glTranslatef(x, y, z)类似,glRotatef(angle, x, y, z)也是对坐标系进行操作。
旋转轴经过原点,方向为(x,y,z),旋转角度为angle,方向满足右手定则。
////////////////////////////////////////////////////////////////
glLoadIdentity();
glTranslatef(0.0f,0.0f,-6.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f,0.0f, 0.0f);
glVertex3f(1.0f,0.0f, 0.0f);
glVertex3f(0.0f,1.0f, 0.0f);
glEnd();
////////////////////////////////////////////////////////////////
在未旋转的情况下如图所示:

////////////////////////////////////////////////////////////////
glLoadIdentity();
glRotatef(45,0.0f,0.0f,1.0f);
glTranslatef(0.0f,0.0f,-6.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f,0.0f, 0.0f);
glVertex3f(1.0f,0.0f, 0.0f);
glVertex3f(0.0f,1.0f, 0.0f);
glEnd();
////////////////////////////////////////////////////////////////
绕Z轴正向旋转45度角,因为Z轴正方向由屏幕内指向屏幕外,由右手定则可知方向为逆时针转动。
由于直角顶点即为原点,因此将围绕直角逆时针旋转。

旋转和平移函数都存在的情况下,程序会如何执行呢?
只有平移的情况:
////////////////////////////////////////////////////////////////
 glLoadIdentity();         // Reset The Current Modelview Matrix
 glTranslatef(0.0f, 0.0f, -6.0f);
 glBegin(GL_QUADS);
  glVertex3f(-0.01f,-0.01f, 0.0f);
  glVertex3f( 0.01f,-0.01f, 0.0f);
  glVertex3f( 0.01f, 0.01f, 0.0f);
  glVertex3f(-0.01f, 0.01f, 0.0f);
 glEnd();
 glLoadIdentity();
// glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
 glTranslatef(1.0f,0.0f,-6.0f);
 
 glBegin(GL_TRIANGLES);
  glVertex3f(0.0f,0.0f, 0.0f);
  glVertex3f(1.0f,0.0f, 0.0f);
  glVertex3f(0.0f,1.0f, 0.0f);
 glEnd();
 
 
////////////////////////////////////////////////////////////////
加上旋转的情况:
//////////////////////////////////
glLoadIdentity();         // Reset The Current Modelview Matrix
 glTranslatef(0.0f, 0.0f, -6.0f);
 glBegin(GL_QUADS);
  glVertex3f(-0.01f,-0.01f, 0.0f);
  glVertex3f( 0.01f,-0.01f, 0.0f);
  glVertex3f( 0.01f, 0.01f, 0.0f);
  glVertex3f(-0.01f, 0.01f, 0.0f);
 glEnd();
 glLoadIdentity();
 glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
 glTranslatef(1.0f,0.0f,-6.0f);
 
 glBegin(GL_TRIANGLES);
  glVertex3f(0.0f,0.0f, 0.0f);
  glVertex3f(1.0f,0.0f, 0.0f);
  glVertex3f(0.0f,1.0f, 0.0f);
 glEnd();
 
/////////////////////////////////
如果旋转和平移语句的顺序调换一下结果会怎么样呢?
///////////////////////////
glLoadIdentity();         // Reset The Current Modelview Matrix
 glTranslatef(0.0f, 0.0f, -6.0f);
 glBegin(GL_QUADS);
  glVertex3f(-0.01f,-0.01f, 0.0f);
  glVertex3f( 0.01f,-0.01f, 0.0f);
  glVertex3f( 0.01f, 0.01f, 0.0f);
  glVertex3f(-0.01f, 0.01f, 0.0f);
 glEnd();
 glLoadIdentity();
 glTranslatef(1.0f,0.0f,-6.0f);
 glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
 
 glBegin(GL_TRIANGLES);
  glVertex3f(0.0f,0.0f, 0.0f);
  glVertex3f(1.0f,0.0f, 0.0f);
  glVertex3f(0.0f,1.0f, 0.0f);
 glEnd();
//////////////////////////
由这三个例子可知,所有对图形进行平移旋转等操作的语句的执行顺序都是从下到上执行的。
而且旋转语句的旋转中心知(0.0f, 0.0f, 0.0f)这个点。

////////////////////////////////////////////////////////////////
glLoadIdentity();
glRotatef(45,0.0f,0.0f,1.0f);
glLoadIdentity();
glTranslatef(0.0f,0.0f,-6.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f,0.0f, 0.0f);
glVertex3f(1.0f,0.0f, 0.0f);
glVertex3f(0.0f,1.0f, 0.0f);
glEnd();
////////////////////////////////////////////////////////////////
在旋转之后加了一个复位的指令,图形就不会旋转了。

0
0
分享到:
评论

相关推荐

    计算机图形学制作时钟源代码

    /*返回原坐标*/ glTranslatef(-3.0,0.0,0.0); SwapBuffers(dc.m_ps.hdc); glDrawBuffer (GL_BACK); glFlush(); } void CMFCFrame1View::OnZixuan() { // TODO: Add your command handler code here ...

    opengl 3d文字

    glLoadIdentity(); glTranslatef(.0f, .0f, -10.0f); glRotatef(rot,1.0f,0.0f,0.0f); // Rotate On The X Axis glRotatef(rot*1.5f,0.0f,1.0f,0.0f); // Rotate On The Y Axis glRotatef(rot*1.4f,0.0f,0.0f,...

    opengl的太阳系模型

    视点变换,旋转,加速减速,星空背景 太阳,光晕 各行星纹理 #include #include #include #include #include <wininet.h> #include <windows.h> #include #pragma comment(lib, "winmm.lib") #pragma ...

    vc++ MFC 三角形与矩形绘制软件

    glLoadIdentity(); // Reset The Current Modelview Matrix glTranslatef(-1.5f,0.0f,-12.0f); // Move Left 1.5 Units And Into The Screen 6.0 ***修改此处,从-6.0f改到-12.0f*** glBegin(GL_...

    OpenGL.rar_glLoadIdentity

    glLoadIdentity() glClear(GL_COLOR_BUFFER_BIT) glBegin(GL_POLYGON) glColor4f(1.0f, 0.0f, 0.0f, 1.0f) glVertex2f(100.0f, 50.0f) glColor4f(0.0f, 1.0f, 0.0f, 1.0f) glVertex2f(450.0f, 400.0f) ...

    图形学立方体旋转程序

    glRotatef(theta[2], 0.0, 0.0, 1.0); colorcube(); glFlush(); glutSwapBuffers(); } void spinCube() { /* Idle callback, spin cube 2 degrees about selected axis */ theta[axis] += 2.0; if( theta...

    opengl画图程序附带源代码

    glLoadIdentity(); // Reset The Projection Matrix // Calculate The Aspect Ratio Of The Window gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,1000.0f); glMatrixMode(GL_MODELVIEW); // Select ...

    opengl橡皮筋

    // 使用新的坐标重新绘制场景 glutPostRedisplay(); } void init(void) { glClearColor(1.0, 1.0, 1.0, 0.0); glEnable(GL_DEPTH_TEST); glShadeModel(GL_SMOOTH); makeStripeImage(); glPixelStorei(GL_...

    bresenham算法画直线

    //两坐标系重合或者说坐标原点移到窗口中心 deltax=abs(x2-x1); deltay=abs(y2-y1); f=2*deltay-deltax; x=x1; y=y1; /*draw points*/ glPointSize(4.0); glBegin(GL_POINTS); glColor3f(1.0f, 1.0f, 0.0...

    gl-idris-b:Idris的低级OpenGL绑定

    该软件包基于但为即时模式添加了OpenGL之前的调用(例如glBegin / End,glLoadIdentity等)。 与gl-idris相比,它不支持(因此也没有依赖项)PNG加载,lightyear OBJ加载,着色器初始化/加载。 Idris版本:1.2、1.3...

    opengl 期末复习资料

    5、 采用GPU编程,请说明Vertex Shader 和 Fragment Shader 的输入输出坐标系是什么? 输入输出的主要参数是什么? 如何实现Multi-Pass 渲染? 6、 在一个坐标系W中,光源的位置为 (0, 0, 200, 1.0),设模型为一个以...

    OpenGl实验报告.doc

    实验目的与要求 1、学习和掌握OpenGL的使用 2、掌握矩阵堆栈的实现方法 3、根据自己的创意实现实验内容,进一步掌握和理解OpenGL的使用 2. 实验内容 1、请编写地球围绕太阳自动旋转的方式 2、请再加上一个月亮, 并...

    基于SDI的opengl程序框架

    // 清除屏幕及深度缓存 glLoadIdentity(); // 重置视口、当前的模型观察矩阵 glTranslatef(0.5f,0.5f,1.5f); glBegin(GL_TRIANGLE_STRIP); // 绘制三角形 glColor3f(1.0f,0.0f,0.0f); //...

    用opengl绘制一个旋转正方体.cpp

    glRotatef(AngleX, 1.0f, 0.0f, 0.0f); glRotatef(AngleY, 0.0f, 1.0f, 0.0f); glBegin(GL_POLYGON); //前表面 glColor3f(1.0f,1.0f,1.0f);//颜色设置为白色 glVertex3f(50.0f, 50.0f, 50.0f); glColor3f...

    计算机图形学实验23

    一、实习的目的和意义 通过编程实现直线、圆、椭圆生成,以掌握基本图形的生成原理和算法;实现不同的线宽和线型;即线的属性。并通过计时对同一种图元的不同生成算法进行比较,从而理解OpenGL图形函数库中不同的图元...

    Android自制3D View显示组件源代码(3D Widget)

    部分源代码:   gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_... gl.glLoadIdentity(); gl.glTranslatef(0, 0, -3.0f); gl.glRotatef(mAngle, 0, 1, 0); gl.glRotatef(mAngle*0.25f, 1, 0, 0); gl.

    OPENGL初学者范例代码3

    glLoadIdentity (); /* clear the matrix */ glTranslatef (0.0, 0.0, -5.0); /* viewing transformation */ glScalef (1.0, 2.0, 1.0); /* modeling transformation */ auxWireCube(1.0); /* draw the cube */ ...

    图形学设计皮球运动动画

    动画中的皮球要用到中点画圆算法画圆, void MidCircle(int x0, int y0, int r)定义圆心的坐标和圆半径,用mLight.Ir, mLight.Ig, mLight.Ib来定义圆的颜色,glClearColor定义显示框的背景颜色,int cx=100,cy=300,...

    字体移动以及漂浮font

    // 清除屏幕和深度缓存 glLoadIdentity(); // 重置当前的模型观察矩阵 /***********************************新添的代码******************************************************************************...

    openGL程序

    glTranslatef(0.0f,-0.3f,-4.0f); if(xRot>360.5f) { xRot=0.0f; } if(yRot>360.5f) { yRot=0.0f; } glBotatef(xROt,1.0f,0.0f,0.0f); glRotatef(yRot,0.0f,1.0f,0.0f); xRot+=0.5f; ...

Global site tag (gtag.js) - Google Analytics