openGL下不依赖任何环境生成两点之间的圆柱体

直接上代码不废话,复制走直接用

改编自一个基于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();
}

如果有帮助请点个赞谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值