使用 Opengl 绘制 3D 立方体
Posted
技术标签:
【中文标题】使用 Opengl 绘制 3D 立方体【英文标题】:Drawing cube 3D using Opengl 【发布时间】:2013-11-20 20:25:14 【问题描述】:我想使用 OpenGL 绘制一个 3D 立方体,这是我的代码如何纠正错误
float ver[8][3] =
-1.0,-1.0,1.0,
-1.0,1.0,1.0,
1.0,1.0,1.0,
1.0,-1.0,1.0,
-1.0,1.0,-1.0,
1.0,1.0,-1.0,
;
GLfloat color[8][3] =
0.0,0.0,0.0,
1.0,0.0,0.0,
1.0,1.0,0.0,
0.0,1.0,0.0,
1.0,1.0,1.0,
0.0,1.0,1.0,
;
void quad(int a,int b,int c,int d)
glBegin(GL_QUADS);
glColor3fv(color[a]);
glVertex3fv(ver[a]);
glColor3fv(color[b]);
glVertex3fv(ver[b]);
glColor3fv(color[d]);
glVertex3fv(ver[d]);
glEnd();
void colorcube()
quad(0,3,2,1);
quad(2,3,7,6);
void display()
// Clear screen and Z-buffer
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
// Reset transformations
glLoadIdentity();
colorcube();
int main( int argc, char **argv )
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE );
glutInitWindowSize( 640, 480 );
glutCreateWindow( "GLUT" );
glutDisplayFunc( display );
glutDisplayFunc(specialKeys);
glEnable( GL_DEPTH_TEST );
glutMainLoop();
return 0;
【问题讨论】:
【参考方案1】:你需要做几件事:
将specialKeys
传递给glutSpecialFunc()
,而不是glutDisplayFunc()
设置GL_PROJECTION
和GL_MODELVIEW
矩阵
将相机向后移动一点
在display()
的末尾添加一个glutSwapBuffers()
例子:
#include <GL/glut.h>
float ver[8][3] =
-1.0,-1.0,1.0,
-1.0,1.0,1.0,
1.0,1.0,1.0,
1.0,-1.0,1.0,
-1.0,-1.0,-1.0,
-1.0,1.0,-1.0,
1.0,1.0,-1.0,
1.0,-1.0,-1.0,
;
GLfloat color[8][3] =
0.0,0.0,0.0,
1.0,0.0,0.0,
1.0,1.0,0.0,
0.0,1.0,0.0,
0.0,0.0,1.0,
1.0,0.0,1.0,
1.0,1.0,1.0,
0.0,1.0,1.0,
;
void quad(int a,int b,int c,int d)
glBegin(GL_QUADS);
glColor3fv(color[a]);
glVertex3fv(ver[a]);
glColor3fv(color[b]);
glVertex3fv(ver[b]);
glColor3fv(color[c]);
glVertex3fv(ver[c]);
glColor3fv(color[d]);
glVertex3fv(ver[d]);
glEnd();
void colorcube()
quad(0,3,2,1);
quad(2,3,7,6);
quad(0,4,7,3);
quad(1,2,6,5);
quad(4,5,6,7);
quad(0,1,5,4);
double rotate_y = 0;
double rotate_x = 0;
void specialKeys( int key, int x, int y )
if (key == GLUT_KEY_RIGHT)
rotate_y += 5;
else if (key == GLUT_KEY_LEFT)
rotate_y -= 5;
else if (key == GLUT_KEY_UP)
rotate_x += 5;
else if (key == GLUT_KEY_DOWN)
rotate_x -= 5;
glutPostRedisplay();
void display()
glClearColor( 0, 0, 0, 1 );
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
int w = glutGet( GLUT_WINDOW_WIDTH );
int h = glutGet( GLUT_WINDOW_HEIGHT );
gluPerspective( 60, w / h, 0.1, 100 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
gluLookAt
(
3, 3, 3,
0, 0, 0,
0, 0, 1
);
glRotatef( rotate_x, 1.0, 0.0, 0.0 );
glRotatef( rotate_y, 0.0, 1.0, 0.0 );
colorcube();
glutSwapBuffers();
int main( int argc, char **argv )
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE );
glutInitWindowSize( 640, 480 );
glutCreateWindow( "GLUT" );
glutDisplayFunc( display );
glutSpecialFunc( specialKeys );
glEnable( GL_DEPTH_TEST );
glutMainLoop();
return 0;
【讨论】:
太棒了,我编译并运行了上面的代码,它就像魔法一样美丽。以上是关于使用 Opengl 绘制 3D 立方体的主要内容,如果未能解决你的问题,请参考以下文章
在 android 中使用 opengl 在 glsurfaceview 中显示 3D 模型的问题
3D Computer Grapihcs Using OpenGL - 14 OpenGL Instancing