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

标签 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();

我想再画一条弧线,它有相同的开始和结束位置。问题是,不是让第二条弧遵循与第一条完全相同的轨迹,我能否调整我的数学以便弧中存在可变性?例如,第二个弧线的路径与第一个弧线略有不同。就像从 DFW 飞往 JFK 的两类航类,但航线略有不同。

第二个弧的代码如下(注意:两者之间的唯一区别是“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数学的理解很差,我什至不确定是否有办法做到这一点?如果没有,我会为我的设计寻找替代解决方案。但是,如果可以使用球坐标绘制两条不同的弧,这些弧采用​​相同的开始和结束位置,将不胜感激您的建议和指导。

最佳答案

您可以尝试计算球坐标中的 B 样条。您可以在每个端点放置两个结,并在中间放置一个结,您可以插入它(垂直于最短弧线)来调整可变性。

我相信您正在计算从 AB 的最短弧线,除非点正好相反,否则只有一条最短弧线。因此,您需要球形空间中的曲线而不是直线。


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

诀窍是计算它们。阅读平面球相交。该公式应该是一个椭圆截面,所以它可能不会太糟糕。那么你不需要球面坐标。

关于c++ - 如何为我的 3d 曲线添加可变性 - openGL/C++ 中的球面坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14613857/

相关文章:

c++ - 如何使用 boost 从多个 regex-en 组合一个 regex

javascript - 在时间轴上定位条目

c++ - 顶点可以在凸多边形中重合吗?

algorithm - 长度为k的所有子数组的元素乘积之和

algorithm - 测验评分算法,用于衡量答案的接近程度

java - LWJGL 可以与 Graphics2D 一起使用吗?

c++ - 具有固定功能管道的一维纹理查找表

c++ - 读取txt文件的行和列的最佳方法

c++ - 我可以将项目链接到与我使用的库不同的 _ITERATOR_DEBUG_LEVEL 吗?

C++ 如何通过超出大小向指针数组添加元素