利用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); } }
以上代码就可以生成所有的索引上,注意我们采用的是左手坐标系。
接下来思考一个问题,纹理坐标要如何表示,实际上这并没有一个固定的表示方法,根据需求变化。
我采用的方法是
——