如何在我的3d曲线中添加可变性 - openGL / C ++中的球形坐标

时间:2013-01-30 21:11:22

标签: c++ math opengl

使用球面坐标,我在球体表面周围绘制一个圆弧。这是我的代码:

    int goose1a_egg1_step = 0; // THIS IS INCREMENTED EACH FRAME
    float goose1a_egg1_theta=7.5; // START THETA
    float goose1a_egg1_phi=4; // START PHI
    float goose1a_egg1_theta_increment = 1.5/goose1a_egg1_divider; // END THETA = 6
    float goose1a_egg1_phi_increment = 3/goose1a_egg1_divider; // END PHI = 1

    float goose1a_egg1_theta_math1 = (goose1a_egg1_theta-(goose1a_egg1_theta_increment* r_goose1a_egg1_step))/10.0*M_PI;
    float goose1a_egg1_phi_math1 = (goose1a_egg1_phi-(goose1a_egg1_phi_increment* r_goose1a_egg1_step))/10.0*2*M_PI;
    r_goose1a_egg1_x = radius_egg_pos * sin(goose1a_egg1_theta_math1) * cos(goose1a_egg1_phi_math1);
    r_goose1a_egg1_y = radius_egg_pos * sin(goose1a_egg1_theta_math1) * sin(goose1a_egg1_phi_math1);
    r_goose1a_egg1_z = radius_egg_pos * cos(goose1a_egg1_theta_math1);  

    glPushMatrix();
    glTranslatef(r_goose1a_egg1_x,r_goose1a_egg1_y,r_goose1a_egg1_z);
    glColor3f (1, 1, .8);
    glutSolidSphere (0.02,5,5);
    glEnd();
    glPopMatrix();

我想绘制一个额外的弧,它具有相同的START和END位置。问题是,不是让第二个弧遵循与第一个弧完全相同的轨迹,我可以调整我的数学运算以使弧变化吗?例如,第二个弧将从第一个弧传播稍微不同的路径。就像两架飞机离开DFW换乘肯尼迪国际机场,但路线略有不同。

第二个弧的代码如下(注意:两者之间的唯一区别是“goose1a”和“goose1b” - 我不想在这里添加一堆我随机乘以随机变量通过随机整数:/)

    int goose1b_egg1_step = 0; // THIS IS INCREMENTED EACH FRAME
    float goose1b_egg1_theta=7.5; // START THETA
    float goose1b_egg1_phi=4; // START PHI
    float goose1b_egg1_theta_increment = 1.5/goose1b_egg1_divider; // END THETA = 6
    float goose1b_egg1_phi_increment = 3/goose1b_egg1_divider; // END PHI = 1

    float goose1b_egg1_theta_math1 = (goose1b_egg1_theta-(goose1b_egg1_theta_increment* r_goose1b_egg1_step))/10.0*M_PI;
    float goose1b_egg1_phi_math1 = (goose1b_egg1_phi-(goose1b_egg1_phi_increment* r_goose1b_egg1_step))/10.0*2*M_PI;
    r_goose1b_egg1_x = radius_egg_pos * sin(goose1b_egg1_theta_math1) * cos(goose1b_egg1_phi_math1);
    r_goose1b_egg1_y = radius_egg_pos * sin(goose1b_egg1_theta_math1) * sin(goose1b_egg1_phi_math1);
    r_goose1b_egg1_z = radius_egg_pos * cos(goose1b_egg1_theta_math1);  

    glPushMatrix();
    glTranslatef(r_goose1b_egg1_x,r_goose1b_egg1_y,r_goose1b_egg1_z);
    glColor3f (1, 1, .8);
    glutSolidSphere (0.02,5,5);
    glEnd();
    glPopMatrix();

因为我对3D数学的理解很差,我甚至不确定是否有办法做到这一点?如果没有,我会为我的设计寻找替代解决方案。但是如果可以使用球面坐标绘制两个使用相同START和END位置的不同弧,那么您的建议和指导将非常受欢迎。

1 个答案:

答案 0 :(得分:1)

您可以尝试在球坐标中计算B样条。你可以在每个终点放置两个结,并在中间有一个结可以推动(垂直于最短的弧)以调整变化。

我相信你正在计算从AB的最短弧,除非这些点完全相反,否则只有一个最短弧。所以你需要一个球形空间而不是一条直线的曲线。


采用不同的方法,请注意连接球体表面上两个点的直接路径是球体和穿过这两个点的平面之间的交点。如果您可以围绕在这两个点之间形成的轴旋转该平面,则交点将为您提供替代弧。

诀窍是计算它们。阅读平面球体交叉点。公式应该是一个椭圆形的部分,所以它可能不会太糟糕。那你就不需要球形坐标。