opengl红宝书买了一年了,一直想好好学学,总是感觉没时间,决定最近抽时间高下。
// // main.c // TestSwap // // Created by 磊 王 on 12-10-18. // Copyright (c) 2012年. All rights reserved. // #include <stdio.h> #include <stdlib.h> #include <GLUT/glut.h> static GLfloat spin = 0.0; void init(void) { // 设置清除窗口颜色为黑色 glClearColor(0.0, 0.0, 0.0, 0.0); // 恒定着色模式 glShadeModel(GL_FLAT); } void display(void) { // 清除窗口 glClear(GL_COLOR_BUFFER_BIT); // 保存当前矩阵 glPushMatrix(); // 旋转函数,spin是旋转角度,后面三位参数是旋转向量,右手法则确定方向 glRotatef(spin, 0.0, 0.0, 1.0); // 颜色 glColor3f(1.0, 0.0, 0.0); // 绘制矩形 glRectf(-25.0, -25.0, 25.0, 25.0); // 恢复矩阵 glPopMatrix(); // 交换缓冲区 glutSwapBuffers(); } void spinDisplay(void) { spin = spin + .1; if (spin > 360.0) { spin -= 360.0; } // 通知glutMainLoop重绘 glutPostRedisplay(); } void reshape(int w, int h) { // 设置视口 glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) { glOrtho(-50.0, 50.0, -50.0*(GLfloat)h/(GLfloat)w, 50.0*(GLfloat)h/(GLfloat)w, 0.1, -1.0); }else { glOrtho(-50.0*(GLfloat)w/(GLfloat)h, 50.0*(GLfloat)w/(GLfloat)h, -50.0, 50.0, 0.1, -1.0); } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void mouse(int button, int state, int x, int y) { switch (button) { case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) { glutIdleFunc(spinDisplay); } break; case GLUT_RIGHT_BUTTON: if (state == GLUT_DOWN) { glutIdleFunc(NULL); } break; default: break; } } int main(int argc, const char * argv[]) { // 初始化GLUT,处理命令行参数 glutInit(&argc, argv); // 显示模式 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); // 窗口大小 glutInitWindowSize(250, 250); // 创建名为animation的窗口 glutCreateWindow("animation"); init(); // 注册显示回调函数 glutDisplayFunc(display); // 注册重绘函数,当窗口大小内容发生变化时回调包括窗口刚创建时 glutReshapeFunc(reshape); // 注册鼠标事件处理函数 glutMouseFunc(mouse); glutMainLoop(); return 0; }
前面四个参数没什么说的,就是一个矩形大小,确定视景大小的,最后的near和far比较有意思。
我通过改动这两个参数发现,同为正和同为负都看不到图形,一正一负可以看见一个正方形。由于我画的是一个xy平面的正方形,Z坐标为0,在Z轴上没有深度。
一正一负的参数说明所画正方形在视景体内部,同为正和同位负时则在视景体外部,此时就看不到所画的物体。
我的理解是near和far就是确定视口位置和视口方向及视景体深度,比如near和far分别为 1,-1,那么视口在Z轴的1位置,向屏幕里面方向,视景体深度为2,所画物体在视景体内部则能被看到,否则看不到。
知之为知之,不知谷歌之