当前位置:编程学习 > C/C++ >>

VS2012下基于Glut OpenGL绘制直线示例程序:

在VS2012下使用glut绘制一系列直线的示例程序,绘制的是圆周上的二十条直径,效果如下图所示,按PC的UP,DOWN,LEFT,RIGHT按键可以从不同的角度查看该图形:

 


源代码:


[cpp]
// GlutLinesDemo.cpp : 定义控制台应用程序的入口点。  
//  
#include "stdafx.h"  
#include <gl/glut.h>  
#include <math.h>  
//圆周率宏  
#define GL_PI 3.1415f  
//获取屏幕的宽度与高度  
GLint SCREEN_WIDTH=0; 
GLint SCREEN_HEIGHT=0; 
//设置程序的窗口大小  
GLint windowWidth=400; 
GLint windowHeight=300; 
//绕x轴旋转角度  
GLfloat xRotAngle=0.0f; 
//绕y轴旋转角度  
GLfloat yRotAngle=0.0f; 
//显示回调函数  
void renderScreen(void){ 
    GLfloat x,y,z,angle; 
    //把整个窗口清理为当前清理颜色:黑色  
    glClear(GL_COLOR_BUFFER_BIT); 
    //将当前Matrix状态入栈  
    glPushMatrix(); 
    //坐标系绕x轴旋转xRotAngle  
    glRotatef(xRotAngle,1.0f,0.0f,0.0f); 
    //坐标系绕y轴旋转yRotAngle  
    glRotatef(yRotAngle,0.0f,1.0f,0.0f); 
    //开始绘直线  
    glBegin(GL_LINES); 
    z=0.0f; 
    //绘制圆周上的20条直径  
    for(angle=0.0f;angle<=GL_PI;angle+=(GL_PI/20)){ 
        x=50.0f*sin(angle); 
        y=50.0f*cos(angle); 
        glVertex3f(x,y,z); 
        x=50.0f*sin(angle+GL_PI); 
        y=50.0f*cos(angle+GL_PI); 
        glVertex3f(x,y,z); 
    } 
    //结束绘直线  
    glEnd(); 
    //恢复压入栈的Matrix  
    glPopMatrix(); 
    //交换两个缓冲区的指针  
    glutSwapBuffers(); 

//设置Redering State   
void setupRederingState(void){ 
    //设置清理颜色为黑色  
    glClearColor(0.0f,0.0,0.0,1.0f); 
    //设置绘画颜色为绿色  
    glColor3f(0.0f,1.0f,0.0f); 

//窗口大小变化回调函数  
void changSize(GLint w,GLint h){ 
    //横宽比率  
    GLfloat ratio; 
    //设置坐标系为x(-100.0f,100.0f)、y(-100.0f,100.0f)、z(-100.0f,100.0f)  
    GLfloat coordinatesize=100.0f; 
    //窗口宽高为零直接返回  
    if((w==0)||(h==0)) 
        return; 
    //设置视口和窗口大小一致  
    glViewport(0,0,w,h); 
    //对投影矩阵应用随后的矩阵操作  
    glMatrixMode(GL_PROJECTION); 
    //重置当前指定的矩阵为单位矩阵   
    glLoadIdentity(); 
    ratio=(GLfloat)w/(GLfloat)h; 
    //正交投影  
    if(w<h) 
        glOrtho(-coordinatesize,coordinatesize,-coordinatesize/ratio,coordinatesize/ratio,-coordinatesize,coordinatesize); 
    else 
        glOrtho(-coordinatesize*ratio,coordinatesize*ratio,-coordinatesize,coordinatesize,-coordinatesize,coordinatesize); 
    //对模型视图矩阵堆栈应用随后的矩阵操作  
    glMatrixMode(GL_MODELVIEW); 
    //重置当前指定的矩阵为单位矩阵   
    glLoadIdentity(); 

//按键输入处理回调函数   
void specialKey(int key,int x,int y){ 
 
    if(key==GLUT_KEY_UP){ 
        xRotAngle-=5.0f; 
    } 
    else if(key==GLUT_KEY_DOWN){ 
        xRotAngle+=5.0f; 
    } 
    else if(key==GLUT_KEY_LEFT){ 
        yRotAngle-=5.0f; 
    } 
    else if(key==GLUT_KEY_RIGHT){ 
        yRotAngle+=5.0f; 
    } 
    //重新绘制  
    glutPostRedisplay(); 

 
int main(int argc, char* argv[]) 

    //初始化glut  
    glutInit(&argc,argv); 
    //使用双缓冲区模式  
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH); 
    //获取系统的宽像素  
    SCREEN_WIDTH=glutGet(GLUT_SCREEN_WIDTH); 
    //获取系统的高像素  
    SCREEN_HEIGHT=glutGet(GLUT_SCREEN_HEIGHT); 
    //创建窗口,窗口名字为OpenlGL Lines Demo  
    glutCreateWindow("OpenlGL Lines Demo"); 
    //设置窗口大小  
    glutReshapeWindow(windowWidth,windowHeight); 
    //窗口居中显示  
    glutPositionWindow((SCREEN_WIDTH-windowWidth)/2,(SCREEN_HEIGHT-windowHeight)/2); 
    //设置窗口大小变化时的回调函数  
    glutReshapeFunc(changSize); 
    //设置显示回调函数  
    glutDisplayFunc(renderScreen); 
    //设置按键输入处理回调函数  
    glutSpecialFunc(specialKey); 
    //设置全局渲染参数  
    setupRederingState(); 
    glutMainLoop(); 
    return 0; 

// GlutLinesDemo.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <gl/glut.h>
#include <math.h>
//圆周率宏
#define GL_PI 3.1415f
//获取屏幕的宽度与高度
GLint SCREEN_WIDTH=0;
GLint SCREEN_HEIGHT=0;
//设置程序的窗口大小
GLint windowWidth=400;
GLint windowHeight=300;
//绕x轴旋转角度
GLfloat xRotAngle=0.0f;
//绕y轴旋转角度
GLfloat yRotAngle=0.0f;
//显示回调函数
void renderScreen(void){
 GLfloat x,y,z,angle;
 //把整个窗口清理为当前清理颜色:黑色
 glClear(GL_COLOR_BUFFER_BIT);
 //将当前Matrix状态入栈
 glPushMatrix();
 //坐标系绕x轴旋转xRotAngle
 glRotatef(xRotAngle,1.0f,0.0f,0.0f);
 //坐标系绕y轴旋转yRotAngle
 glRotatef(yRotAngle,0.0f,1.0f,0.0f);
&nb

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,