我们需要学习的第二个例子是在第二章的glrect例子。
// Called to draw scene
void RenderScene(void)
{
// Clear the window with current clearing color
glClear(GL_COLOR_BUFFER_BIT);
// Set current drawing color to red
//
R G
B
glColor3f(1.0f, 0.0f, 0.0f);
// Draw a filled rectangle with current color
glRectf(-25.0f, 25.0f, 25.0f, -25.0f);
// Flush drawing commands
glFlush();
}
///////////////////////////////////////////////////////////
// Setup the rendering state
void SetupRC(void)
{
// Set clear color to blue
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}
///////////////////////////////////////////////////////////
// Called by GLUT library when the window has chanaged size
void ChangeSize(int w,
int h)
{
GLfloat aspectRatio;
// Prevent a divide by zero
if(h == 0)
h = 1;
// Set Viewport to window dimensions
glViewport(0, 0, w, h);
// Reset coordinate system
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
printf("w = %d::h = %d",w,h);
// Establish clipping volume (left, right, bottom, top, near, far)
aspectRatio = (GLfloat)w / (GLfloat)h;
if (w <= h)
glOrtho (-100.0, 100.0, -100 / aspectRatio, 100.0 / aspectRatio, 1.0, -1.0);
else
glOrtho (-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
///////////////////////////////////////////////////////////
// Main program entry point
int main(int argc,
char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE
| GLUT_RGB);
// glutInitWindowSize(800, 600);
glutCreateWindow("GLRect");
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
SetupRC();
glutMainLoop();
return 0;
}
书中对代码解释的非常清楚。这个代码的关键在于当窗口的大小被改变的时候的回调函数ChangeSize的代码。这里h和w分别代表窗口新的高和宽,为了使得我们画的矩形保持正方形,代码如下:
if(w <= h)
glOrtho(-100.0, 100.0, -100 / aspectRatio, 100.0 / aspectRatio, 1.0, -1.0);
else
glOrtho(-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0);
这里可以看到opengl中实用的坐标系统是中心点坐标是(0,0)的普通笛卡儿坐标系统,和我们在屏幕上的坐标不同,屏幕上是原点在左上角,x是从左到右依次变大,不会出现负值,Y是从上到下依次变大,不会出现负值,但是opengl其实使用三维坐标系统,是符合右手法则的系统,原点在屏幕中心,X是从左到右变大,但是是从负值变到正值,Y是从下到上变大,从负值变成正值,Z垂直于屏幕,从里到外是从负值到正值的,这和大部分计算机的坐标系统不同。
我们使用函数glOrtho定义X和Y坐标的范围,这里X始终是从-100到正100,所以最后显示的正方形的长度始终是窗口的1/4,在高度上,我们设置为50个高,但是这个表示像素,它需要和glOrtho定义的Y坐标做比较来确定像素。
比如w=h的时候,是正方形,
w = 200;h=400的时候,那么矩形的长是50个像素,这个时候,整个opengl视图在Y上的坐标是-200到200,那么正好矩形的高占了整个视图的1/8,也正好是50个像素。
当w>h的时候,以此类推。
分享到:
相关推荐
OpenGL超级宝典示例代码,都是自己打的,比较详细。只做了前面13章,可以执行,是初学OpenGL的好资料。
opengl 超级宝典 第五版 源代码 opengl 超级宝典 第五版 源代码 opengl 超级宝典 第五版 源代码
openGL超级宝典(第四版)及代码 电子书
OpenGL超级宝典 笔记21 相关代码 用存储区块来传递变换矩阵
opengl 超级宝典 第二版的 源代码
OpenGL超级宝典第五版的源码。没错是源码啊啊啊啊啊啊啊。
经典OpenGL图形学入门书籍《OpenGL超级宝典英文第五版》及所附完整源码。物有所指!
OpenGL超级宝典第四版源代码及库文件,及工程文件。用于配置OpenGL环境或学习
OPENGL超级宝典 代码 chap1
《openGL超级宝典(第四版)及代码》 Comprehensive Tutorial and Reference Richard S. Wright, Jr. Benjamin Lipchak Nicholas Haemel
这个资源在超级宝典源码的的基础上添加了一些中文注释,方便理解每一步的目的与作用
由于文件过大,分两次上传,该部分为opengl超级宝典第二版chapter1-10的源码,opengl学习必备材料
《openGL超级宝典(第四版)及代码》(OpenGL SuperBible (4th Edition))
《OpenGL超级宝典(第4版)》开篇详细讲解OpenGL图形编程的核心技术,覆盖了从空间中进行绘制到几何变换,从光照到纹理贴图等内容。书中讲解了新的OpenGL功能,包括OpenGL 2.1的强大可编程管线、定点和片段着色和...
OpenGL超级宝典的随书光盘,里面所有例子的代码
openGL超级宝典代码.rar OpenGL™ 是行业领域中最为广泛接纳的 2D/3D 图形 API, 其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。OpenGL™ 是独立于视窗操作系统或其它操作系统的,亦是网络透明的。...
《OpenGL超级宝典》各章源代码,可以进行三维场景建模等,有实例
VS2010编译可通过,如果有报错查找下环境配置就可以了
OpenGL 超级宝典(第五版)源代码,从作者主页下载,并分离出C++源代码。