说明:本文来自C3DN(中国3D技术开发社区 http://www.C3DN.net),转载请标明出处:
http://www.c3dn.net/forum.php?mod=viewthread&tid=13&extra=page%3D1
这几天做项目时需要根据已知的两个空间点A、B绘制圆柱,琢磨了两天,昨晚终于大功告成,贴出来跟大家分享分享,请大家多多指教!
如图所示:
下面来介绍我们主要使用的几个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刚入门不久,请大家多多指教!