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,所画物体在视景体内部则能被看到,否则看不到。
知之为知之,不知谷歌之