首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在openGL / C++中为3d曲线添加可变性-球面坐标

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

Stack Overflow用户
提问于 2013-01-31 05:11:22
回答 1查看 151关注 0票数 0

使用球面坐标,我正在围绕球体的表面绘制一条圆弧。下面是我的代码:

代码语言:javascript
运行
复制
    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开往肯尼迪国际机场的航班,但走的路线略有不同。

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

代码语言:javascript
运行
复制
    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数学的理解太差了,我甚至不确定有没有办法做到这一点?如果没有,我将为我的设计寻找替代解决方案。但是,如果可以使用球面坐标绘制使用相同起点和终点位置的两个不同的圆弧,您的建议和指导将非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-31 05:30:40

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

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

采取一种不同的方法,请注意,连接球体表面上两点的直接路径是球体和通过这两点的平面之间的交集。如果你能绕着这两个点之间形成的轴旋转平面,交叉点就会给你提供替代的圆弧。

诀窍是计算它们。阅读平面-球面相交的内容。公式应该是一个椭圆形截面,所以它可能不会太差。那么你就不需要球面坐标了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14613857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档