opengl画个球

本文介绍两种方法用opengl绘制一个球体,一种是计算球面点的位置,然后画出来,另一种是glut工具箱自带的函数。

一、直接绘制法

直接贴代码,解释都写在注释里了。绘制时先移动好坐标系,然后调用这方法画就行。

//球心坐标为(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;  		//z方向每次步进的角度
 float step_xy = 2*PI/N;  	//x,y平面每次步进的角度
 float x[4],y[4],z[4];  	//用来存坐标
  
 float angle_z = 0.0;  		//起始角度
 float angle_xy = 0.0;  
 int i=0, j=0;  
 glBegin(GL_QUADS);  
  for(i=0; i	//每次步进step_z
     
   for(j=0; j	//每次步进step_xy
  								//整个的过程可以想象3D打印机,一层一层的画出来
    x[0] = radius * sin(angle_z) * cos(angle_xy);  		//第一个小平面的第一个顶点坐标
    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);  	//第一个小平面的第二个顶点坐标,下面类似
    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);  
  								//至此得到一个平面的4个顶点
    for(int k=0; k<4; k++)  
    {  
     glVertex3f(xx+x[k], yy+y[k],zz+z[k]);  			//画出这个平面
    }  								
   } 								//循环画出这一层的平面,组成一个环
  }  								//z轴++,画出剩余层
 glEnd();  							//OK
}


二、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)