【OpenGL】画立方体

编写一个程序,该程序运行时可以用鼠标的一个按键调整立方体的方向,用另一个按键平移立方体,用第三个按键缩放立方体。

这是题目,我的程序不一定完全按照这个来。初学OpenGL,对那一堆坐标系表示十分混乱,慢慢看吧,有点头绪了。

(一)

  1 #include <gl/glut.h>
  2 #include <math.h>
  3 #define GL_PI 3.1415f
  4
  5 GLfloat xRot = -35.0f;
  6 GLfloat yRot = 15.0f;
  7 GLfloat xMov = 0.0f;
  8 GLfloat winW = 0.0f;
  9 GLfloat winH = 0.0f;
 10 GLfloat zoom = 1.0f;
 11
 12 void RenderScene(void)
 13 {
 14     glClear(GL_COLOR_BUFFER_BIT);
 15
 16     glPushMatrix();
 17     glLoadIdentity();
 18     glRotatef(xRot, 1.0f, 0.0f, 0.0f);
 19     glRotatef(yRot, 0.0f, 1.0f, 0.0f);
 20
 21     // 底面
 22     glBegin(GL_LINE_LOOP);
 23     glVertex3f(0.0f+xMov, 0.0f, 0.0f);
 24     glVertex3f(1.0f+xMov, 0.0f, 0.0f);
 25     glVertex3f(1.0f+xMov, 0.0f, 1.0f);
 26     glVertex3f(0.0f+xMov, 0.0f, 1.0f);
 27     glEnd();
 28
 29     // 顶面
 30     glBegin(GL_LINE_LOOP);
 31     glVertex3f(0.0f+xMov, 1.0f, 1.0f);
 32     glVertex3f(0.0f+xMov, 1.0f, 0.0f);
 33     glVertex3f(1.0f+xMov, 1.0f, 0.0f);
 34     glVertex3f(1.0f+xMov, 1.0f, 1.0f);
 35     glEnd();
 36
 37     // 背面
 38     glBegin(GL_LINE_LOOP);
 39     glVertex3f(0.0f+xMov, 0.0f, 0.0f);
 40     glVertex3f(1.0f+xMov, 0.0f, 0.0f);
 41     glVertex3f(1.0f+xMov, 1.0f, 0.0f);
 42     glVertex3f(0.0f+xMov, 1.0f, 0.0f);
 43     glEnd();
 44
 45     // 前面
 46     glBegin(GL_LINE_LOOP);
 47     glVertex3f(1.0f+xMov, 0.0f, 1.0f);
 48     glVertex3f(0.0f+xMov, 0.0f, 1.0f);
 49     glVertex3f(0.0f+xMov, 1.0f, 1.0f);
 50     glVertex3f(1.0f+xMov, 1.0f, 1.0f);
 51     glEnd();
 52
 53     // 右面
 54     glBegin(GL_LINE_LOOP);
 55     glVertex3f(1.0f+xMov, 0.0f, 0.0f);
 56     glVertex3f(1.0f+xMov, 0.0f, 1.0f);
 57     glVertex3f(1.0f+xMov, 1.0f, 1.0f);
 58     glVertex3f(1.0f+xMov, 1.0f, 0.0f);
 59     glEnd();
 60
 61     // 左面
 62     glBegin(GL_LINE_LOOP);
 63     glVertex3f(0.0f+xMov, 0.0f, 0.0f);
 64     glVertex3f(0.0f+xMov, 0.0f, 1.0f);
 65     glVertex3f(0.0f+xMov, 1.0f, 1.0f);
 66     glVertex3f(0.0f+xMov, 1.0f, 0.0f);
 67     glEnd();
 68
 69     glPopMatrix();
 70     glFlush();
 71 }
 72 void OnReshape(int w, int h)
 73 {
 74     GLfloat aspectRatio = (GLfloat)w/(GLfloat)h;
 75     winW = w;
 76     winH = h;
 77
 78     glViewport(0,0,w,h);
 79     glMatrixMode(GL_PROJECTION);
 80     glLoadIdentity();
 81     if (w <= h)
 82     {
 83         glOrtho(-3.0f*zoom, 3.0f*zoom, -3.0f*zoom/aspectRatio, 3.0f*zoom/aspectRatio, -10.0f*zoom, 10.0f*zoom);
 84     }
 85     else{
 86         glOrtho(-3.0f*zoom*aspectRatio, 3.0f*zoom*aspectRatio, -3.0f*zoom, 3.0f*zoom, -10.0f*zoom, 10.0f*zoom);
 87     }
 88     glMatrixMode(GL_MODELVIEW);
 89     glLoadIdentity();
 90 }
 91 void OnMouse(int button, int state, int x, int y)
 92 {
 93     if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
 94     {
 95         xRot += 1;
 96         yRot += 1;
 97         glutPostRedisplay();
 98     }
 99     else if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
100     {
101         xMov -= 0.1;
102         glutPostRedisplay();
103     }
104     else if (button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN)
105     {
106         zoom += 0.1;
107         OnReshape(winW,winH);
108         glutPostRedisplay();
109     }
110 }
111 void OnKeyUpDown(int key, int x, int y)
112 {
113     if (key == GLUT_KEY_UP){
114         zoom -= 0.1;
115     }
116     else if (key == GLUT_KEY_DOWN){
117         zoom += 0.1;
118     }
119     OnReshape(winW,winH);
120     glutPostRedisplay();
121 }
122
123 void SetupRC()
124 {
125     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
126     glColor3f(0.0f, 1.0f, 0.0f);
127 }
128
129 void main(int argc, char **argv)
130 {
131     glutInit(&argc,argv);
132     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
133     glutCreateWindow("Cube");
134     glutDisplayFunc(RenderScene);
135     glutReshapeFunc(OnReshape);
136     glutMouseFunc(OnMouse);
137     glutSpecialFunc(OnKeyUpDown);
138
139     SetupRC();
140
141     glutMainLoop();
142 }

这个程序略长,显得有点笨。手工实现了平移和放大缩小的功能,值得记录一下。

(二)

 1 #include <windows.h>
 2 #include<gl/glut.h>
 3 #include <math.h>
 4 #include<stdio.h>
 5
 6 GLfloat angle=0.0f;
 7 GLfloat translate_x=0.0f;
 8 GLfloat zoom=1.0f;
 9
10 void myDisplay()
11 {
12     glClear (GL_COLOR_BUFFER_BIT);
13     glColor3f (1.0f, 1.0f, 1.0f);
14     glPushMatrix();
15     {
16         glMatrixMode(GL_MODELVIEW);        //切换到模型视图矩阵
17         glLoadIdentity();
18         glRotatef(angle,1.0f,0.0f,0.0f);
19         glRotatef(angle, 0.0f, 1.0f, 0.0f);
20         glTranslatef(translate_x,0.0f,0.0f);
21         glScalef (zoom, zoom, zoom);
22         glutWireCube(1.5); //画立方体
23     }
24     glPopMatrix();
25     glFlush();
26 }
27
28 void reshape(int w,int h)
29 {
30     glViewport (0, 0, (GLsizei) w, (GLsizei) h);  //调整视口位置和大小
31     glMatrixMode (GL_PROJECTION);//切换到投影矩阵
32     glLoadIdentity();//加载单位阵至投影矩阵
33     if (w <= h){
34         glOrtho(-3.0f, 3.0f, -3.0f/(w/h), 3.0f/(w/h), -3.0f, 3.0f);
35     }
36     else{
37         glOrtho(-3.0f*w/h, 3.0f*w/h, -3.0f, 3.0f, -3.0f, 3.0f);
38     }
39
40     glMatrixMode (GL_MODELVIEW);
41     glLoadIdentity();
42 }
43
44 void OnMouse(int button, int state, int x, int y)
45 {
46     //鼠标左键
47     if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
48     {
49         angle += 10.0f;
50         glutPostRedisplay();
51     }
52     //鼠标右键
53     else if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
54     {
55         translate_x+=0.1f;
56         glutPostRedisplay();
57     }
58     //鼠标滚轮
59     else if (state == GLUT_UP && button == GLUT_WHEEL_DOWN)
60     {
61         if(zoom>0)
62             zoom-=0.1f;
63         glutPostRedisplay();
64     }
65     else if(state == GLUT_UP && button == GLUT_WHEEL_UP)
66     {
67         zoom+=0.1f;
68         glutPostRedisplay();
69     }
70 }
71
72
73 int main(int argc, char** argv)
74 {
75     glutInit(&argc, argv);
76     glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
77     glutInitWindowPosition(100,100);
78     glutInitWindowSize(500,500);
79     glutCreateWindow("cube");
80
81     glutDisplayFunc(myDisplay);
82     glutReshapeFunc(reshape);
83     glutMouseFunc( OnMouse );
84     glutMainLoop();
85     return 0;
86 }

采用了OpenGL的一些库函数实现,投影还是采用平行投影,表示对透视投影函数gluPerspective以及视点变化函数gluLookAt不是很清楚。

(三)

 1 #include <windows.h>
 2 #include<gl/glut.h>
 3 #include <math.h>
 4 #include<stdio.h>
 5
 6 GLfloat angle=0.0f;
 7 GLfloat translate_x=0.0f;
 8 GLfloat zoom=1.0f;
 9
10 void myDisplay()
11 {
12     glClear (GL_COLOR_BUFFER_BIT);
13     glColor3f (1.0f, 1.0f, 1.0f);
14     glPushMatrix();
15
16     glMatrixMode(GL_MODELVIEW);        //切换到模型视图矩阵
17     glLoadIdentity();
18     gluLookAt (0.0f, 0.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); //设置相机参数
19     glRotatef(angle, 0.0f, 1.0f, 0.0f);
20     glTranslatef(translate_x,0.0f,0.0f);
21     glScalef (zoom, zoom, zoom);
22     glutWireCube(0.5); //画立方体
23
24     glPopMatrix();
25     glFlush();
26 }
27
28 void reshape(int w,int h)
29 {
30     glViewport (0, 0, (GLsizei) w, (GLsizei) h);  //调整视口位置和大小
31     glMatrixMode (GL_PROJECTION);//切换到投影矩阵
32     glLoadIdentity();//加载单位阵至投影矩阵
33     gluPerspective(30,w/h,5,20);
34     glMatrixMode (GL_MODELVIEW);
35     glLoadIdentity();
36 }
37
38 void OnMouse(int button, int state, int x, int y)
39 {
40     //鼠标左键
41     if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
42     {
43         angle += 10.0f;
44         glutPostRedisplay();
45     }
46     //鼠标右键
47     else if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
48     {
49         //xMov -= 0.1;
50         translate_x+=0.1f;
51         glutPostRedisplay();
52     }
53     //鼠标滚轮
54     else if (state == GLUT_UP && button == GLUT_WHEEL_DOWN)
55     {
56         if(zoom>0)
57             zoom-=0.1f;
58         glutPostRedisplay();
59     }
60     else if(state == GLUT_UP && button == GLUT_WHEEL_UP)
61     {
62         zoom+=0.1f;
63         glutPostRedisplay();
64     }
65 }
66
67
68 int main(int argc, char** argv)
69 {
70     glutInit(&argc, argv);
71     glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
72     glutInitWindowPosition(100,100);
73     glutInitWindowSize(500,500);
74     glutCreateWindow("cube");
75
76     glutDisplayFunc(myDisplay);
77     glutReshapeFunc(reshape);
78     glutMouseFunc( OnMouse );
79     glutMainLoop();
80     return 0;
81 }

用的是透视投影。我的理解是gluPerspective()和gluLookAt()要配合使用,二者中的相机位置要一致。

时间: 2024-10-13 02:56:56

【OpenGL】画立方体的相关文章

OpenGL学习笔记2 —— 画立方体

#include <windows.h> // windows系统要加这个.因为下面2个头文件的一些宏是在这个文件中定义的 #include <gl/Gl.h> #include <gl/glut.h> //这两个头文件在OpenGL程序中几乎必加. //<<<<<<<<<<<<<<<<<<<<<<< myInit >>&

计算机图形学(二)输出图元_2_ OpenGL画线函数

 OpenGL画线函数 图形软件包一般都提供一个描述一条或多条直线段的函数,其中每一直线段由两个端点坐标位置定义.在OpenGL中,和选择一个点位置一样,我们使用glVertex函数选择单个端点的坐标位置.我们使用一对glBegin/g1End来引入一串端点位置.有三个OpenGL符号常量可用于指定如何把这一串端点位置连接成一组直线段.默认情况下,每一符号常量显示白色实线. 使用图元线常量GL_LINES可连接每一对相邻端点而得到一组直线段.通常,这会导致一组未连接的线段,除非重复某些坐标位置.

Assignment 2 使用OpenGL画安卓机器人

一. 实现简述 Assignment 2 Report 目标:画一个安卓机器人. 代码结构:在 glutDisplayFunc(drawRobot)中的参数 drawRobot 函数是实 现画机器人的最外层函数,其中包括画脸.画身体.画手和画脚.每个函数又继 续细分画的步骤和方法.如下图所示: 二. 心得体会 这次任务让我对 OpenGl 有了初步认识.通过阅读课本和网上的资料,掌握 使用 OpenGl 的基本功能,比如如何画基本的点.线和多边形.并理解了一些之 前没明白的重要概念,比如 glL

opengl画个球

本文介绍两种方法用opengl绘制一个球体,一种是计算球面点的位置,然后画出来,另一种是glut工具箱自带的函数. 一.直接绘制法 直接贴代码,解释都写在注释里了.绘制时先移动好坐标系,然后调用这方法画就行. <span style="font-family:SimSun;font-size:12px;">//球心坐标为(x,y,z),球的半径为radius,M,N分别表示球体的横纵向被分成多少份 void drawSphere(GLfloat xx, GLfloat yy

OpenGL画圆

中点画圆 1 #include<gl/glut.h> 2 3 4 void MidPointCirle(int r) 5 { 6 int x,y; 7 float d; 8 x=0;y=r;d=1.25-r; 9 glColor3f(1.0f,1.0f,1.0f); 10 glVertex2i(x,y); 11 while(x<=y) 12 { 13 if(d<0) 14 d+=2*x+3; 15 else 16 { 17 d+=2*(x-y)+5; 18 y--; 19 } 20

用OpenGL进行立方体表面纹理贴图

一.目的: 掌握OpenGL中纹理对象的创建.绑定与使用方法. 二.简单介绍: 1,连接静态库 #pragma comment(lib, "glut32.lib") #pragma comment(lib, "glaux.lib") 2,载入位图图像到内存(这是固定用法) AUX_RGBImageRec *LoadBMP(CHAR *Filename) { FILE *File = NULL; // 文件句柄 if (!Filename) // 确保文件名已提供 {

用OpenGL画线

. 两点之间的连线称之为线段,在屏幕上显示线段放在现在已经不是稀奇的事情,大多数高级图形API都可以轻松实现,我尝试用OpenGL画线,在这里记录一下收获. . OpenGL这个级别的图形API,通常会提供一些绘制基本图形的接口,这些基本图形称之为图元,而OpenGL提供了点,线段,三角形三种图元绘制接口,说出来你可能不信,OpenGL就只能绘制这三种图形,本篇博文的主题是画线,OpenGL能直接绘制的图元之一. 用OpenGL绘制线段图元 给出两点的坐标,调用API即可直接画出线段. // 伪

opengl画星星

#include <windows.h> #include <gl/gl.h> #include <gl/glaux.h> #include <math.h> #define pi 3.1415926 #pragma comment (lib, "opengl32.lib") #pragma comment (lib, "glu32.lib") #pragma comment (lib, "glaux.lib

OPenGL 画球代码

1 #include <GL/glut.h> 2 #include<cstdio> 3 #include<cmath> 4 5 #define PI 3.14159265358979323846 6 #define PI2 6.28318530717958647692 7 #define r 80 8 9 GLsizei width = 600,height = 600; 10 11 int uStepsNum = 25; 12 13 14 void Init() 15