【问题标题】:How to generate geometry for part of a sphere如何为球体的一部分生成几何图形
【发布时间】:2019-12-12 19:23:58
【问题描述】:

生成渲染球体所需点的算法很少,但我找不到一个好的算法,也找不到一个完整的球体算法来为球体的一部分生成点。

假设我有最小/最大纬度、最小/最大经度和球体半径。如何生成能够渲染球体的这一部分的网格?

【问题讨论】:

    标签: opengl 3d geometry


    【解决方案1】:

    我制作了半球和半球网格的一部分。我稍微编辑了 Songho Ahn 的源代码,您可以参考以下链接:

    http://www.songho.ca/opengl/gl_sphere.html

    class Sphere的主要方法是buildVertices*

    你可以通过编辑这个方法得到想要的结果。

    我做了这样的半球:

    void HemiSphere::buildVerticesSmooth()
    {
    ...
    
    float sectorStep = 2 *PI / sectorCount;
    float stackStep = (PI / 2) / stackCount;
    float sectorAngle, stackAngle;
    
    for(int i = 0; i <= stackCount; ++i)
    {
        stackAngle = -PI / 2 + i * stackStep;                   // starting from -pi/2 to 0
        xy = radius * cosf(stackAngle);             // r * cos(u)
        z = radius *( 1 + sinf(stackAngle) );              // r * sin(u)
    ...
    

    我还制作了半球体,切割了它的地板,这样它的底部就有了均匀的地板。为此,保持 x y 坐标不变,只需将 z 坐标编辑为 0。

    void HemiSphere::buildVerticesSmooth()
    {
    
    ....
    
    float sectorStep = 2 *PI / sectorCount;
    float stackStep = (PI / 2) / stackCount;
    float sectorAngle, stackAngle;
    float d = sqrt(radius*radius - flat_radius*flat_radius)/radius;
    
    for(int i = 0; i <= stackCount; ++i)
    {
        stackAngle = -PI / 2 + i * stackStep;                   // starting from -pi/2 to 0
        xy = radius * cosf(stackAngle);             // r * cos(u)
        z = radius *( d + sinf(stackAngle) );              // r * sin(u)
        if (z<0.0) z = 0.0;
    
    ....
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-03-28
      • 2014-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多