opengl空间画圆柱体
介绍:由于opengl库里并没有函数直接在三维空间绘制圆柱形的函数,所以需要用一种方法来实现在三维空间绘制圆柱体。
基本思路 : 要在空间AB两点间绘制一个圆柱体,可以先在y轴上画一个同等长度的圆柱,然后旋转平移到AB就可以了。
void cyLinder(float x0,float y0,float z0,float x1,float y1,float z1){ //如果要在AB两点间画一个圆柱体,其可以
//先在y轴上画一个同长度的圆柱,然后
//求出旋转矩阵,将其移至AB
GLdouble dir_x=x1-x0,
dir_y=y1-y0,
dir_z=z1-z0;
GLdouble cy_length=sqrt(dir_x*dir_x+dir_y*dir_y+dir_z*dir_z); //获得圆柱的长度
static GLUquadricObj* quad_obj=NULL;
if(quad_obj==NULL)
quad_obj=gluNewQuadric();
gluQuadricDrawStyle(quad_obj,GLU_FILL);
gluQuadricNormals(quad_obj,GLU_SMOOTH);
glPushMatrix(); //将当前矩阵压入矩阵堆栈
glTranslated(x0,y0,z0); //平移到起点,即A点
//获得AB的长度
double length;
length=sqrt(dir_x*dir_x+dir_y*dir_y+dir_z*dir_z);
dir_x/=length;dir_y/=length;dir_z/=length;
GLdouble up_x=0.0,
up_y=1.0,
up_z=0.0;
GLdouble side_x,side_y,side_z;
//实现向量的叉乘
side_x=up_y*dir_z-up_z*dir_y;
side_y=up_z*dir_x-up_x*dir_z;
side_z=up_x*dir_y-up_y*dir_x;
length=sqrt(dir_x*dir_x+dir_y*dir_y+dir_z*dir_z);
side_x/=length;side_y/=length;side_z/=length;
up_x=dir_y*side_z-dir_z*side_y;
up_y=dir_z*side_x-dir_x*side_z;
up_z=dir_x*side_y-dir_y*side_x;
//得到变换矩阵
GLdouble m[]={side_x,side_y,side_z,0.0,
up_x,up_y,up_z,0.0,
dir_x,dir_y,dir_z,0.0,
0.0,0.0,0.0,1.0};
glMultMatrixd(m); //用m矩阵乘以当前矩阵
GLdouble radius=0.5; //这些参数可以自己设置
GLdouble slices=8.0;
GLdouble stack=3.0;
gluCylinder(quad_obj,radius,radius,cy_length,slices,stack);
glPopMatrix();
}