和范围。由于我们是三维绘图,所以采用不同的视点和观察范围,就会产生不同的观察效果。由于计算机只能显示二维图形,所以在表示真实世界中的三维图形时,需将三维视景转换成二维视景。这是产生三维立体效果的关键。OpenGL提供了两种将3D图形转换成2D图形的方式。正投影(Orthographic Projection)和透视投影(Perspective Projection)。其中,正投影指投影后物体的大小与视点的远近无关,通常用于CAD设计;而透视投影则符合人的心理习惯,离视点近的物体大,离视点远的物体小。此外,在OpenGL中还要定义投影范围,只有在该范围中的物体才会被投射到
计算机屏幕上,投影范围外的物体将被裁减掉。
定义投影范围(不同的投影方式对应不同函数):
void glOrtho(
GLdouble left, GLdouble right, // (left,bottom,near)及(right,top,far)分别给出正射投
GLdouble bottom, GLdouble top, // 影投影范围的左下角和右上角的坐标。
GLdouble near,GLdouble far);
2、定义与Windows接口的系统函数
2.1 定义绘图窗口的位置
// (x,y)给出窗口左上角坐标
// width及heigh给出窗口的宽高
void auxInitPosition(GLint x,GLint y,GLsizei width, GLsizei heigh);
2.2 定义绘图窗口的标题
// STR表示窗口标题字串
void auxInitWindow(GLbyte* STR);
2.3 定义绘图窗口改变时的窗口刷新函数
// 当窗口改变形状时调指定的回调函数
// NAME表示回调函数名称
void auxReshapeFunc(NAME);
2.4 定义空闲状态的空闲状态函数以实现动画
// 当系统空闲时调用指定的回调函数
// NAME表示回调函数名称
void auxIdleFunc(NAME);
2.5 定义场景绘制函数(当窗口更新或场景改变时调用)
// 当窗口需要更新或场景变化时调用
// NAME表示回调函数名称
void auxMainLoop(NAME);
3、在VC下实现
程序编译
在VC编辑器下键入下述代码后,保存为后缀是.cpp的C++文件。开始编译,在“The build command requires an active project workspace”。“Would you like to create a default project workspace”? 的提示后,选择“是(Y)”。进入“Project”菜单,选择“Setting”项,弹出“Project Setting”对话框,选择“Link”项,在“Libaray”栏目中加入OpenGL提供的函数库:“opengl32.lib glu32.lib glaux.lib”。(注意:在执行程序时,Windows的system目录下要包含opengl32.dll及glu32.dll两个动态连接库)。附源
程序代码:
#include "windows.h"
#include "gl/gl.h"
#include "gl/glaux.h"
#include "gl/glu.h"
#include "math.h"
void myinit()
{
glClearColor(1,1,0,0);
GLfloat ambient={.5,.5,.5,0};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
GLfloat mat_ambient={.8,.8,.8,1.0};
GLfloat mat_diffuse={.8,.0,.8,1.0};
GLfloat mat_specular={1.0,.0,1.0,1.0};
GLfloat mat_shininess={50.0};
GLfloat light_diffuse={0,0,.5,1};
GLfloat light_position={0,0,1.0,0};
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_ambient);
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,mat_shininess);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0,GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
}
void CALLBACK display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_B