zoukankan      html  css  js  c++  java
  • 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();
    }

  • 相关阅读:
    jenkins+ant+jmeter实现自动化集成(详解)
    Android ADB命令 adb devices 出现error:protocol fault (no status)
    使用jmeter做接口测试
    估计新版本所需要的案例数量
    《将博客搬至CSDN》
    HDFS NN refreshNodes操作的可用性和效率的改进
    visudo: /etc/sudoers 忙,请稍后重试解决办法
    Java try与finally对返回值的影响
    Java中基本类型和包装类比较的问题
    Java中ArrayList去重方法
  • 原文地址:https://www.cnblogs.com/xiaoaiyi/p/3300725.html
Copyright © 2011-2022 走看看