本文介绍了使用两种方法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>

二、glut工具箱函数

void glutWireSphere(GLdouble GLint,
GLint);  丝状球

void glutSolidSphere(GLdouble GLint,
GLint); 实心球

我们以丝状球为例。

函数原型:

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

版权声明:本文博主原创文章,博客,未经同意不得转载。

05-11 16:55