OpenGL 函数 gluLookAt

合集下载

开发基于OpenGL的应用程序,必须先了解OpenGL的库函数

开发基于OpenGL的应用程序,必须先了解OpenGL的库函数

开发基于OpenGL的应用程序,必须先了解OpenGL的库函数。

它采用C语言风格,提供大量的函数来进行图形的处理和显示。

OpenGL库函数的命名方式非常有规律。

所有OpenGL函数采用了以下格式:<库前缀><根命令><可选的参数个数><可选的参数类型>库前缀有gl、glu、aux、glut、wgl、glx、agl等等,分别表示该函数属于OpenGL那个开发库,从函数名后面中还可以看出需要多少个参数以及参数的类型。

I代表int型,f代表float型,d代表double型,u代表无符号整型。

例如glVertex3fv()表示了该函数属于gl库,参数是三个float型参数指针。

我们用glVertex*()来表示这一类函数。

OpenGL函数库相关的API有核心库(gl)、实用库(glu)、辅助库(aux)、实用工具库(glut)、窗口库(glx、agl、wgl)和扩展函数库等。

从图可以看出,gl是核心,glu是对gl的部分封装。

glx、agl、wgl 是针对不同窗口系统的函数。

glut是为跨平台的OpenGL程序的工具包,比aux功能强大。

扩展函数库是硬件厂商为实现硬件更新利用OpenGL的扩展机制开发的函数。

下面逐一对这些库进行详细介绍。

1.OpenGL核心库核心库包含有115个函数,函数名的前缀为gl。

这部分函数用于常规的、核心的图形处理。

此函数由gl.dll来负责解释执行。

由于许多函数可以接收不同数以下几类。

据类型的参数,因此派生出来的函数原形多达300多个。

核心库中的函数主要可以分为以下几类函数:∙绘制基本几何图元的函数:glBegain()、glEnd()、glNormal*()、glVertex*();∙矩阵操作、几何变换和投影变换的函数:如矩阵入栈函数glPushMatrix(),矩阵出栈函数glPopMatrix(),装载矩阵函数glLoadMatrix(),矩阵相乘函数glMultMatrix(),当前矩阵函数glMatrixMode()和矩阵标准化函数glLoadIdentity(),几何变换函数glTranslate*()、glRotate*()和glScale*(),投影变换函数glOrtho()、glFrustum()和视口变换函数glViewport();∙颜色、光照和材质的函数:如设置颜色模式函数glColor*()、glIndex*(),设置光照效果的函数glLight*() 、glLightModel*()和设置材质效果函数glMaterial();∙显示列表函数:主要有创建、结束、生成、删除和调用显示列表的函数glNewList()、glEndList()、glGenLists()、glCallList()和glDeleteLists();∙纹理映射函数:主要有一维纹理函数glTexImage1D()、二维纹理函数glTexImage2D()、设置纹理参数、纹理环境和纹理坐标的函数glTexParameter*()、glTexEnv*()和glTetCoord*();∙特殊效果函数:融合函数glBlendFunc()、反走样函数glHint()和雾化效果glFog*();∙光栅化、象素操作函数:如象素位置glRasterPos*()、线型宽度glLineWidth()、多边形绘制模式glPolygonMode(),读取象素glReadPixel()、复制象素glCopyPixel();∙选择与反馈函数:主要有渲染模式glRenderMode()、选择缓冲区glSelectBuffer()和反馈缓冲区glFeedbackBuffer();∙曲线与曲面的绘制函数:生成曲线或曲面的函数glMap*()、glMapGrid*(),求值器的函数glEvalCoord*() glEvalMesh*();∙状态设置与查询函数:glGet*()、glEnable()、glGetError()。

glulookat参数对应的坐标变换

glulookat参数对应的坐标变换

glulookat参数对应的坐标变换glulookat参数对应的坐标变换为标题一、引言坐标变换在计算机图形学中起着至关重要的作用。

而glulookat函数是OpenGL中用于进行视点变换的函数之一,它通过调整视点位置、观察点位置和上方向向量来实现视图的变换。

本文将详细介绍glulookat函数的参数对应的坐标变换,以便读者更好地理解和应用该函数。

二、视点变换视点变换是指从一个位置观察场景,根据视点的位置和朝向来决定我们所看到的图像。

glulookat函数通过调整视点的位置来实现视点变换。

其函数原型如下:void glulookat(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz);其中,eyex、eyey和eyez分别表示视点的x、y、z坐标;centerx、centery和centerz分别表示观察点的x、y、z坐标;upx、upy和upz分别表示相机上方向的x、y、z分量。

三、视点位置变换1. 视点位置的x坐标变换当我们调整视点位置的x坐标eyex时,可以改变视点在世界坐标系中的水平位置。

如果将eyex的值增加,那么视点位置将向右移动;反之,如果将eyex的值减小,视点位置将向左移动。

2. 视点位置的y坐标变换当我们调整视点位置的y坐标eyey时,可以改变视点在世界坐标系中的垂直位置。

如果将eyey的值增加,那么视点位置将向上移动;反之,如果将eyey的值减小,视点位置将向下移动。

3. 视点位置的z坐标变换当我们调整视点位置的z坐标eyez时,可以改变视点在世界坐标系中的深度位置。

如果将eyez的值增加,那么视点位置将向远离观察点的方向移动;反之,如果将eyez的值减小,视点位置将向靠近观察点的方向移动。

gluLookAt理解

gluLookAt理解

1,在OPENGL中,视图变换是指保持模型坐标不变情况下,从不同的方位观察模型,常用的函数为glLookAt。

2,在OPENGL中,如果想要移动、缩放、旋转模型,则使用模型变换。

模型变换使用的函数有:glTranslatef 平移glRotatef 旋转glScalef 缩放3,glLoadIdentity是一个特殊,它既将模型世界坐标恢复,又将视野也恢复到(0,0,0),朝向是-z,方向向上下面的一段摘自百度百科:视点转换函数原型void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdoublecenterx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);该函数定义一个视图矩阵,并与当前矩阵相乘。

第一组eyex, eyey,eyez 相机在世界坐标的位置第二组centerx,centery,centerz 相机镜头对准的物体在世界坐标的位置第三组upx,upy,upz 相机向上的方向在世界坐标中的方向你把相机想象成为你自己的脑袋:第一组数据就是脑袋的位置第二组数据就是眼睛看的物体的位置第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体)。

[cpp]view plaincopy1.#include "stdafx.h"2.#include <GL/glut.h>3.#include <stdlib.h>4.5.void init(void)6.{7. glClearColor (0.0, 0.0, 0.0, 0.0); //背景黑色8.}9.10.void display(void)11.{12. glClear (GL_COLOR_BUFFER_BIT);13. glColor3f (1.0, 1.0, 1.0); //画笔白色14.15. glLoadIdentity(); //加载单位矩阵16.17. gluLookAt(0.0,0.0,5.0, 0.0,0.0,0.0, 0.0,1.0,0.0);18. glutWireTeapot(2);19. glutSwapBuffers();20.}21.22.void reshape (int w, int h)23.{24. glViewport (0, 0, (GLsizei) w, (GLsizei) h);25. glMatrixMode (GL_PROJECTION);26. glLoadIdentity ();27. gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);28. glMatrixMode(GL_MODELVIEW);29. glLoadIdentity();30. gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);31.}32.int main(int argc, char** argv)33.{34. glutInit(&argc, argv);35. glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);36. glutInitWindowSize (500, 500);37. glutInitWindowPosition (100, 100);38. glutCreateWindow (argv[0]);39. init ();40. glutDisplayFunc(display);41. glutReshapeFunc(reshape);42. glutMainLoop();43.return 0;44.}一、上面的display()函数中:gluLookAt(0.0,0.0,5.0, 0.0,0.0,0.0, 0.0,1.0,0.0); 相当于我们的脑袋位置在(0.0,0.0,5.0)处,眼睛望向(0.0,0.0,0.0),即原点。

glulookat函数

glulookat函数

OpenGL学习脚印: 关于gluLookAt函数的理解写在前面本节借助gluLookAt函数,推导世界坐标转换到照相机坐标的一种方法,重点在于理解UVN相机坐标系,以及变换矩阵的推导。

限于笔者水平,如果错误请纠正我。

gluLookAt函数提供给用户完成模式变换(model-view transformation)中,在将模型坐标系转换都世界坐标系后,进行世界坐标系到照相机坐标系的转换。

实际上,照相机的定位也是在世界坐标系下定义的,这里的转换,可以理解为: 从照相机的角度解释世界坐标系中物体的坐标。

通过构造一个UVN坐标系来简化这一转换。

先直观感受下UVN,UVN坐标系中的照相机模型如下图所示:借助下图正式定义UVN相机坐标系:与UVN相关的概念包括:∙相机位置,或者叫做视点(eyepoint): 观察参考点(View Reference Point)∙相机镜头方向,通过观察平面的法向量指定: 观察平面法向量VPN (View Plane Normal)∙相机顶部正朝向:VUV (View Up Vector)形象的表达为:gluLookAt函数原型为:[cpp]view plaincopyprint?1.void gluLookAt(GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ,2.3.GLdoublecenterX, GLdouble centerY, GLdouble centerZ,4.5.GLdouble upX, GLdouble upY, GLdouble upZ);官网关于此函数的描述:gluLookAt 通过指定一个视点、表面场景中心的参考点以及up 向量来构造一个视变换矩阵。

这个矩阵将代表场景中心的参考点映射到-Z轴,视点映射成为原点。

当使用一个特定的投影矩阵时,场景的中心就映射到视口的中心。

类似地,由up向量描述的方向投影到投影平面成为+y轴,这样它在视口中向上指向。

gluLookAt理解

gluLookAt理解

gluLookAt理解1,在OPENGL中,视图变换是指保持模型坐标不变情况下,从不同的⽅位观察模型,常⽤的函数为glLookAt。

2,在OPENGL中,如果想要移动、缩放、旋转模型,则使⽤模型变换。

模型变换使⽤的函数有:glTranslatef 平移glRotatef 旋转glScalef 缩放3,glLoadIdentity是⼀个特殊,它既将模型世界坐标恢复,⼜将视野也恢复到(0,0,0),朝向是-z,⽅向向上下⾯的⼀段摘⾃百度百科:视点转换函数原型void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdoublecenterx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);该函数定义⼀个视图矩阵,并与当前矩阵相乘。

第⼀组eyex, eyey,eyez 相机在世界坐标的位置第⼆组centerx,centery,centerz 相机镜头对准的物体在世界坐标的位置第三组upx,upy,upz 相机向上的⽅向在世界坐标中的⽅向你把相机想象成为你⾃⼰的脑袋:第⼀组数据就是脑袋的位置第⼆组数据就是眼睛看的物体的位置第三组就是头顶朝向的⽅向(因为你可以歪着头看同⼀个物体)。

[cpp]view plaincopy1.#include "stdafx.h"2.#include3.#include4.5.void init(void)6.{7. glClearColor (0.0, 0.0, 0.0, 0.0); //背景⿊⾊8.}9.10.void display(void)11.{12. glClear (GL_COLOR_BUFFER_BIT);13. glColor3f (1.0, 1.0, 1.0); //画笔⽩⾊14.15. glLoadIdentity(); //加载单位矩阵16.17. gluLookAt(0.0,0.0,5.0, 0.0,0.0,0.0, 0.0,1.0,0.0);18. glutWireTeapot(2);19. glutSwapBuffers();20.}21.22.void reshape (int w, int h)23.{24. glViewport (0, 0, (GLsizei) w, (GLsizei) h);25. glMatrixMode (GL_PROJECTION);26. glLoadIdentity ();27. gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);28. glMatrixMode(GL_MODELVIEW);29. glLoadIdentity();30. gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);31.}32.int main(int argc, char** argv)33.{34. glutInit(&argc, argv);35. glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);36. glutInitWindowSize (500, 500);37. glutInitWindowPosition (100, 100);38. glutCreateWindow (argv[0]);39. init ();40. glutDisplayFunc(display);41. glutReshapeFunc(reshape);42. glutMainLoop();43.return 0;44.}⼀、上⾯的display()函数中:gluLookAt(0.0,0.0,5.0, 0.0,0.0,0.0, 0.0,1.0,0.0); 相当于我们的脑袋位置在(0.0,0.0,5.0)处,眼睛望向(0.0,0.0,0.0),即原点。

第四章OpenGL图形变换-gluLookAt用法

第四章OpenGL图形变换-gluLookAt用法

gluLookAt 的用法1、设置视点(设置相机位置及形态) 视点设置相当于把相机放到一定的位置上,镜头对准场景。

如图1所示。

图1 视点变换与相机定位在OpenGL 中,默认情况下,设置视点(视点变换)相当于把相机放到世界坐标系的原点(0,0,0),相机水平,镜头指向Z 轴的负方向,相当于从世界坐标系的原点向屏幕内部的虚拟场景观察。

2、选择视景体方式一:通过函数glFrustum()指定,如图2所示。

图2 glFrustum 生成的透视投影体YXZ Y YXZ观察方向方式二:通过函数gluPerspective 指定视景体,如图3所示。

图4-7 平行投影模型图图3 gluPerspective 生成的透视投影体YXZ Y3、移动景物(已实现)(借助于glTranslate 、glRotate 、glScale 等)移动前:图4 移动前物体移动后:图5 移动后物体(模型变换)XYX观察方向4、移动视点(移动相机)此处是我们要实现的功能。

用到的函数是:gluLookAt.函数原型:gluLookAt(GLdouble eyex, GLdouble eyey, Ldouble eyez,GLdouble centerx , GLdouble centery ,GLdouble centerz ,GLdouble upx , GLdouble upy ,GLdouble centerz );图6 gluLookAt示意图移动视点,就是调整相机的位置和形态,然后在新位置和方向处选择视景体,如下图所示。

图7 任意位置和形态的相机原始(默认)的相机位置可用如下语句来表述:gluLookAt(0, 0 , 0 ,0 , 0 , -1 ,0 , 1 ,0);简单的做法是:(1(2)在与Z轴负向平行的方向上选择观察中心点;也就是相机与观察中心点的连线形成的向量与X轴正向夹角为90度。

(3)移动相机假定此时,相机的位置为(eyex , eyey , eyez), 观察中心点的位置为(centerx , centery , centerz),R与X轴的夹角为90度。

opengl归一化后处理

opengl归一化后处理

opengl归一化后处理(原创实用版)目录1.OpenGL 简介2.什么是归一化处理3.OpenGL 中的归一化处理方法4.归一化处理的作用5.归一化处理的实例正文1.OpenGL 简介OpenGL(Open Graphics Library)是一个跨平台的图形编程接口,用于创建二维和三维图形。

它被广泛应用于计算机图形学、游戏开发、虚拟现实等领域。

OpenGL 提供了丰富的功能,可以实现各种复杂的图形效果。

2.什么是归一化处理归一化处理是一种将图形坐标从一种坐标系转换到另一种坐标系的过程。

在计算机图形学中,归一化处理通常用于将图形坐标从屏幕坐标转换到裁剪空间坐标,或者从裁剪空间坐标转换到屏幕坐标。

归一化处理的目的是消除坐标系的不一致,以便更好地进行图形渲染。

3.OpenGL 中的归一化处理方法在 OpenGL 中,归一化处理主要通过 gluOrtho2D、gluPerspective2D 和 gluLookAt 等函数实现。

这些函数可以对坐标进行平移、缩放、旋转等操作,从而实现归一化处理。

(1)gluOrtho2D:该函数用于将坐标从屏幕坐标转换到裁剪空间坐标。

它通过设置裁剪矩阵来实现坐标的归一化处理。

(2)gluPerspective2D:该函数用于将坐标从屏幕坐标转换到透视空间坐标。

它通过设置透视矩阵来实现坐标的归一化处理。

(3)gluLookAt:该函数用于设置相机的位置和朝向,从而实现坐标的归一化处理。

4.归一化处理的作用归一化处理在计算机图形学中具有重要作用,它可以消除不同坐标系之间的不一致,使得图形渲染更加准确和流畅。

归一化处理可以实现以下功能:(1)将图形坐标从屏幕坐标转换到裁剪空间坐标,以便进行裁剪和透视处理。

(2)将图形坐标从裁剪空间坐标转换到屏幕坐标,以便进行屏幕显示。

(3)消除图形坐标系的不一致,提高图形渲染的准确性。

5.归一化处理的实例假设我们要渲染一个正方形,首先需要将其从屏幕坐标转换到裁剪空间坐标,然后进行裁剪和透视处理。

OpenGL函数简介

OpenGL函数简介

附录A OpenGL函数简介OpenGL是国际公认的在计算机中使用广泛、易学易用的三维图形标准,附录A给出了本教材所用OpenGL函数的简单说明(/documentation/manual/),供读者查询使用。

1.glAccumvoid glAccum ( GLenum op , GLfloat value );参数说明:op 取符号:GL_ACCUM,GL_LOAD,GL_ADD,GL_MULT,GL_RETURN。

value 取一个浮点数,op决定怎样使用value。

功能描述:按参数op指定的方式,在累积缓冲区中进行如下操作GL_ACCUM 从当前选定的缓冲区(缺省值为当前的颜色缓冲区)中逐点读取其R、G、B、A值,该RGBA乘以value加上累积缓冲区中的当前值后,再存入累积缓冲区中保存。

GL_LOAD 从当前选定的缓冲区中逐点读取其R、G、B、A值,该RGBA乘以value 后,再存入累积缓冲区中保存。

GL_ADD 将value直接加到累积缓冲区中每点的RGBA上。

GL_MULT 略。

GL_RETURN 将累积缓冲区中的RGBA乘以value后,送当前颜色缓冲区中显示。

2.glBegin, glEndvoid glBegin ( GLenum mode );参数说明:mode 取符号:GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS,GL_QUAD_STRIP和 GL_POLYGON。

void glEnd (void );功能描述:函数glBegin, glEnd成对出现,用来界定一个或一组类似图形元素顶点数据的开始与结束,图形元素的类型由mode确定。

GL_POINTS 每个顶点函数glVertex()描述了一个个孤立的顶点数据。

OpenGL 球面相机旋转算法

OpenGL 球面相机旋转算法

旋转作为三维开发的基本功能,在任何3D程序中都需要。

用户通过旋转来实现对模型各个面的浏览,形成直观印象。

球面相机旋转这种旋转方式用户体验方式要优于x轴y轴混合旋转方式,模型旋转的方向和鼠标移动方向保持一致。

下面给出一种“球面相机”实现旋转的方法。

原理:移动鼠标时,通过gluLookAt来改变视点的位置(采用增量的方式),而模型保持不动。

即:只进行视点变换,不进行模型变换。

下图是用户按下左键,在屏幕上移动的一段距离(从A移动到B)。

由于屏幕坐标y轴向下,为了与投影平面坐标系(传统笛卡尔坐标)保持一致。

AM = y1-y2; /*将消息代码描述*/BM = x2-x1;建立屏幕和投影变换近裁截面之间的对应关系(如下图)。

代码实现:1 void setSphereCameraPos()2 {3 // 左键未按下,直接返回4 if (!is_left_button_down)5 return;67 // 从聚焦点指向视点的向量 OA向量8 vector3dd a(eye-target);910 // 计算球面相机半径11 radius = a.getLength();1213 // 将其单位化14 a.normailize();1516 // 当前相机向上方向与a做叉乘,计算投影面水平向右方向向量u17 vector3dd u = upvector.crossProduct(a);18 // 将其单位化19 u.normailize();2021 // 计算相机向上方向在投影面上的投影向量即垂直向上的方向向量v22 vector3dd v = a.crossProduct(u);23 // 将其单位化24 v.normailize();2526 // 计算屏幕AB在投影面上对应的向量 AB向量27 vector3dd m = u*delta_point.x + v*delta_point.y;2829 // 计算m向量的长度30 double len = m.getLength();31 // 降低灵敏度32 len /= 20.0;3334 if (len>0.0)35 {36 // 角度AOB 弧度表示弧长/半径37 double x = len/radius;38 // 将AB向量单位化39 m.normailize();4041 // 按相反方向转动视点到C 从而使得按与鼠标移动一致的方向转动模型42 x = -1*x;43 // 计算新的相机位置 C44 eye = target+(a*cos(x) + m*sin(x))*radius;4546 // 计算新的相机向上方向47 upvector = v;48 }49 }消息代码1 LRESULT CALLBACK WndProc( HWND hWnd, // Handle For This Window2 UINT uMsg,// Message For This Window3 WPARAM wParam,// Additional Message Information4 LPARAM lParam)// Additional Message Information5 {6 switch(uMsg) // Check For Windows Messages7 {8 case WM_LBUTTONDOWN:9 {10 is_left_button_down = true;11 pre_point.x = LOWORD(lParam);12 pre_point.y = HIWORD(lParam);1314 return 0;15 }1617 case WM_MOUSEMOVE:18 {19 if (is_left_button_down)20 {21 cur_pt.x = LOWORD(lParam);22 cur_pt.y = HIWORD(lParam);// delta_point为增量点23 delta_point.x= cur_pt.x-pre_point.x);// 保持屏幕坐标系和投影平面坐标系一致24 delta_point.y =-1*(cur_pt.y-pre_point.y);// 将当前点赋值给前一个点25 pre_point = cur_pt;26// 计算相机新的位置27 setSphereCameraPos();28 }30 return 0;31 }3233 case WM_LBUTTONUP:34 {35 is_left_button_down = false;36 return 0;37 }38 }3940 // Pass All Unhandled Messages To DefWindowProc41 return DefWindowProc(hWnd,uMsg,wParam,lParam);42 }43vector3dd类vector3dd1 class vector3dd2 {3 private:4 double x,y,z;56 public:7 vector3dd(){};8 vector3dd(double a, double b, double c){x=a;y=b;z=c;}9 vector3dd(const vector3dd& v){*this=v;}11 public:12 void operator=(const vector3dd& v){x=v.x;y=v.y;z=v.z;}13 vector3dd operator*(double a)14 {15 return vector3dd(a*x,a*y,a*z);16 }17 vector3dd operator+(const vector3dd& v)18 {19 return vector3dd(x+v.x,y+v.y,z+v.z);20 }21 vector3dd operator-(const vector3dd& v)22 {23 return vector3dd(x-v.x,y-v.y,z-v.z);24 }2526 public:27 double getX(){return x;}28 double getY(){return y;}29 double getZ(){return z;}3031 void setValue(double a, double b, double c)32 {33 x = a;34 y = b;35 z = c;36 }3738 double getLength()39 {40 return sqrt(x*x+y*y+z*z);41 }4243 void normailize()44 {45 double length = getLength();46 x/=length;47 y/=length;48 z/=length;49 }5051 void invert()52 {53 x*=-1;54 y*=-1;55 z*=-1;56 }5758 vector3dd crossProduct(const vector3dd& v)59 {60 return vector3dd(y*v.z-z*v.y,z*v.x-x*v.z,x*v.y-y*v.x);61 }6263 double dotProduct(const vector3dd& v)64 {65 return (x*v.x+y*v.y+z*v.z);66 }6768 void traceMsg()69 {70 fprintf(stdout, "%.7f, %.7f, %.7f\n", x, y, z);71 }72 };效果图:。

OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理

OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理

OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理单位矩阵对角线上都是1,其余元素皆为0的矩阵。

在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,我们称这种矩阵为单位矩阵.它是个方阵,除左上角到右下角的对角线(称为主对角线)上的元素均为1以外全都为0.OpenGL中的坐标用齐次坐标表示,即(x,y,z)表示成(x',y',z',h),其中x=x'/h; y=y'/h; z=z'/h. 通常h取1. 比如空间中的点(2,3,4),在OpenGL中将表示成(2,3,4,1). 齐次坐标表示方式适合于矩阵运算,也很方便地表示了无穷远的点,比如(1,0,0,0)就表示x轴上无穷远的点,因为1/0是无穷大,这里约定0 /0=0.接着要说点矩阵(线性代数)的知识。

OpenGL里面的平移、旋转、缩放等变换均是线性变换,用矩阵相乘来表示。

以平移变换为例,请见官方对glTranslatef函数的说明。

假设有点(3,3,3),如果把该点沿x 轴移动2单位,沿y轴移动3单位,沿z轴移动4单位,那么该点会是(3+2, 3+3, 4+4) = (5,6,7). 用矩阵表示是:左边的矩阵称为平移变换矩阵,若把2、3、4换成x、y、z,则用它乘以一个齐次坐标表示的向量,就可以将该向量平移(x,y,z). 旋转变换和缩放变换都像平移变换一样可用一个矩阵来表示。

这里可以不用理会这些矩阵长什么样,只需清楚它们乘以一个齐次坐标表示的向量,就可以使该向量发生需要的变换。

把平移变换矩阵记为T(x,y,z),旋转变换矩阵记为R(x,y,z,s),表示绕向量(x,y,z)旋转s角度;把向量记为X。

这里只需要知道它们是矩阵就行了,现在要把一个点X,如(3,3,3,1),移动(2,2,2)单位,再绕y轴旋转30度角,用矩阵表示即 R(0,1,0,30)*T(2,2,2)*X,可以理解为离X 最近的矩阵最先作用。

glulookat函数

glulookat函数

OpenGL学习脚印: 关于gluLookAt函数的理解写在前面本节借助gluLookAt函数,推导世界坐标转换到照相机坐标的一种方法,重点在于理解UVN相机坐标系,以及变换矩阵的推导。

限于笔者水平,如果错误请纠正我。

gluLookAt函数提供给用户完成模式变换(model-view transformation)中,在将模型坐标系转换都世界坐标系后,进行世界坐标系到照相机坐标系的转换。

实际上,照相机的定位也是在世界坐标系下定义的,这里的转换,可以理解为: 从照相机的角度解释世界坐标系中物体的坐标。

通过构造一个UVN坐标系来简化这一转换。

先直观感受下UVN,UVN坐标系中的照相机模型如下图所示:借助下图正式定义UVN相机坐标系:与UVN相关的概念包括:∙相机位置,或者叫做视点(eyepoint): 观察参考点(View Reference Point)∙相机镜头方向,通过观察平面的法向量指定: 观察平面法向量VPN (View Plane Normal)∙相机顶部正朝向:VUV (View Up V ector)形象的表达为:gluLookAt函数原型为:[cpp]view plaincopyprint?1.void gluLookAt(GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ,2.3. GLdouble centerX, GLdouble centerY, GLdouble centerZ,4.5. GLdouble upX, GLdouble upY, GLdouble upZ);官网关于此函数的描述:gluLookAt 通过指定一个视点、表面场景中心的参考点以及up 向量来构造一个视变换矩阵。

这个矩阵将代表场景中心的参考点映射到-Z轴,视点映射成为原点。

当使用一个特定的投影矩阵时,场景的中心就映射到视口的中心。

类似地,由up向量描述的方向投影到投影平面成为+y轴,这样它在视口中向上指向。

OpenGL参考函数

OpenGL参考函数

OpenGL参考函数1.1 颜色使用1. glShadeModel:选择平面明暗模式或光滑明暗模式C语言描述void glShadeModel( GLenum mode )参数mode 指定表示明暗模式的符号值,可以选择GL_FLAT(平面明暗模式)和GL_SMOOTH(光滑明暗模式),缺省值为GL_SMOOTH。

说明OpenGL图元需要进行明暗处理,处理得模式可以为平面明暗模式或光滑(Gouraud着色)明暗模式。

光滑明暗模式时,多边形各个内部点的颜色是根据各顶点指定的颜色来插值得到的,这意味着两个顶点之间的颜色是从一顶点的颜色渐变到另一顶点的颜色。

对于平面明暗模式,整个图元区域的颜色就是最后一个顶点指定的颜色,唯一例外的是GL_POLYGON,这是整个区域的颜色是第一个顶点所指定的颜色。

但要注意,如果激活了光照,计算到的顶点颜色都是光照后的结果颜色,若光照关闭,计算到的颜色就是指定顶点时的当前颜色。

2. glColor:设置当前颜色C语言描述void glcolor3b(GLbyte red,GLbyte green,GLbyte blue);void glcolor3d(GLdouble red,GLdouble green,GLdouble blue);void glcolor3f(GLfloat red,GLfloat green,GLfloat blue);void glcolor3i(GLint red,GLint green,GLint blue);void glcolor3s(GLshort red,GLshort green,GLshort blue);void glcolor3ub(GLubyte red,GLubyte green,GLubyte blue);void glcolor3ui(GLuint red,GLuint green,GLuint blue);void glcolor3us(GLushort red,GLushort green,GLushort blue);void glcolor4b(GLbyte red,GLbyte green,GLbyte blue,GLbyte alpha);void glcolor4d(GLdouble red,GLdouble green,GLdouble blue,GLdouble alpha);void glcolor4f(GLfloat red,GLfloat green,GLfloat blue,GLfloat alpha);void glcolor4i(GLint red,GLint green,GLint blue,GLint alpha);void glcolor4s(GLshort red,GLshort green,GLshort blue,GLshort alpha);void glcolor4ub(GLubyte red,GLubyte green,GLubyte blue,GLubyte alpha);void glcolor4ui(GLuint red,GLuint green,GLuint blue,GLuint alpha);void glcolor4us(GLushort red,GLushort green,GLushort blue,GLushort alpha);void glcolor3bv(const GLbyte *v);void glcolor3dv(const GLdouble *v);void glcolor3fv(const GLfloat *v);void glcolor3iv(const GLint *v);void glcolor3sv(const GLshort *v);void glcolor3ubv(const GLubyte *v);void glcolor3uiv(const GLuint *v);59void glcolor3usv(const GLushort *v);void glcolor4bv(const GLbyte *v);void glcolor4dv(const GLdouble *v);void glcolor4fv(const GLfloat *v);void glcolor4iv(const GLint *v);void glcolor4sv(const GLshort *v);void glcolor4ubv(const GLubyte *v);void glcolor4uiv(const GLuint *v);void glcolor4usv(const GLushort *v);参数red,green, blue 指定当前颜色中的红、绿和蓝色成分。

计算机图形学OpenGL版实验5-8

计算机图形学OpenGL版实验5-8

实验5 OpenGL模型视图变换一、实验目的:理解掌握OpenGL程序的模型视图变换。

二、实验内容:(1)阅读实验原理,运行示范实验代码,理解掌握OpenGL程序的模型视图变换;(2)根据示范代码,尝试完成实验作业;三、实验原理:在代码中,视图变换必须出现在模型变换之前,但可以在绘图之前的任何时候执行投影变换和视口变换。

1.display()程序中绘图函数潜在的重复性强调了:在指定的视图变换之前,应该使用glLoadIdentity()函数把当前矩阵设置为单位矩阵。

2.在载入单位矩阵之后,使用gluLookAt()函数指定视图变换。

如果程序没有调用gluLookAt(),那么照相机会设定为一个默认的位置和方向。

在默认的情况下,照相机位于原点,指向Z轴负方向,朝上向量为(0,1,0)。

3.一般而言,display()函数包括:视图变换 + 模型变换 + 绘制图形的函数(如glutWireCube())。

display()会在窗口被移动或者原来先遮住这个窗口的东西被一开时,被重复调用,并经过适当变换,保证绘制的图形是按照希望的方式进行绘制。

4.在调用glFrustum()设置投影变换之前,在reshape()函数中有一些准备工作:视口变换 + 投影变换 + 模型视图变换。

由于投影变换,视口变换共同决定了场景是如何映射到计算机的屏幕上的,而且它们都与屏幕的宽度,高度密切相关,因此应该放在reshape()中。

reshape()会在窗口初次创建,移动或改变时被调用。

OpenGL中矩阵坐标之间的关系:物理坐标*模型视图矩阵*投影矩阵*透视除法*规范化设备坐标——〉窗口坐标(1)视图变换函数gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0,)设置照相机的位置。

把照相机放在(0,0,5),镜头瞄准(0,0,0),朝上向量定为(0,1,0)朝上向量为照相机指定了一个唯一的方向。

qt qopenglwidget 原理

qt qopenglwidget 原理

qt qopenglwidget 原理Qt是一个跨平台的应用程序开发框架,其中包含了丰富的库和工具,可用于开发各种类型的应用程序。

QOpenGLWidget是Qt中的一个重要组件,用于在Qt界面中显示OpenGL图形。

本文将介绍QOpenGLWidget的原理和使用方法。

QOpenGLWidget是Qt中对OpenGL功能的封装,它继承自QWidget类,提供了一个用于显示OpenGL图形的窗口部件。

在QOpenGLWidget中,开发者可以使用OpenGL的API绘制三维图形、实现图形动画等功能。

QOpenGLWidget的原理是通过将OpenGL的上下文与Qt的窗口系统集成,实现OpenGL图形的显示。

在使用QOpenGLWidget时,首先需要在项目中引入相应的头文件,并在类中继承QOpenGLWidget类。

然后,需要重写QOpenGLWidget的几个重要函数,包括initializeGL、resizeGL 和paintGL。

initializeGL函数用于初始化OpenGL的状态,包括设置清屏颜色、启用深度测试等。

在该函数中,可以进行一些OpenGL的初始化工作。

resizeGL函数用于处理窗口尺寸变化时的操作。

在该函数中,可以根据窗口的新尺寸重新设置OpenGL的视口,以保证图形的正确显示。

paintGL函数是QOpenGLWidget最重要的函数之一,它用于绘制OpenGL图形。

在该函数中,可以使用OpenGL的API进行绘制操作,例如绘制三角形、正方体等。

在绘制完成后,需要调用QOpenGLWidget的swapBuffers函数将绘制结果显示在窗口上。

除了上述三个函数,QOpenGLWidget还提供了一些其他的函数和信号槽,用于处理其他的操作,如鼠标事件、键盘事件等。

使用QOpenGLWidget时,需要注意一些细节。

首先,需要在项目的.pro文件中添加相应的模块,如QT += opengl。

glfinish() 函数作用 简书

glfinish() 函数作用 简书

glfinish() 函数作用简书GLFinish() 函数在OpenGL编程中是一个非常强大的工具,它可以被用来优化代码并提高性能。

本文将探讨GLFinish()函数的作用、用法和优化技巧。

一、GLFinish()函数概述GLFinish()是OpenGL框架中的一个函数,用于完成渲染或者绘图的最后一个操作。

它会阻塞当前线程,强制开辟一个新的独立线程,然后在新线程结束后返回。

在这个过程中,OpenGL系统会完成最后一个渲染或者绘制操作,然后在主线程中返回通知程序。

二、GLFinish()函数的作用GLFinish()函数的作用在于保证当前执行的命令在OpenGL渲染之前被执行完毕,这样可以确保OpenGL在渲染时不会遇到阻塞问题,从而提高OpenGL执行的效率和稳定性。

1、保证OpenGL的渲染执行顺序由于OpenGL的执行顺序是异步的,如果应用程序在OpenGL渲染尚未完成时返回到主线程,可能会导致渲染的中止、绘制的错误等问题。

为了保证OpenGL的正常执行,可以使用GLFinish()函数,等待正在执行的操作完成后,再开始下一个绘制。

2、减少OpenGL的渲染时间OpenGL中的图形渲染是一个非常重要的过程,而GLFinish()函数正是可以帮助我们缩短OpenGL的渲染时间。

通过使用GLFinish()函数,在OpenGL的渲染开始前,我们可以使CPU停止所有其他的活动,让系统专心处理OpenGL渲染。

这样可以使OpenGL在渲染过程中不受到其他程序的干扰,提高渲染的效率和稳定性。

三、GLFinish()函数的用法和优化技巧1、GLFinish()函数的调用位置GLFinish()函数的调用位置非常重要,如果在错误的位置调用GLFinish()函数,会导致渲染的效率变得非常低。

因此,在调用GLFinish()函数之前,需要先知道当前的OpenGL渲染操作是否已经完成,再决定是否调用GLFinish()函数。

glgenobject参数

glgenobject参数

glgenobject参数glGenObject参数是OpenGL中的一个函数,它用于生成一个或多个OpenGL对象的名称。

这些对象可以是缓冲区对象、纹理对象、帧缓冲对象、渲染缓冲对象等。

在OpenGL中,对象名称是一个无符号整数,它唯一标识了一个对象。

glGenObject函数的原型如下:void glGenObject(int n, uint *objects);其中,n表示要生成的对象数量,objects是一个指向无符号整数数组的指针,用于存储生成的对象名称。

glGenObject函数的作用是生成一个或多个OpenGL对象的名称。

这些对象名称可以用于创建对象,并在需要时进行绑定、修改、查询等操作。

例如,可以使用glGenObject函数生成一个纹理对象的名称,然后使用glBindTexture函数将该纹理对象绑定到当前的纹理单元上,再使用glTexImage2D函数将图像数据加载到该纹理对象中。

glGenObject函数的返回值是void,因此无法直接获取生成的对象名称。

但是,可以通过objects参数获取生成的对象名称。

例如,如果要生成一个纹理对象的名称,可以定义一个无符号整数变量,然后将其地址传递给glGenObject函数,如下所示:uint texture;glGenObject(1, &texture);这样,glGenObject函数就会生成一个纹理对象的名称,并将其存储在texture变量中。

需要注意的是,glGenObject函数只是生成对象名称,而不会创建对象。

要创建对象,需要使用相应的函数,例如glGenBuffers、glGenTextures等。

此外,生成的对象名称是唯一的,不能重复使用。

如果需要删除对象,可以使用glDeleteObject函数将其从OpenGL 中删除。

glGenObject函数是OpenGL中非常重要的一个函数,它可以生成各种类型的OpenGL对象的名称,为后续的对象创建、绑定、修改、查询等操作提供了便利。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

OpenGL 函数gluLookAt()glScalef() glTranslatef()glRotatef() glFrustum()glPerspective() 的使用1.gluLookAt()——视图变换函数把自己的眼睛当成是照相机,前三个参数表示眼睛的坐标,中间三个参数表示要拍照的物体的中心位置,可以理解成焦点吧,后三个参数表示头顶的朝向,比如说头可以歪着(哈哈)。

但是我测试过,如果歪的不对,原来的正前方现在已经不是正前方了,那么就看不见物体了。

举个例子:gluLookAt (0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);//这个就表示头顶是朝着y方向gluLookAt (0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0);//这个表示头歪了45度,头顶朝着(1.0,1.0,0.0)这个方向2.glScalef() ——模型变换函数缩放void glScalef(GLfloat x, GLfloat y, GLfloat z);模型变换的目的是设置模型的位置和方向,例如可以对模型进行旋转、移动和缩放,或者联合这几种操作。

这个函数表示模型在各轴上是如果进行缩放的。

举个例子:glScalef (1.0, 2.0, 1.0);//表示y坐标值扩大两倍,这样原本方的物体就变成长的了。

3.glTranslatef() ——模型变换函数移动void glTranslatef(GLfloat x, GLfloat y, GLfloat z);这个函数表示模型是怎样移动的。

举个例子:glTranslatef(-1.0,0.0,-2.0);//表示物体沿x负方向移动1.0,沿z轴负方向移动2.0。

所以就好像能看见侧面一样4.glRotatef()——模型变换函数旋转void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);angle表示旋转的角度(注意单位不是弧度),(x,y,z)表示转轴。

举个例子:glRotatef(45.0, 0.0, 0.0, 1.0);//表示模型沿着(0,0,1)这个轴旋转45°。

5.glFrustum() ——投影变换函数透视投影前四个参数表示裁剪范围,后两个参数(要求为正数)表示近的面和远的面离眼睛的距离。

有点儿像调焦。

裁剪完后拉伸铺满整个屏幕。

6.glPerspective() ——投影变换函数透视投影void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);第一个参数表示在y方向上的视角度数。

个人理解:比如45,表示眼睛和模型中心这个条线与y轴的夹角。

第二个参数表示纵横比。

x/y。

比如2表示x、y本来都是1个长度,现在x可以当两个长度用,这样,模型就好像被x方向压缩了一样。

后两个参数glFrustum()中后两个相近。

要求都是正数。

glViewport()函数和glOrtho()函数的理解(转)/yxnchinahlj/archive/2010/10/30/1865298.html在OpenGL中有两个比较重要的投影变换函数,glViewport和glOrtho。

glOrtho是创建一个正交平行的视景体。

一般用于物体不会因为离屏幕的远近而产生大小的变换的情况。

比如,常用的工程中的制图等。

需要比较精确的显示。

而作为它的对立情况, glFrustum则产生一个透视投影。

这是一种模拟真是生活中,人们视野观测物体的真实情况。

例如:观察两条平行的火车到,在过了很远之后,这两条铁轨是会相交于一处的。

还有,离眼睛近的物体看起来大一些,远的物体看起来小一些。

glOrtho(left, right, bottom, top, near, far),left表示视景体左面的坐标,right 表示右面的坐标,bottom表示下面的,top表示上面的。

这个函数简单理解起来,就是一个物体摆在那里,你怎么去截取他。

这里,我们先抛开glViewport函数不看。

先单独理解glOrtho的功能。

假设有一个球体,半径为1,圆心在(0, 0, 0),那么,我们设定glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10);就表示用一个宽高都是3的框框把这个球体整个都装了进来。

如果设定glOrtho(0.0, 1.5, -1.5, 1.5, -10, 10);就表示用一个宽是1.5,高是3的框框把整个球体的右面装进来;如果设定glOrtho(0.0, 1.5, 0.0, 1.5, -10,10);就表示用一个宽和高都是1.5的框框把球体的右上角装了进来。

上述三种情况可以见图:从上述三种情况,我们可以大致了解glOrtho函数的用法。

glOrtho函数只是负责使用什么样的视景体来截取图像,并不负责使用某种规则把图像呈现在屏幕上。

glViewport主要完成这样的功能。

它负责把视景体截取的图像按照怎样的高和宽显示到屏幕上。

比如:如果我们使用glut库建立一个窗体:glutInitWindowSize(500, 500); 然后使用glutReshapeFunc(reshape); reshape代码如下:void reshape(int width, int height){glViewport(0, 0, (GLsizei)width, (GLsizei)height);glMatrixModel(GL_PROJECTION);glLoadIdentity();glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10);....}这样是可以看到一个正常的球体的。

但是,如果我们创建窗体时glutInitWindowSize(800, 500),那么看到的图像就是变形的。

上述情况见图。

因为我们是用一个正方形截面的视景体截取的图像,但是拉伸到屏幕上显示的时候,就变成了glViewport(0, 0, 800, 500);也就是显示屏变宽了,倒是显示的时候把一个正方形的图像“活生生的给拉宽了”。

就会产生变形。

这样,就需要我们调整我们的OpenGL 显示屏了。

我们可以不用800那么宽,因为我们是用的正方形的视景体,所以虽然窗体是800宽,但是我们只用其中的500就够了。

修改一下程序。

void reshape(int width, int height){int dis = width < height ? width : height;glViewport(0, 0, dis, dis); /*这里dis应该是500*/glMatrixModel(GL_PROJECTION);glLoadIdentity();glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10);.....}OK。

如果你能看明白我写的内容。

你可能对glViewport函数有个大致的了解。

不过,我们采用上面的办法,就是只使用了原来屏幕的一部分(宽度从501到800我们没有用来显示图像)。

如果我们想用整个OpenGL屏幕显示图像,但是又不使图像变形怎么办?那就只能修改glOrtho函数了。

也就是说,我们使用一个和窗体一样比例的视景体(而不再是正方形的视景体)来截取图像。

例如,对于(800, 500)的窗体,我们使用glOrtho(-1.5 * 800/500, 1.5 * 800/500, -1.5, 1.5, -10, 10),就是截取的时候,我们就使用一个“扁扁”的视景体截取,那么,显示的到OpenGL屏幕时(800, 500),我们只要正常把这个扁扁的截取图像显示(扁扁的截取图像是指整个截取的图像,包括球形四周的黑色部分。

球形还是正常圆形的),就可以了。

如:void reshape(int width , int height){glViewport(width, height); //按照窗体大小制作OpenGL屏幕glMatrixMode(GL_PROJECTION);glLoadIdentity();if (width <= height)glOrtho(-1.5, 1.5, -1.5 * (GLfloat)height/(GLfloat)width, 1.5 * (GLfloat)height/(GLfloat)width, -10.0, 10.0);elseglOrtho(-1.5*(GLfloat)width/(GLfloat)height,1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);....}另外,关于glViewport()函数,我们还可以用来调整图像的分辨率。

例如,保持目前的窗体大小不变,我们如果用这个size来只显示整个物体的一部分,那么图像的分辨率就必然会增大。

例如:void reshape(int w, int h){glViewport(0, 0, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(0, 1.5, 0, 1.5 * (GLfloat)h/(GLfloat)w, -10.0, 10.0);elseglOrtho(0, 1.5*(GLfloat)w/(GLfloat)h, 0, 1.5, -10.0, 10.0);}可以把分辨率扩大4倍。

而如果再修改一下glViewport(0, 0, 2 * (GLsizei)w, 2 * (GLsizei)h); 则可以把分辨率扩大16倍。

完整的测试程序:/*Build on ubuntu 9.04*/#include <GL/gl.h>#include <GL/glu.h>#include <GL/glut.h>void init(void){GLfloatmat_specular[] = {1.0, 1.0, 1.0, 1.0};GLfloatmat_shininess[] = {50.0};GLfloatlight_position[] = {1.0, 1.0f, 1.0, 0.0};GLfloatwhite_light[] = {1.0, 1.0, 1.0, 1.0};GLfloatlmodel_ambient[] = {0.1, 0.1, 0.1, 1.0};glClearColor(0.0, 0.0, 0.0, 0.0);glShadeModel(GL_SMOOTH);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);glLightfv(GL_LIGHT0, GL_POSITION, light_position);glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light);glLightfv(GL_LIGHT0, GL_SPECULAR, white_light);glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_DEPTH_TEST);}void display(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glutSolidSphere(1.0, 20, 16);glFlush();}void reshape(int w, int h){glViewport(0, 0, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(-1.5, 1.5, -1.5 * (GLfloat)h/(GLfloat)w, 1.5 *(GLfloat)h/(GLfloat)w, -10.0, 10.0);elseglOrtho(-1.5*(GLfloat)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}int main(intargc, char **argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(500, 500);glutInitWindowPosition(100, 100);glutCreateWindow(argv[0]);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();return 0;}/*CMakeLists.txt*/PROJECT(s5)CMAKE_MINIMUM_REQUIRED(VERSION 2.6)ADD_EXECUTABLE(s5 main.cpp)FIND_PACKAGE(OpenGL)FIND_PACKAGE(GLUT)IF(OPENGL_FOUND)INCLUDE_DIRECTORIES(${OPENGL_INCLUDE_DIR})TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OPENGL_LIBRARIES}) ELSE(OPENGL_FOUND)MESSAGE(FATAL_ERROR "OpenGL not found")ENDIF(OPENGL_FOUND)IF(GLUT_FOUND)INCLUDE_DIRECTORIES(${GLUT_INCLUDE_DIR})TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${GLUT_LIBRARIES}) ELSE(GLUT_FOUND)ENDIF(GLUT_FOUND)glTexCoord2f(GLfloat s, GLfloat t)s和t 代表坐标s为X轴坐标,t为Y轴坐标用于绘制图形时指定纹理的坐标_英文状态下,shift + —键调试。

相关文档
最新文档