本文介绍两种方法用opengl绘制一个球体,一种是计算球面点的位置,然后画出来,另一种是glut工具箱自带的函数。
一、直接绘制法
直接贴代码,解释都写在注释里了。绘制时先移动好坐标系,然后调用这方法画就行。
<span style="font-family:SimSun;font-size:12px;">//球心坐标为(x,y,z),球的半径为radius,M,N分别表示球体的横纵向被分成多少份 void drawSphere(GLfloat xx, GLfloat yy, GLfloat zz, GLfloat radius, GLfloat M, GLfloat N) { float step_z = PI/M; <span style="white-space: pre;"> </span>//z方向每次步进的角度 float step_xy = 2*PI/N; <span style="white-space: pre;"> </span>//x,y平面每次步进的角度 float x[4],y[4],z[4]; <span style="white-space: pre;"> </span>//用来存坐标 float angle_z = 0.0; <span style="white-space: pre;"> </span>//起始角度 float angle_xy = 0.0; int i=0, j=0; glBegin(GL_QUADS); for(i=0; i<M; i++) { angle_z = i * step_z; <span style="white-space: pre;"> </span>//每次步进step_z for(j=0; j<N; j++) { angle_xy = j * step_xy; <span style="white-space: pre;"> </span>//每次步进step_xy <span style="white-space: pre;"> </span>//整个的过程可以想象3D打印机,一层一层的画出来 x[0] = radius * sin(angle_z) * cos(angle_xy); <span style="white-space: pre;"> </span>//第一个小平面的第一个顶点坐标 y[0] = radius * sin(angle_z) * sin(angle_xy); z[0] = radius * cos(angle_z); x[1] = radius * sin(angle_z + step_z) * cos(angle_xy); <span style="white-space: pre;"> </span>//第一个小平面的第二个顶点坐标,下面类似 y[1] = radius * sin(angle_z + step_z) * sin(angle_xy); z[1] = radius * cos(angle_z + step_z); x[2] = radius*sin(angle_z + step_z)*cos(angle_xy + step_xy); y[2] = radius*sin(angle_z + step_z)*sin(angle_xy + step_xy); z[2] = radius*cos(angle_z + step_z); x[3] = radius * sin(angle_z) * cos(angle_xy + step_xy); y[3] = radius * sin(angle_z) * sin(angle_xy + step_xy); z[3] = radius * cos(angle_z); <span style="white-space: pre;"> </span>//至此得到一个平面的4个顶点 for(int k=0; k<4; k++) { glVertex3f(xx+x[k], yy+y[k],zz+z[k]); <span style="white-space: pre;"> </span>//画出这个平面 } <span style="white-space: pre;"> </span> } <span style="white-space: pre;"> </span>//循环画出这一层的平面,组成一个环 } <span style="white-space: pre;"> </span>//z轴++,画出剩余层 glEnd(); <span style="white-space: pre;"> </span>//OK }</span>
void glutWireSphere(GLdouble radius, GLint slices, GLint stacks); 丝状球
void glutSolidSphere(GLdouble radius, GLint slices, GLint stacks); 实心球
我们以丝状球为例。
函数原型:
void glutWireSphere(GLdouble radius, GLint slices, GLint stacks);
参数介绍:
radius
球体的半径
slices
以Z轴上线段为直径分布的圆周线的条数(将Z轴看成地球的地轴,类似于经线)
stacks
围绕在Z轴周围的线的条数(类似于地球上纬线)
相对于半径,后两个参数赋予较大的值, 渲染出来的球体表面看不出来线条。此时众多线条已经构成比较紧密的球面。
在vs2012等高版本的IDE中运行会出现安全性错误“error LNK2026 模块对于 SAFESEH 映像是不安全的”
解决方法:http://jingyan.baidu.com/article/47a29f24334312c01423992e.html