スポンサーリンク

UV Sphereを描画(2)-頂点配列を作ってから表示

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(); } } }

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: