分类: C/C++
2009-10-07 20:54:14
运行结果:
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
#include <stdio.h>
#pragma comment(lib, "OpenGL32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glut32.lib")
void init()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
}
void drawsquare( int width )
{
glRecti( -width/2, -width/2, width/2, width/2 );
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
//draw axis
{
const float axislen = 300.0f;
const float axislenh = axislen/2;
glBegin(GL_LINES);
glColor3f( 0.0f, 1.0f, 0.0f );//指定线的颜色,绿色
// x-axis
glVertex2f( -axislenh, 0.0f);
glVertex2f( axislenh, 0.0f);
// x-axis arrow
glVertex2f( axislenh, 0.0f);
glVertex2f( axislenh-7, 3.0f);
glVertex2f( axislenh, 0.0f);
glVertex2f( axislenh-7,-3.0f);
glColor3f( 1.0f, 0.0f, 0.0f );//指定线的颜色,红色
// y-axis
glVertex2f( 0.0f, -axislenh);
glVertex2f( 0.0f, axislenh);
glVertex2f( 0.0f, axislenh);
glVertex2f( 3.0f, axislenh-7);
glVertex2f( 0.0f, axislenh);
glVertex2f( -3.0f, axislenh-7);
glEnd();
}
glMatrixMode( GL_MODELVIEW );
glPushMatrix();
/* 一个白色的正方形,先平移再旋转 */
glLoadIdentity();
glColor3f(1.0, 1.0, 1.0);
glTranslatef( 100.0f, 0.0f, 0.0f );//沿着x轴移动
glRotatef( 45, 0.0f, 0.0f, 1.0f );//沿着z轴旋转
drawsquare(50);
/* 一个红色的正方形,先旋转再平移 */
glLoadIdentity();
glColor3f(1.0, 0.0, 0.0);
glRotatef( 45, 0.0f, 0.0f, 1.0f );//沿着z轴旋转
glTranslatef( 100.0f, 0.0f, 0.0f );//沿着x轴移动
drawsquare(50);
glPopMatrix();
glFlush();
}
void reshape( int w, int h )
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-(GLdouble) w/2, (GLdouble) w/2, -(GLdouble) h/2, (GLdouble) h/2);
};
int main( int argc, char* argv[] )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH );
glutInitWindowSize( 800, 800 );
glutInitWindowPosition( 100, 100 );
glutCreateWindow( "Chapter2" );
init();
glutDisplayFunc( &display );
glutReshapeFunc( &reshape );
glutMainLoop();
return 0;
}
|
运行效果图:
如果,转换一下坐标,例如将上面的 RenderScene 函数修改为下面的样子,
|
那么效果图如下:
|
程序运行效果图:
4、投影变换
投影变换就是定义一个可视空间,可视空间以外的物体不会被绘制到屏幕上。(注意,从现在起,坐标可以不再是-1.0到1.0了!)
OpenGL支持两种类型的投影变换,即透视投影和正投影。投影也是使用矩阵来实现的。如果需要操作投影矩阵,需要以GL_PROJECTION为参数调用glMatrixMode函数。
glMatrixMode(GL_PROJECTION);
通常,我们需要在进行变换前把当前矩阵设置为单位矩阵。
glLoadIdentity();
透视投影所产生的结果类似于照片,有近大远小的效果,比如在火车头内向前照一个铁轨的照片,两条铁轨似乎在远处相交了。
使用glFrustum函数可以将当前的可视空间设置为透视投影空间。
也可以使用更常用的gluPerspective函数。
正投影相当于在无限远处观察得到的结果,它只是一种理想状态。但对于计算机来说,使用正投影有可能获得更好的运行速度。
使用glOrtho函数可以将当前的可视空间设置为正投影空间
如果绘制的图形空间本身就是二维的,可以使用gluOrtho2D。他的使用类似于glOrgho。
5、视口变换
当一切工作已经就绪,只需要把像素绘制到屏幕上了。这时候还剩最后一个问题:应该把像素绘制到窗口的哪个区域呢?通常情况下,默认是完整的填充整个窗口,但我们完全可以只填充一半。(即:把整个图象填充到一半的窗口内)
使用glViewport来定义视口。其中前两个参数定义了视口的左下脚(0,0表示最左下方),后两个参数分别是宽度和高度。
6、加上光源
|
运行效果图:
同系列其他文章:
OpenGL系列教程(1)——Create A Window using GLUT http://blog.chinaunix.net/u/16292/showart.php?id=2063233
OpenGL系列教程(2)——从点到线,绘制我们自己的绚丽曲线 http://blog.chinaunix.net/u/16292/showart_2065128.html