利用opengl进行球体的建模

  今天用opengl建模了一个球体,接下来简单的介绍一下自己的实现方法。

    先用一张比较容易理解的图来说明。

如图所示,假设要建模一个单位球体,球上任意一点的坐标都可由图中所示公式表示。

接下来的代码将生成15层,每层33个顶点。

    for (float phi = phi_start+ step_size; phi < phi_end-1e-5; phi += step_size)
    {
        float cos_phi = cosf(phi);
        
        float sin_phi = sinf(phi);

        for (float theta = 0.f; theta < theta_end+1e-5f; theta += step_size)
        {
            float cos_theta = cosf(theta);
            float sin_theta = sinf(theta);
            vec_ver.push_back(Vertex(Vector3f<float>(cos_theta*cos_phi, sin_phi, sin_theta*cos_phi),Vector2f<float>(theta*pi2_inverse, phi*pi_inverse + 0.5f)));
        }
    }

以上代码生成了所有顶点,暂且忽略纹理坐标

注意浮点数的比较需要特殊处理

 

接下来需要生成索引坐标

i表示该点的位置,i+1为在该点右边的位置,i+33为在该点上面的位置,i+33+1,为在右上边的位置

    for (int hlevel = 0; hlevel < 14; hlevel++)
    {
        int index = (hlevel << 5)+hlevel; //hlevel * 33;
        for (int rlevel = 0; rlevel < 32; rlevel++)
        {
            int now_index = index + rlevel;

            int now_index_right = now_index + 1;
            
            int now_index_up = index + rlevel + 33;

            int now_index_right_up = now_index_right + 33;

            vec_index.push_back(now_index);
            vec_index.push_back(now_index_up);
            vec_index.push_back(now_index_right_up);

            vec_index.push_back(now_index);
            vec_index.push_back(now_index_right_up);
            vec_index.push_back(now_index_right);
        }
    }

以上代码就可以生成所有的索引上,注意我们采用的是左手坐标系。

 

接下来思考一个问题,纹理坐标要如何表示,实际上这并没有一个固定的表示方法,根据需求变化。

我采用的方法是

——

posted @ 2017-04-13 17:14  风轻云淡走天涯  阅读(6489)  评论(0编辑  收藏  举报