子窗口为主要的绘图窗口,初始化背景为黑色,开启光照、二维纹理设置、深度
测试及归一化处理。
glClearColor (0.0, 0.0, 0.0, 0.0);
glFrontFace(GL_CCW);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
glEnable(GL_DEPTH_TEST);
子窗口初始化函数中载入纹理、光照模型、显示列表,定义像素存储属性,定义
二次曲面及 NURSE 曲面属性。
loadlight();
qobj = gluNewQuadric();
theNurb = gluNewNurbsRenderer();
gluNurbsProperty(theNurb, GLU_SAMPLING_TOLERANCE, 25.0);
gluNurbsProperty(theNurb, GLU_DISPLAY_MODE, GLU_FILL);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
loadtexture();
loadlist();
光照为:
void loadlight()
{
GLfloat ambient[] = {0.5, 0.5, 0.5, 1.0};
GLfloat diffuse[] = {1, 1, 1.0, 1.0};
GLfloat specular[] = {1.0, 1.0, 1.0, 1.0};
GLfloat position[] = {40.0, 40.0, 40.0, 0.0};
GLfloat lmodel_ambient[] = {0.2, 0.2, 0.2, 1.0};
GLfloat local_view[] = {0.0};
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
glLightfv(GL_LIGHT0, GL_POSITION, position);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);
}
loadtexture( )和 loadlist( )在稍后详解。
对象模型的建立
1 桌子
桌子的绘制较为简单,分别用 glScalef 将 glutSolidCube 绘出的正方体变形为扁扁
的桌面和长长的桌脚,然后用 glTranslate 平移至相应的位置,最后贴上纹理。贴纹理
时先自动计算纹理坐标满贴整个桌子,此时效果并不理想,尤其是桌面,所以将两面
桌面重新贴上手动计算的纹理。
void table()
{
tablelist=glGenLists(1);
3
评论0
最新资源