在OpenGL中如何根据空间两点绘制圆柱?(www.c3dn.net)

来源:互联网 发布:特殊身份知乎 编辑:程序博客网 时间:2024/06/05 14:33

说明:本文来自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)


 


 



调用方法:


 

运行效果:

 

 

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