我在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);
}
答案 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个参数构成您想要旋转的轴。