#include <windows.h>
#include <gl/glut.h>
#include <stdlib.h>
#define MAX_CHAR 128
GLuint OlympicRings1,OlympicRings2;
static GLfloat xRot=0.0f; //x方向旋转参数
static GLfloat yRot=0.0f; //y方向旋转参数
static GLfloat zRot=0.0f; //z方向旋转参数
int iPointNum=0; //已确定点的数目
int x1=0,x2=0,y1=0,y2=0; //确定的点的坐标
int winWidth=400,winHeight=400;//窗口的宽度和高度
static GLsizei iMode=0;
void initial(void)
{
OlympicRings1=glGenLists(1);
glNewList(OlympicRings1,GL_COMPILE);
glBegin(GL_LINES);
glColor4f(1.0f,0.0f,0.0f,1.0f);//x设置笔的颜色为红
glVertex3f(-3.0f,0.0f,0.0f);
glVertex3f(3.0f,0.0f,0.0f);
glColor4f(0.0f,1.0f,0.0f,1.0f);//y设置笔的颜色为绿色
glVertex3f(0.0f,-3.0f,0.0f);
glVertex3f(0.0f,3.0f,0.0f);
glColor4f(0.0f,0.0f,1.0f,1.0f);//z设置笔的颜色为蓝色
glVertex3f(0.0f,0.0f,-3.0f);
glVertex3f(0.0f,0.0f,3.0f);
glEnd();
glEndList();
OlympicRings2=glGenLists(1);
glNewList(OlympicRings2,GL_COMPILE);
glBegin(GL_TRIANGLES);
/*三角形ABD*/
glColor4f(0.0f,0.6f,1.0f,0.5f);
glVertex3f(2.0f,0.0f,0.0); //绘制A顶点
glVertex3f(2.0f,1.0f,0.0); //绘制B顶点
glVertex3f(1.0f,1.0f,1.0); //绘制D顶点
/*三角形ABC*/
glColor4f(0.6f,0.0f,1.0f,0.5f);
glVertex3f(2.0f,0.0f,0.0); //绘制A顶点
glVertex3f(2.0f,1.0f,0.0); //绘制B顶点
glVertex3f(0.0f,1.0f,0.0); //绘制C顶点
/*三角形ACD*/
glColor4f(1.0f,0.6f,0.0f,0.5f);
glVertex3f(2.0f,0.0f,0.0); //绘制A顶点
glVertex3f(0.0f,1.0f,0.0); //绘制C顶点
glVertex3f(1.0f,1.0f,1.0); //绘制D顶点
/*三角形BCD*/
glColor4f(0.6f,1.0f,0.6f,0.5f);
glVertex3f(2.0f,1.0f,0.0); //绘制B顶点
glVertex3f(0.0f,1.0f,0.0); //绘制C顶点
glVertex3f(1.0f,1.0f,1.0); //绘制D顶点
glEnd();
glEndList();
}
void drawString(const char* str,GLfloat x,GLfloat y)
{
static GLuint lists;
lists=glGenLists(MAX_CHAR);
wglUseFontBitmaps(wglGetCurrentDC(),0,MAX_CHAR,lists);
glListBase(lists);
//起始位置
//glRasterPos3f(x,y,z);
glRasterPos2f(x,y);
glCallLists(strlen(str),GL_UNSIGNED_BYTE,str);
}
void initialOrtho2D()
{
GLint vp[4];
glGetIntegerv(GL_VIEWPORT,vp);
winWidth=vp[2];
winHeight=vp[3];
float x;
if(winWidth>winHeight)
x=(float)(winHeight)/(float)(winHeight);
else
x=(float)(winWidth)/(float)(winWidth);
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);//多边形的模式为
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-4.0*x,4.0*x,-4.0*x,4.0*x,-20.0,20);
glColor3f(1.0,0.0,0.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
}
void initialPerspective()
{
GLint vp[4];
glGetIntegerv(GL_VIEWPORT,vp);
winWidth=vp[2];
winHeight=vp[3];
float x;
if(winWidth>winHeight)
x=(float)(winHeight)/(float)(winHeight);
else
x=(float)(winWidth)/(float)(winWidth);
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); //多边形
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0f,x,-4.0f,4.0f); //透视
glColor3f(1.0,0.0,0.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
}
void SpecialKeys(int key,int x,int y)
{
switch(iMode){
case 0: //绕x轴旋转
if(key==GLUT_KEY_PAGE_UP) xRot+=30.0f;
if(key==GLUT_KEY_PAGE_DOWN) xRot-=30.0f;
if(xRot>360.0f) xRot=0.0f;
if(xRot<-0.0f) xRot=360.0f;
break;
case 1: //绕y轴旋转
if(key==GLUT_KEY_PAGE_UP) yRot+=30.0f;
if(key==GLUT_KEY_PAGE_DOWN) yRot-=30.0f;
if(yRot>360.0f) yRot=0.0f;
if(yRot<-0.0f) yRot=360.0f;
break;
case 2: //绕z轴旋转
if(key==GLUT_KEY_PAGE_UP) zRot+=30.0f;
if(key==GLUT_KEY_PAGE_DOWN) zRot-=30.0f;
if(zRot>360.0f) zRot=0.0f;
if(zRot<-0.0f) zRot=360.0f;
break;
}
glutPostRedisplay();
}
void ProcessMenu(int value)
{
iMode=value;
glutPostRedisplay();
}
void triangle(GLsizei mode)
{
switch(mode)
{
case 1: //正视图XOZ(V)
initialOrtho2D();
drawString("xoz(V)",0.0f,0.0f);
drawString("x",3.5f,0.0f);
drawString("z",0.0f,3.5f);
gluLookAt(0,-10,0,0,0,0,0,0,1);
glCallList(OlympicRings1); //调用显示列表
break;
case 2: //侧视图YOZ(W)
initialOrtho2D();
drawString("yoz(W)",0.0f,0.0f);
drawString("y",3.5f,0.0f);
drawString("z",0.0f,3.5f);
gluLookAt(10,0,0,0,0,0,0,0,1);
glCallList(OlympicRings1); //调用显示列表
break;
case 3: //俯视图XOY(H)
initialOrtho2D();
drawString("xoy(H)",0.0f,0.0f);
drawString("x",3.5f,0.0f);
drawString("y",0.0f,3.5f);
gluLookAt(0,0,10,0,0,0,0,1,0);
glCallList(OlympicRings1); //调用显示列表
break;
case 4: //透视图
initialPerspective();
drawString("Perspective",0.0f,0.0f);
/*drawString("Perspective",0.0f,0.0f);
drawString("x",3.5f,0.0f,0.0f);
drawString("y",0.0f,3.5f,0.0f);
drawString("z",0.0f,0.0f,3.5f);*/
gluLookAt(10,10,10,0,0,0,0,0,1);
glCallList(OlympicRings1);
switch(iMode)
{
case 0: //绕x轴旋转
glRotatef(xRot,1.0f,0.0f,0.0f);
break;
case 1: //绕y轴旋转
glRotatef(yRot,0.0f,1.0f,0.0f);
break;
case 2: //绕z轴旋转
glRotatef(zRot,0.0f,0.0f,1.0f);
break;
}
break;
}
glCallList(OlympicRings2); //调用显示列表
glPopMatrix();
}
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glViewport(0,200,200,200);
triangle(1);
glViewport(200,200,200,200);
triangle(2);
glViewport(0,0,200,200);
triangle(3);
glViewport(200,0,200,200);
triangle(4);
glFlush();
}
void MousePlot(GLint button,GLint action,GLint xMouse,GLint yMouse)
{
if(button==GLUT_LEFT_BUTTON && action==GLUT_DOWN){
if(iPointNum==0||iPointNum==2){
iPointNum=1;
x1=xMouse; y1=winHeight;
}
else{
iPointNum=2;
x2=xMouse; y2=winHeight;
glutPostRedisplay();
}
}
if(button==GLUT_RIGHT_BUTTON && action==GLUT_DOWN){
iPointNum=0;
glutPostRedisplay();
}
}
void PassiveMouseMove(GLint xMouse,GLint yMouse)
{
if(iPointNum==1){
x2=xMouse;
y2=winHeight;
glutPostRedisplay();
}else{
switch(iMode){
case 0: //绕x轴旋转
if(x1>x2) xRot+=5.0f;
if(x1<x2) xRot-=5.0f;
if(xRot>360.0f) xRot=0.0f;
if(xRot<-0.0f) xRot=360.0f;
break;
case 1: //绕y轴旋转
if(x1>x2) yRot+=5.0f;
if(x1<x2) yRot-=5.0f;
if(yRot>360.0f) yRot=0.0f;
if(yRot<-0.0f) yRot=360.0f;
break;
case 2: //绕z轴旋转
if(x1>x2) zRot+=5.0f;
if(x1<x2) zRot-=5.0f;
if(zRot>360.0f) zRot=0.0f;
if(zRot<-0.0f) zRot=360.0f;
break;
}
glutPostRedisplay();
}
}
void main(void)
{
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(100,100);
glutInitWindowSize(400,400);
glutCreateWindow("四视区");
initial();
//创建菜单并定义菜单回掉函数。
int nGlutPolyMenu=glutCreateMenu(ProcessMenu);
glutAddMenuEntry("绕x轴旋转",0); //创建菜单
glutAddMenuEntry("绕y轴旋转",1);
glutAddMenuEntry("绕z轴旋转",2);
glutAttachMenu(GLUT_RIGHT_BUTTON);
glutDisplayFunc(Display);
glutSpecialFunc(SpecialKeys);
glutMouseFunc(MousePlot); //指定鼠标响应函数
glutPassiveMotionFunc(PassiveMouseMove); //指定鼠标移动响应函数
glutMainLoop();
}
op.zip_三维图像旋转
版权申诉
72 浏览量
2022-07-15
04:50:56
上传
评论
收藏 2.39MB ZIP 举报
局外狗
- 粉丝: 67
- 资源: 1万+
最新资源
- Anaconda3-2024.02-1-Windows-x86-64.exe
- stm32cubemx can通信 一个板子负责传感器采集 一个板子负责wifi传递到网页 网页可控制传感器板子.zip
- k8s集群搭建1.27.1版本(来源于图灵k8s笔记)
- 树莓派连接 DS18B20 温度传感器读取温度时监控客户端,服务器端连接状况,实现断线重连机制
- 小游戏-坦克大战,你认为的小游戏
- 最好用的富文本编辑器wangeditor
- jQuery 3.7.1
- 校园失物招领小程序源码可作毕业设计
- SAP客户端GUI740安装包(JAVA版本)
- winlibs-x86-64-posix-seh-gcc-13.2.0-llvm-16.0.6-mingw-w64msvcrt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈