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();
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM