1 // first_3D.cpp : 定义控制台应用程序的入口点。
2 //
3
4 #include "stdafx.h"
5 #include <GL/glut.h>
6 #include <math.h>
7
8 // 将立方体的八个顶点保存到一个数组里面
9 static const GLfloat vertex_list[8][3] = {
10 -0.5f, -0.5f, -0.5f,
11 0.5f, -0.5f, -0.5f,
12 -0.5f, 0.5f, -0.5f,
13 0.5f, 0.5f, -0.5f,
14 -0.5f, -0.5f, 0.5f,
15 0.5f, -0.5f, 0.5f,
16 -0.5f, 0.5f, 0.5f,
17 0.5f, 0.5f, 0.5f,
18 };
19 //变换后数组
20 GLfloat vertex_list_new[8][3] = {
21 -0.5f, -0.5f, -0.5f,
22 0.5f, -0.5f, -0.5f,
23 -0.5f, 0.5f, -0.5f,
24 0.5f, 0.5f, -0.5f,
25 -0.5f, -0.5f, 0.5f,
26 0.5f, -0.5f, 0.5f,
27 -0.5f, 0.5f, 0.5f,
28 0.5f, 0.5f, 0.5f,
29 };
30
31 void work(float T[4][4])
32 {
33 GLfloat list_temp[8][3];
34 for(int i=0;i<8;i++)
35 for(int j=0;j<3;j++)
36 list_temp[i][j] = vertex_list_new[i][j];
37 for(int i=0;i<8;i++)
38 {
39 for(int j=0;j<4;j++)
40 {
41 float sum = 0;
42 for(int k=0;k<4;k++)
43 {
44 sum+=list_temp[i][k]*T[k][j];
45 }
46 vertex_list_new[i][j] = sum;
47 }
48 }
49 return;
50 }
51 // 将要使用的顶点的序号保存到一个数组里面
52 static const GLint index_list[][4] = {
53 0, 2, 3, 1,
54 0, 4, 6, 2,
55 0, 1, 5, 4,
56 4, 5, 7, 6,
57 1, 3, 7, 5,
58 2, 6, 7, 3,
59 };
60
61 void display()
62 {
63 glClear(GL_COLOR_BUFFER_BIT);
64 glMatrixMode(GL_MODELVIEW);
65 glLoadIdentity();
66 //gluLookAt(1.5,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0);//视点
67
68 /* /坐标轴
69 glLineWidth(1);
70 glColor3f( 0.0, 0.0, 0.0); // 黑色
71 glBegin(GL_LINES);
72 glVertex3f(-0xFFFFFFF,0,0);
73 glVertex3f(0xFFFFFFF,0,0);
74 glVertex3f(0,-0xFFFFFFF,0);
75 glVertex3f(0,0xFFFFFFF,0);
76 glVertex3f(0,0,-0xFFFFFFF);
77 glVertex3f(0,0,0xFFFFFFF);
78 glEnd();
79 //坐标轴绘制结束*/
80
81 /* /绘制原立方体
82 glColor3f( 1.0, 1.0, 0.0);
83 //glBegin(GL_QUADS);
84 for(int i=0; i<6; ++i) // 有六个面,循环六次
85 {
86 glBegin( GL_LINE_LOOP);
87 for(int j=0; j<4; ++j) // 每个面有四个顶点,循环四次
88 {
89 glVertex3fv(vertex_list[index_list[i][j]]);
90 }
91 glEnd();
92 }
93 //立方体绘制结束*/
94
95 //绘制新立方体
96 glColor3f( 1.0, 0.0, 0.0);
97 //glBegin(GL_QUADS);
98 for(int i=0; i<6; ++i) // 有六个面,循环六次
99 {
100 glBegin( GL_LINE_LOOP);
101 for(int j=0; j<4; ++j) // 每个面有四个顶点,循环四次
102 {
103 glVertex3fv(vertex_list_new[index_list[i][j]]);
104 }
105 glEnd();
106 }
107 //立方体绘制结束
108 glFlush();
109 glutSwapBuffers();
110 }
111
112 void reshape(int w,int h)
113 {
114 glViewport(0,0,w,h);
115 glMatrixMode(GL_PROJECTION);
116 glLoadIdentity();
117 glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0);
118 }
119
120 void init()
121 {
122 glClearColor( 255, 255, 255, 0.0);
123 glMatrixMode(GL_PROJECTION);
124 glLoadIdentity();
125 //glOrtho(-4.0,4.0,-4.0,4.0,-4.0,4.0);
126 glMatrixMode(GL_MODELVIEW);
127 }
128
129 int main(int argc,char** argv)
130 {
131 //计算部分
132 float a,b,c;//Ov
133 a = 0;
134 b = 0;
135 c = 10;
136 float R = sqrt(a*a+b*b+c*c);
137 float d = 1.0;
138 float costh = c/sqrt(a*a+c*c);
139 float sinth = a/sqrt(a*a+c*c);
140 float cosfy = b/R;
141 float sinfy = sqrt(a*a+c*c)/R;
142
143
144 float T1[4][4] = {{1,0,0,0},{0,1,0,0},{0,0,1,0},{-a,-b,-c,1}}; //原点到视点平移变换矩阵
145 float T2[4][4] = {{-costh,0,-sinth,0},{0,1,0,0},{sinth,0,-costh,0},{0,0,0,1}}; //绕y1轴旋转变换
146 float T3[4][4] = {{1,0,0,0},{0,sinfy,-cosfy,0},{0,cosfy,sinfy,0},{0,0,0,1}}; //绕x2轴旋转变换
147 float T4[4][4] = {{-1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}}; //关于y3Ovz3面的反射变换
148 //work(T1);work(T2);work(T3);work(T4);
149
150 //世界--观察坐标系 合成矩阵
151 float Tv[4][4] = {{cosfy,-cosfy*sinth,-sinfy*sinth,0},{0,sinfy,-cosfy,0},{-sinth,-cosfy*costh,-sinfy*costh,0},{0,0,R,1}};
152 //work(Tv);
153
154
155 float Tpersp[4][4] = {{1,0,0,0},{0,1,0,0},{0,0,1,1/d},{0,0,0,0}}; //透视矩阵
156 float Tproj[4][4] = {{-1,0,0,0},{0,1,0,0},{0,0,0,0},{0,0,0,1}}; //投影矩阵
157 //work(Tpersp);work(Tproj);
158 float Ts[4][4] = {{1,0,0,0},{0,1,0,0},{0,0,0,1/d},{0,0,0,0}}; //合成
159 //work(Ts);
160
161 //总合成
162 float T[4][4] = {{costh,-costh*sinth,0,-sinfy*sinth/d},{0,sinfy,0,-cosfy/d},{-sinth,-cosfy*costh,0,-sinfy*costh/d},{0,0,0,R/d}};
163 work(T);
164
165 float T_1[4][4] = {{1,0,0,0},{0,1,0,0},{0,0,0,-1/d},{0,0,0,R/d}};
166 //work(T_1);
167
168
169 glutInit(&argc,argv);
170 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
171 glutInitWindowSize(500,500);
172 glutInitWindowPosition(100,100);
173 glutCreateWindow("立方体");
174 glutReshapeFunc(reshape);
175 glutDisplayFunc(display);
176 init();
177 glutMainLoop();
178 return 0;
179 }