如何围绕直线旋转圆锥?

时间:2014-11-20 09:14:49

标签: opengl rotation glut freeglut

我在3d中有一行:

void line() {
    glBegin(GL_LINES);
    glColor3f(1.0f, 0.0f, 0.0f);
    glVertex3f(-3.0f, 10.0f, 0);
    glVertex3f(7.0f, -10.0f, 0);
    glEnd();
}

还有一个圆锥:

void cone(GLdouble r, GLdouble h, int n) {

    GLdouble fi;
    double dphi = 2*M_PI / n;

    glBegin(GL_LINE_LOOP);
    for (fi = 0; fi < 2*M_PI; fi += dphi) {
        glVertex3f(0, 0, h);
        glVertex3f(r*cos(fi), r*sin(fi), 0);
        glVertex3f(r*cos(fi+dphi), r*sin(fi+dphi), 0);
    }
    glEnd();
}

现在,该线应该位于锥体的“地幔”上(我不确定表达式,但这是一张图片):

enter image description here

这部分我设法做到了。

但是,我不知道如何以一种方式围绕线旋转圆锥体,以便它保持连接到线上?我不确定如何更好地描述它,但基本上它应该绕着线旋转。

我尝试使用以下内容,但无济于事:

void rotate_around_line(GLdouble x0, GLdouble y0, GLdouble z0, GLdouble u1, GLdouble u2, GLdouble u3, GLdouble kut)
{
    double vek[3] = { u1 - x0, u2 - y0, u3 - z0 };

    double norm = sqrt(vek[0] * vek[0] + vek[1] * vek[1] + vek[2] * vek[2]);

    vek[0] /= norm;
    vek[1] /= norm;
    vek[2] /= norm;

    double d1 = sqrt(vek[1] * vek[1] + vek[2] * vek[2]);
    if (d1 == 0.0D)
    {
        glRotatef(kut, 1, 0, 0);
        return;
    }

    double d2 = 180*(asin(vek[1] / d1)) / M_PI;;
    double d3 = 180*(asin(vek[0])) / M_PI;

    glTranslatef(x0, y0, z0);
    glRotatef(-d2, 1, 0, 0);
    glRotatef(d3, 0, 1, 0);
    glRotatef(kut, 0, 0, 1);
    glRotatef(-d3, 0, 1, 0);
    glRotatef(d2, 1, 0, 0);
    glTranslatef(-x0, -y0, -z0);

}

1 个答案:

答案 0 :(得分:2)

你只需要1次轮换电话

void rotate_around_line(GLdouble x0, GLdouble y0, GLdouble z0, GLdouble u1, GLdouble u2, GLdouble u3, GLdouble kut)
{
    double vek[3] = { u1 - x0, u2 - y0, u3 - z0 };


    glTranslatef(x0, y0, z0);
    glRotatef(-kut, vek[0], vek[1], vek[2]);
    glTranslatef(-x0, -y0, -z0);
}

glRotatef的最后3个参数构成您想要旋转的轴。