计算机图形学-键盘

#include <GL/glut.h>
#include "stdio.h"
const GLint picksize= 32;
int winWidth = 400,winHeight = 300;
void Initial(void) {
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
}
void DrawRect(GLenum mode){
    if(mode ==GL_SELECT)
//将名字1压入堆栈aIs21g
        glPushName(1);
    glColor3f(1.0f, 0.0f,0.0f);
// 绘制红色矩形
    glRectf(60.0f,50.0f,150.0f,150.0f);
    if(mode == GL_SELECT)
//将名字2压入堆栈
        glPushName(2);
    glColor3f(0.0f, 1.0f, 0.0f);
//绘制绿色矩形nn1913
    glRectf(230.0f, 50.0f,330.0f,150.0f);
    if(mode == GL_SELECT)
//将名字3压入堆栈quig
        glPushName(3);
    glColor3f(0.0f, 0.0f, 1.0f);
// 绘制蓝色矩形
    glRectf(140.0f,140.0f,240.0f,240.0f);
}

void ProcessPicks(GLint nPicks, GLuint pickBuffer[]){
    GLint i;
    GLuint name,*ptr;
    printf("选中的数目为%d 个\n",nPicks);
    ptr=pickBuffer;
    for(i=0; i<nPicks; i++) {
// 选中图元在堆栈中的位置
        name=*ptr;
// 跳过名字和深度信息
//根据位置信息获得选中的图元名字
        ptr+=3;
        ptr+=name-1;
        if(*ptr==1)
            printf("你选择了红色图元\n");
        if(*ptr==2)
            printf("你选择了绿色图元\n");
        if(*ptr==3)
            printf("你选择了蓝色图元\n");
        ptr++;
    }
    printf("\n\n");
}

void ChangeSize(int w,int h){
    winWidth = w;
    winHeight = h;
    glViewport(0, 0, w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0,winWidth, 0.0, winHeight);
}
void Display(void) {
    glClear(GL_COLOR_BUFFER_BIT);
    DrawRect(GL_RENDER);
    glFlush();
}
void MousePlot(GLint button, GLint action,GLint xMouse,GLint yMouse){
    GLuint pickBuffer[pickSize];
    GLint nPicks,vp[4];
    if(button == GLUT_LEFT_BUTTON && action == GLUT_DOWN){
        glSelectBuffer(pickSize,pickBuffer);
        glRenderMode(GL_SELECT);
// 设置选择缓冲区
        glInitNames();
        glMatrixMode(GL_PROJECTION);
        glPushMatrix();
        glLoadIdentity();
        glGetIntegerv(GL_VIEWPORT,vp);
//定义一个10x10的选择区域    
        gluPickMatrix(GLdouble(xMouse),GLdouble(vp[3]-yMouse), 10.0, 10.0,vp);
        gluOrtho2D(0.0, winWidth, 0.0, winHeight);
        DrawRect(GL_SELECT);
//用选择模式绘制图形
//恢复投影变换
        glMatrixMode(GL_PROJECTION);
        glPopMatrix();
        glFlush();
//将投影矩阵堆栈中的栈顶元素删除
// 获得选择集并输出
        nPicks = glRenderMode(GL_RENDER);
// 输出选择结果b19n>5;=5)207
        ProcessPicks(nPicks,pickBuffer);
        glutPostRedisplay();
    }
}
int main(int argc, char* argv[]){
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowSize(400,300);
    glutInitWindowPosition(100,100);
    glutCreateWindow("拾取操作");
    glutDisplayFunc(Display);
    glutReshapeFunc(ChangeSize);
    glutMouseFunc(MousePlot);
    Initial();
    glutMainLoop();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值