首页 > 代码库 > opengl画个球

opengl画个球

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

opengl画个球