直接上代码不废话,复制走直接用
改编自一个基于aux的程序,由于改动比较大,所以不上链接了,没有意义。
void CylinderGLUTQuick(float x1, float y1, float z1, float x2, float y2, float z2, float r, int s, int l)
{
// x1,y1,z1为第一个点的坐标。x2,y2,z2为第二个点的坐标。r为半径。s为轴向分段数量。l为径向分段数量。s与l决定了圆柱的品质。
// 计算目标向量
GLfloat dx = x2 - x1;
GLfloat dy = y2 - y1;
GLfloat dz = z2 - z1;
// 算出目标向量模(即AB长度)
GLfloat distance = sqrt(dx*dx + dy*dy + dz*dz);
// 计算平移量
GLfloat px = x1;
GLfloat py = y1;
GLfloat pz = z1;
// 起始线段的末端点
GLfloat bx = px;
GLfloat by = py;
GLfloat bz = pz + distance;
// 计算起始向量
GLfloat sx = bx - x1;
GLfloat sy = by - y1;
GLfloat sz = bz - z1;
// 计算向量(sx,sy,sz)与向量(dx,dy,dz)的法向量(sy*dz - dy*sz,sz*dx - sx*dz,sx*dy - dx*sy)
GLfloat fx = sy*dz - dy*sz;
GLfloat fy = sz*dx - sx*dz;
GLfloat fz = sx*dy - dx*sy;
// 求两向量间的夹角
// 计算第三条边的长度
GLfloat ax = fabs(x2 - bx);
GLfloat ay = fabs(y2 - by);
GLfloat az = fabs(z2 - bz);
GLfloat length = sqrt(ax*ax + ay*ay + az*az);
// 根据余弦定理计算夹角
GLfloat angle = acos((distance*distance*2 - length*length)/(2*distance*distance))*180.0f/3.14159;
glPushMatrix();
glTranslatef(x1,y1,z1);
glRotatef(angle,fx,fy,fz);
float ad = 3.1415926*2/l;
float bd = distance/s;
for(int i=0;i<l;i++)
{
for(int j=0;j<s;j++)
{
glBegin(GL_POLYGON);
glNormal3f(cos((i+0.5)*ad),sin((i+0.5)*ad),0);
glVertex3f(r*cos(i*ad),r*sin(i*ad),j*bd);
glVertex3f(r*cos((i+1)*ad),r*sin((i+1)*ad),j*bd);
glVertex3f(r*cos((i+1)*ad),r*sin((i+1)*ad),(j+1)*bd);
glVertex3f(r*cos(i*ad),r*sin(i*ad),(j+1)*bd);
glEnd();
}
}
glPopMatrix();
}