【问题标题】:How to rotate a cone around a line?如何围绕一条线旋转圆锥?
【发布时间】:2014-11-20 09:14:48
【问题描述】:

我在 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();
}

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

这部分我设法做到了。

但是,我不知道如何以某种方式围绕线旋转圆锥体,使其保持与线的连接?我不知道如何更好地描述它,但基本上它应该绕着线旋转。

我尝试使用以下方法,但无济于事:

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);

}

【问题讨论】:

    标签: opengl rotation glut freeglut


    【解决方案1】:

    你只需要 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 个参数构成了您要绕其旋转的轴。

    【讨论】:

    • 这最终会围绕直线旋转整个圆锥 - 我需要圆锥的顶点(顶点?)保持静止,而圆锥的其余部分围绕直线旋转。
    • 关于如何在保持圆锥顶点静止的同时旋转圆锥的任何线索?我的作业说要使用“正交投影”,所以这可能是一个线索。
    • @Tool 也许你应该更多地关注为什么而不是如何。 :) 正如棘轮怪胎告诉你的,旋转的枢轴点是错误的,它需要在线上。代码仍然正确,只是您没有正确调用它。
    猜你喜欢
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多