opengl 正方体+模拟视角旋转

  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 }

 

你可能感兴趣的:(OpenGL)