opengl学习一

来源:互联网 发布:淘宝店铺购买的服务费 编辑:程序博客网 时间:2024/04/30 15:13

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;}


其中有个函数glOrtho,一知半解的,查了好多资料,自己调了下,发现网上说的很多都没说清楚。

前面四个参数没什么说的,就是一个矩形大小,确定视景大小的,最后的near和far比较有意思。

我通过改动这两个参数发现,同为正和同为负都看不到图形,一正一负可以看见一个正方形。由于我画的是一个xy平面的正方形,Z坐标为0,在Z轴上没有深度。

一正一负的参数说明所画正方形在视景体内部,同为正和同位负时则在视景体外部,此时就看不到所画的物体。

我的理解是near和far就是确定视口位置和视口方向及视景体深度,比如near和far分别为 1,-1,那么视口在Z轴的1位置,向屏幕里面方向,视景体深度为2,所画物体在视景体内部则能被看到,否则看不到。

知之为知之,不知谷歌之

原创粉丝点击