UV球の頂点配列を作成する。
UV球は物凄く簡単に言うとStack×Sectorのグリッドを丸めた物なので、二次元画像のようにWidth×Heightの配列として表現可能。
ただし例えば10の要素数の場合、0~10が必要になるのでループ回数は+1する事になる。
さらにこの作成方法では重複する頂点が出てくるので、それを嫌う場合はもう少し工夫が必要になる。
struct UVSphere { std::vector<glm::vec3> points; int stackCount; int SectorCount; };
// 球の頂点配列を作成 UVSphere create_uv_sphere(const int stackCount, const int SectorCount, const float r) { std::vector<glm::vec3> points; for (int stackStep = 0; stackStep < stackCount+1; stackStep++) { for (int sectorStep = 0; sectorStep < SectorCount+1; sectorStep++) { points.push_back(getPoint(sectorStep, SectorCount, stackStep, stackCount, r)); } } return UVSphere{ points, stackCount, SectorCount }; }
// 頂点配列から球を描画
void draw_uv_sphere(const UVSphere& uvq) { int Width = uvq.SectorCount+1; int Height = uvq.stackCount+1; for (int y = 0; y < Height - 1; y++) { for (int x = 0; x < Width - 1; x++) { int x2 = x + 1; int y2 = y + 1; int i1 = y * Width + x; int i2 = y2 * Width + x; int i3 = y2 * Width + x2; int i4 = y * Width + x2; glm::vec3 k1 = uvq.points[i1]; glm::vec3 k2 = uvq.points[i2]; glm::vec3 k3 = uvq.points[i3]; glm::vec3 k4 = uvq.points[i4]; // 四角形で描画 glBegin(GL_LINE_LOOP); glVertex3fv(glm::value_ptr(k1)); glVertex3fv(glm::value_ptr(k2)); glVertex3fv(glm::value_ptr(k3)); glVertex3fv(glm::value_ptr(k4)); glEnd(); } } }