图形学实验报告 OpenGL实现橡皮筋技术文档格式.docx
- 文档编号:21143755
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:11
- 大小:97.08KB
图形学实验报告 OpenGL实现橡皮筋技术文档格式.docx
《图形学实验报告 OpenGL实现橡皮筋技术文档格式.docx》由会员分享,可在线阅读,更多相关《图形学实验报告 OpenGL实现橡皮筋技术文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
3、实现拾取操作的例子结果:
五、程序代码
1、利用鼠标实现橡皮筋技术
#include<
gl/glut.h>
intiPointNum=0;
//已确定点的数目
intx1=0,x2=0,y1=0,y2=0;
//确定的点坐标
intwinWidth=400,winHeight=300;
//窗口的宽度和高度
voidInitial(void)
{
glClearColor(1.0f,1.0f,1.0f,1.0f);
}
voidChangeSize(intw,inth)
winWidth=w;
winHeight=h;
glViewport(0,0,w,h);
//指定窗口显示区域
glMatrixMode(GL_PROJECTION);
//设置投影参数
glLoadIdentity();
gluOrtho2D(0.0,winWidth,0.0,winHeight);
voidDisplay(void)
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);
if(iPointNum>
=1){
glBegin(GL_LINES);
//绘制直线段
glVertex2i(x1,y1);
glVertex2i(x2,y2);
glEnd();
}
glutSwapBuffers();
//交换缓冲区
voidMousePlot(GLintbutton,GLintaction,GLintxMouse,GLintyMouse)
if(button==GLUT_LEFT_BUTTON&
&
action==GLUT_DOWN){
if(iPointNum==0||iPointNum==2){
iPointNum=1;
x1=xMouse;
y1=winHeight-yMouse;
}
else{
iPointNum=2;
x2=xMouse;
y2=winHeight-yMouse;
glutPostRedisplay();
//指定窗口重新绘制
if(button==GLUT_RIGHT_BUTTON&
action==GLUT_DOWN){
iPointNum=0;
glutPostRedisplay();
voidPassiveMouseMove(GLintxMouse,GLintyMouse)
if(iPointNum==1){
x2=xMouse;
}
intmain(intargc,char*argv[])
glutInit(&
argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
//使用双缓存及RGB模型
glutInitWindowSize(400,300);
glutInitWindowPosition(100,100);
glutCreateWindow("
橡皮筋技术"
);
glutDisplayFunc(Display);
glutReshapeFunc(ChangeSize);
//指定窗口在整形回调函数
glutMouseFunc(MousePlot);
//指定鼠标响应函数
glutPassiveMotionFunc(PassiveMouseMove);
//指定鼠标移动响应函数
Initial();
glutMainLoop();
return0;
2、利于键盘实现橡皮筋技术
voidKey(unsignedcharkey,intx,inty)
switch(key){
case'
p'
:
if(iPointNum==0||iPointNum==2){
iPointNum=1;
x1=x;
y1=winHeight-y;
}
else{
iPointNum=2;
x2=x;
y2=winHeight-y;
glutPostRedisplay();
break;
default:
break;
glutKeyboardFunc(Key);
//指定键盘响应函数
3、实现拾取操作的例子
#include"
stdio.h"
constGLintpickSize=32;
voidDrawRect(GLenummode)
if(mode==GL_SELECT)glPushName
(1);
//压入堆栈
glColor3f(1.0f,0.0f,0.0f);
glRectf(60.0f,50.0f,150.0f,150.0f);
if(mode==GL_SELECT)glPushName
(2);
glColor3f(0.0f,1.0f,0.0f);
glRectf(230.0f,50.0f,330.0f,150.0f);
if(mode==GL_SELECT)glPushName(3);
glColor3f(0.0f,0.0f,1.0f);
glRectf(140.0f,140.0f,240.0f,240.0f);
voidProcessPicks(GLintnPicks,GLuintpickBuffer[])
GLinti;
GLuintname,*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"
winWidth=w;
winHeight=h;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,winWidth,0.0,winHeight);
glClear(GL_COLOR_BUFFER_BIT);
DrawRect(GL_RENDER);
glFlush();
GLuintpickBuffer[pickSize];
GLintnPicks,vp[4];
if(button==GLUT_LEFT_BUTTON&
action==GLUT_DOWN){
glSelectBuffer(pickSize,pickBuffer);
//设置选择缓冲区
glRenderMode(GL_SELECT);
//激活选择模式
glInitNames();
//初始化名字堆栈
glPushMatrix();
glGetIntegerv(GL_VIEWPORT,vp);
//定义一个10×
10的选择区域
gluPickMatrix(GLdouble(xMouse),GLdouble(vp[3]-yMouse),10.0,10.0,vp);
DrawRect(GL_SELECT);
//恢复投影变换
glPopMatrix();
//获得选择集并输出
nPicks=glRenderMode(GL_RENDER);
ProcessPicks(nPicks,pickBuffer);
glutPostRedisplay();
glutInit(&
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,300);
glutInitWindowPosition(100,100);
glutCreateWindow("
拾取操作"
glutDisplayFunc(Display);
glutReshapeFunc(ChangeSize);
glutMouseFunc(MousePlot);
Initial();
glutMainLoop();
return0;
6、心得体会
通常在实验过程中,可以加入自己喜欢的其他东西,不过要保证原本的基本东西没有错误。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图形学实验报告 OpenGL实现橡皮筋技术 图形学 实验 报告 OpenGL 实现 橡皮筋 技术