在OpenGL中如何根据空间两点绘制圆柱?

转载 2012年03月01日 22:59:57

说明:本文来自C3DN(中国3D技术开发社区  http://www.C3DN.net),转载请标明出处:

http://www.c3dn.net/forum.php?mod=viewthread&tid=13&extra=page%3D1

这几天做项目时需要根据已知的两个空间点AB绘制圆柱,琢磨了两天,昨晚终于大功告成,贴出来跟大家分享分享,请大家多多指教!


如图所示:

 

 

下面来介绍我们主要使用的几个OpenGL函数:


auxSolidCylinder(GLfloat radius,GLfloat length)

绘制的圆柱的上底面是固定的,而且是固定在当前坐标系中y=1.0f的平面上,以y轴为轴,随着指定高度的不同不断地向y轴负方向延伸.(从上图C点开始绘制)


glTranslatef(GLfloat x,GLfloat y,GLfloat z)

把当前矩阵和一个表示移动物体的矩阵相乘。三个参数分别表示了在三个坐标上的位移值。


glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLfloat z)

把当前矩阵和一个表示旋转物体的矩阵相乘。物体将绕着(0,0,0)到(x,y,z)的直线以逆时针旋转,参数angle表示旋转的角度。

注意:glRotatef()只使物体绕过原点的直线旋转,所以首先要把坐标系移到这个侧面的旋转轴上.

 

 

 


 

 

 


 

// 起始线段:以C(0,1,0)为起点,它的长度D(distance)通过目标线段计算,

//           终点坐标为(0,1-distance,0)

// 目标线段:以A(x1,y1,z1)为起点,以B(x2,y2,z2)为终点

 

 

 

目的:通过变换矩阵将起始线段CD平移、旋转到目标线段AB

步骤:

      1.根据A、B两点的坐标求出圆柱长度distance,然后就可以求出D点的坐标


 

      2.计算CD向量与AB向量的法向量(fx,fy,fz)以及CD与AB的夹角angle

        (1).求C'D',其中C'D'//CD,C'与A重合(这样C'D'和AB就在一个平面上,这两个空间线段的公共顶点是(2,4,5))

        (2).求C'D'和AB表示的“起始向量(sx,sy,sz)”和“目标向量(dx,dy,dz)”

        (3).由向量的叉积公式求出向量C'D'和向量AB的法向量(fx,fy,fz)

        (4).求出D'B的长度,这样,三角形AD'B每条边的长度都已知,根据三角形的余弦定理,求出角D'AB的度


 

      3.将起始线段CD的起点移动到原点(0,0,0) 


 

      4.使用glRotatef将CD绕着法向量(fx,fy,fz)旋转angle度,使CD与AB平行,即glRotatef(angel,fx,fy,fz)


 

 

      5.使用glTranslatef将旋转后的CD平移到AB位置,平移量为A点的坐标,即glTranslatef(x1,y1,z1)


 

 


 

 

  1. // 根据空间两点绘制圆柱  
  2. void   CPipeLineView::DrawChannel(GLfloat   x1, GLfloat   y1, GLfloat   z1,   GLfloat   x2,   GLfloat   y2,   GLfloat   z2   )   
  3. {   
  4.     // 起始线段:以(0,1,0)为起点,它的长度(distance)通过目标线段计算,  
  5.     //           终点坐标为(0,1-distance,0)  
  6.     // 目标线段:以(x1,y1,z1)为起点,以(x2,y2,z2)为终点  
  7.     // 计算目标向量  
  8.     GLfloat   dx   =   x2   -   x1;   
  9.     GLfloat   dy   =   y2   -   y1;   
  10.     GLfloat   dz   =   z2   -   z1;  
  11.     // 算出目标向量模(即AB长度)  
  12.     GLfloat   distance  =  sqrt(dx*dx + dy*dy + dz*dz);   
  13.     // 计算平移量  
  14.     GLfloat  px = x1;  
  15.     GLfloat  py = y1 - 1;  
  16.     GLfloat  pz = z1;  
  17.     // 起始线段的末端点  
  18.     GLfloat  bx = px;    
  19.     GLfloat  by = (1-distance) + py;  
  20.     GLfloat  bz = pz;  
  21.     // 计算起始向量  
  22.     GLfloat  sx = bx - x1;  
  23.     GLfloat  sy = by - y1;  
  24.     GLfloat  sz = bz - z1;  
  25.     // 计算向量(sx,sy,sz)与向量(dx,dy,dz)的法向量(sy*dz - dy*sz,sz*dx - sx*dz,sx*dy - dx*sy)  
  26.     GLfloat fx = sy*dz - dy*sz;  
  27.     GLfloat fy = sz*dx - sx*dz;  
  28.     GLfloat fz = sx*dy - dx*sy;  
  29.     // 求两向量间的夹角  
  30.     // 计算第三条边的长度  
  31.     GLfloat ax = fabs(x2 - bx);  
  32.     GLfloat ay = fabs(y2 - by);  
  33.     GLfloat az = fabs(z2 - bz);  
  34.     GLfloat length = sqrt(ax*ax + ay*ay + az*az);  
  35.     // 根据余弦定理计算夹角  
  36.     GLfloat angle = acos((distance*distance*2 - length*length)/(2*distance*distance))*180.0f/3.14159;  
  37.     // 绘制第一个点A   
  38.     glPushMatrix();   
  39.         glTranslatef(x1,y1,z1);   
  40.         auxSolidSphere(1);     
  41.     glPopMatrix();   
  42.     // 绘制圆柱   
  43.     glPushMatrix();   
  44.         // 变换的顺序与函数书写的顺序相反,  
  45.         // 即先平移(0,-1,0),再绕法向量旋转,最后再平移  
  46.         glTranslatef(x1,y1,z1);  
  47.         glRotatef(angle,fx,fy,fz);    
  48.         glTranslatef(0,-1,0);  
  49.         auxSolidCylinder(0.5,distance);  
  50.     glPopMatrix();  
  51.     // 绘制第二个点B  
  52.     glPushMatrix();   
  53.             glTranslatef(x2,y2,z2);   
  54.             auxSolidSphere(1);       
  55.     glPopMatrix();   
  56. };  


调用方法:

 


  1. DrawChannel(2,4,5,12,5,15);  

 

 

运行效果:

 

 

 

 

OK,OpenGL刚入门不久,请大家多多指教!

OpenGL: 任意两点间画圆柱体

1,问题提出两点间画线简单:glBegin(GL_LINES);  //注意是LINES不是LINE,这个错误一定要注意。 glVertexf(x1, y1, z1); glVertexf(x2, y...
  • Augusdi
  • Augusdi
  • 2014年02月26日 16:32
  • 6598

opengl圆柱体绘制

  • 2015年05月13日 23:12
  • 47KB
  • 下载

OpenGL之路(四)自制图形函数(正方体、圆柱、圆锥)

#include #include #include #pragma comment(lib, "opengl32.lib") #pragma comment(lib, "glut32.lib"...
  • xianyun2009
  • xianyun2009
  • 2014年09月17日 18:22
  • 3036

OpenGL函数封装:在任意两个三维点之间绘制给定半径的圆柱体管道

由于最近的需要在任意两个三维点直接绘制三维圆柱体管道,OpenGL太底层了,以至于什么东西都要自己写 在网上参考了如下的博客: http://blog.csdn.net/ryfdizuo/articl...
  • HW140701
  • HW140701
  • 2017年03月13日 19:46
  • 861

在OpenGL中如何根据空间两点绘制圆柱

这几天做项目时需要根据已知的两个空间点A、B绘制圆柱,琢磨了两天,昨晚终于大功告成,贴出来跟大家分享分享,请大家多多指教! 如图所示:     下面来介绍我们主要使用的几个Open...
  • zcj331
  • zcj331
  • 2014年04月11日 13:30
  • 765

OpenGL: 圆柱面绘制贴图

最近看到dx中的sample中有用顶点数组实现的圆柱体贴图的程序。于是自己写了一个圆柱体的类,支持生成纹理坐标,法线,坐标。构造圆柱体的参数主要有:水平分段数(就是上下圆的分段数目),高度上的分段数目...
  • Augusdi
  • Augusdi
  • 2014年02月26日 10:51
  • 6206

opengl 绘制实心圆柱体

glu中提供了一个绘制圆柱体的函数:    void gluCylinder( GLUquadric* quad,     GLdouble base,     GLdouble top, ...
  • hjq376247328
  • hjq376247328
  • 2015年06月07日 17:11
  • 3394

OpenGL之路(四)自制图形函数(正方体、圆柱、圆锥)

#include #include #include #pragma comment(lib, "opengl32.lib") #pragma comment(lib, "glut32.lib"...
  • xianyun2009
  • xianyun2009
  • 2014年09月17日 18:22
  • 3036

在OpenGL中如何根据空间两点绘制圆柱

这几天做项目时需要根据已知的两个空间点A、B绘制圆柱,琢磨了两天,昨晚终于大功告成,贴出来跟大家分享分享,请大家多多指教! 如图所示:     下面来介绍我们主要使用的几个Open...
  • zcj331
  • zcj331
  • 2014年04月11日 13:30
  • 765

Android OpenGL绘制圆柱类

  • 2015年07月01日 20:09
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在OpenGL中如何根据空间两点绘制圆柱?
举报原因:
原因补充:

(最多只允许输入30个字)