OpenGLで楕円体を描画する際の問題

thewoz

これは、シェーダーを備えたOpenGLで楕円体を作成および描画するために使用するコードです。

  const float _2pi = 2.0f * M_PI;

  std::vector<glm::vec3> positions;
  std::vector<glm::vec3> normals;
  std::vector<glm::vec2> textureCoords;

  for(int i = 0; i <= stacks; ++i) {

    // V texture coordinate
    float V = i / (float)stacks;
    float phi = V * M_PI;

    for( int j = 0; j <= slices; ++j) {

      // U texture coordinate
      float U = j / (float)slices;
      float theta = U * _2pi;

      float X = a * cos(theta) * cos(phi);
      float Y = b * cos(theta) * sin(phi);
      float Z = c * sin(theta);

      positions.push_back( glm::vec3( X, Y, Z) );
      normals.push_back( glm::vec3(X, Y, Z) );
      textureCoords.push_back( glm::vec2(U, V) );

    }

  }

  // Now generate the index buffer
  std::vector<GLuint> indicies;

  for(int i=0; i <slices*stacks+slices; ++i) {

    indicies.push_back(i);
    indicies.push_back(i + slices + 1);
    indicies.push_back(i + slices);

    indicies.push_back(i + slices + 1);
    indicies.push_back(i);
    indicies.push_back(i + 1);

  }

  glGenVertexArrays(1, &vao);
  glBindVertexArray(vao);

  glGenBuffers(4, vbo);

  glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
  glBufferData(GL_ARRAY_BUFFER, positions.size() * sizeof(glm::vec3), positions.data(), GL_STATIC_DRAW);
  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
  glEnableVertexAttribArray(0);

  glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
  glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(glm::vec3), normals.data(), GL_STATIC_DRAW);
  glVertexAttribPointer(2, 3, GL_FLOAT, GL_TRUE, 0, nullptr);
  glEnableVertexAttribArray(2);

  glBindBuffer(GL_ARRAY_BUFFER, vbo[2]);
  glBufferData(GL_ARRAY_BUFFER, textureCoords.size() * sizeof(glm::vec2), textureCoords.data(), GL_STATIC_DRAW);
  glVertexAttribPointer(8, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
  glEnableVertexAttribArray(8);

  glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, vbo[3]);
  glBufferData( GL_ELEMENT_ARRAY_BUFFER, indicies.size() * sizeof(GLuint), indicies.data(), GL_STATIC_DRAW);

  glBindVertexArray(0);
  glBindBuffer(GL_ARRAY_BUFFER, 0);
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

これは私がそれをレンダリングするために使用するコードですが:

  glBindVertexArray(vao);

  glEnableVertexAttribArray(0);

  if(style == glObject::STYLE::WIREFRAME) glDrawElements(GL_LINES,     (slices * stacks + slices) * 6, GL_UNSIGNED_INT, nullptr);
  if(style == glObject::STYLE::SOLID)     glDrawElements(GL_TRIANGLES, (slices * stacks + slices) * 6, GL_UNSIGNED_INT, nullptr);

  glBindVertexArray(0);

動作しているようですが、問題があります。画像を見ると、いくつかの頂点が間違った位置にあることがわかります。それは指標に関係していると思いますが、よくわかりません。使用するスタックまたはスライスの数によって異なることに気づきました

ここに画像の説明を入力してください

更新:

@ Rabbid76の提案を考慮に入れて、これが結果です。レンダリングで縮退した頂点と三角形はもうありません。ただし、レンダリングは@ Rabbid76のレンダリングと同じではなく、頂点の回転のようなものです。

ここに画像の説明を入力してください ここに画像の説明を入力してください

最後の:

これは、作成頂点とインデックスコードです。

      std::vector<glm::vec3> positions;
      std::vector<glm::vec3> normals;
      std::vector<glm::vec2> textureCoords;

      for(int i = 0; i <= stacks; ++i) {

        // V texture coordinate.
        float V = i / (float)stacks;
        float phi = V * M_PI;

        for( int j = 0; j <= slices; ++j) {

          // U texture coordinate.
          float U = j / (float)slices;
          float theta = U * 2.0f * M_PI;

          float X = cos(theta) * sin(phi);
          float Y = cos(phi);
          float Z = sin(theta) * sin(phi);

          positions.push_back( glm::vec3( X, Y, Z) * radius );
          normals.push_back( glm::vec3(X, Y, Z) );
          textureCoords.push_back( glm::vec2(U, V) );

        }

      }

      // Now generate the index buffer
      std::vector<GLuint> indicies;

      int noPerSlice = slices + 1;

      for(int i=0; i < stacks; ++i) {

        for (int j=0; j < slices; ++j) {

          int start_i = (i * noPerSlice) + j;

          indicies.push_back( start_i );
          indicies.push_back( start_i + noPerSlice + 1 );
          indicies.push_back( start_i + noPerSlice );

          indicies.push_back( start_i + noPerSlice + 1 );
          indicies.push_back( start_i );
          indicies.push_back( start_i + 1 );

        }

      }

      glGenVertexArrays(1, &vao);
      glBindVertexArray(vao);

      glGenBuffers(4, vbo);

      glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
      glBufferData(GL_ARRAY_BUFFER, positions.size() * sizeof(glm::vec3), positions.data(), GL_STATIC_DRAW);
      glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
      glEnableVertexAttribArray(0);

      glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
      glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(glm::vec3), normals.data(), GL_STATIC_DRAW);
      glVertexAttribPointer(2, 3, GL_FLOAT, GL_TRUE, 0, nullptr);
      glEnableVertexAttribArray(2);

      glBindBuffer(GL_ARRAY_BUFFER, vbo[2]);
      glBufferData(GL_ARRAY_BUFFER, textureCoords.size() * sizeof(glm::vec2), textureCoords.data(), GL_STATIC_DRAW);
      glVertexAttribPointer(8, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
      glEnableVertexAttribArray(8);

      glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[3]);
      glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicies.size() * sizeof(GLuint), indicies.data(), GL_STATIC_DRAW);

      glBindVertexArray(0);
      glBindBuffer(GL_ARRAY_BUFFER, 0);
      glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

これはレンダリングのものです:

    glBindVertexArray(vao);

    glEnableVertexAttribArray(0);

    if(style == glObject::STYLE::WIREFRAME) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    if(style == glObject::STYLE::SOLID)     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

    glDrawElements(GL_TRIANGLES, (slices * stacks + slices) * 6, GL_UNSIGNED_INT, nullptr);

    glBindVertexArray(0);
Rabbid76

あなたは混乱しましたphiそしてthetathetaは、範囲[0、2 * PI]内のスライスの円周の周りの点の角度です。phi範囲[-PI、PI]の南から北への点の角度です。

for (int i = 0; i <= stacks; ++i) {

    // V texture coordinate
    float V = i / (float)stacks;
    float phi = V * M_PI - M_PI/2.0;

    for ( int j = 0; j <= slices; ++j) {

        // U texture coordinate
        float U = j / (float)slices;
        float theta = U * _2pi;

        float X = a * cos(phi) * cos(theta);
        float Y = b * cos(phi) * sin(theta);
        float Z = c * sin(phi);

        positions.push_back( glm::vec3( X, Y, Z) );
        normals.push_back( glm::vec3(X, Y, Z) );
        textureCoords.push_back( glm::vec2(U, V) );
    }
}

スライスのポイント数(円周)はnoPerSlice = slices + 1です。クワッドのポイントの最初のインデックスはですstart_i = (i * noPerSlice) + j。ここiで、はスタックjのインデックススライスの周りのインデックスです。slices円周の周りに四角形を作成しstacksスライスを南から北に形成します。

int noPerSlice = slices + 1;
for(int i=0; i < stacks; ++i) {
    for (int j = 0; j < slices; ++j) {

        int start_i = (i * noPerSlice) + j;

        indicies.push_back( start_i );
        indicies.push_back( start_i + noPerSlice + 1 );
        indicies.push_back( start_i + noPerSlice );

        indicies.push_back( start_i + noPerSlice + 1 );
        indicies.push_back( start_i );
        indicies.push_back( start_i + 1 );
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

OpenGL3で3D立方体のエッジを描画する際に問題が発生する

分類Dev

正方形を描画するときのOpenGL円半径の問題

分類Dev

OpenGLは円の代わりに楕円を描画します

分類Dev

JLabelで楕円形の画像を描画する方法

分類Dev

Matlab を使用して楕円体を描画する方法

分類Dev

生のOpenGL呼び出しでQmlアイテムを描画する際の問題

分類Dev

JFrameで線を描画する際の問題

分類Dev

iOS7でCGContextを使用して描画する際の問題

分類Dev

mvpを使用してopenglで楕円を描画するにはどうすればよいですか

分類Dev

OpenGLで楕円形または楕円形の光源を作成しますか?

分類Dev

QPainterで単色の楕円(黒い境界線なし)を描画する方法

分類Dev

p5.jsで描画した楕円の半径を変更するには?

分類Dev

線の太さでPythonPILで楕円を描画します

分類Dev

JFrameで長方形と楕円を描画する方法

分類Dev

ポリゴンを使用してopenglで楕円体をモデル化する方法

分類Dev

ポリゴンを使用してopenglで楕円体をモデル化する方法

分類Dev

JPanelに楕円を描くのに問題がある

分類Dev

JavaScriptでforループを使用してCanvasを描画する際の問題

分類Dev

内部の描画でUIViewを回転させる際の問題

分類Dev

OpenGL:コードで楕円を生成する

分類Dev

タートルグラフィックス(Python)で楕円/楕円をどのように描画しますか?

分類Dev

HashSetに構造体を挿入する際の借用の問題

分類Dev

HashSetに構造体を挿入する際の借用の問題

分類Dev

構造体の配列を初期化する際の問題C ++

分類Dev

AMD / ATI FireGLV3300でOpenGL2.1を> 3に更新する際の問題

分類Dev

d3とnumericjsを使用してJavaScriptでエラー楕円を描画する

分類Dev

d3とnumericjsを使用してJavaScriptでエラー楕円を描画する

分類Dev

HTML5キャンバスで楕円形を描画する方法は?

分類Dev

楕円角の計算と点の計算に関する問題

Related 関連記事

  1. 1

    OpenGL3で3D立方体のエッジを描画する際に問題が発生する

  2. 2

    正方形を描画するときのOpenGL円半径の問題

  3. 3

    OpenGLは円の代わりに楕円を描画します

  4. 4

    JLabelで楕円形の画像を描画する方法

  5. 5

    Matlab を使用して楕円体を描画する方法

  6. 6

    生のOpenGL呼び出しでQmlアイテムを描画する際の問題

  7. 7

    JFrameで線を描画する際の問題

  8. 8

    iOS7でCGContextを使用して描画する際の問題

  9. 9

    mvpを使用してopenglで楕円を描画するにはどうすればよいですか

  10. 10

    OpenGLで楕円形または楕円形の光源を作成しますか?

  11. 11

    QPainterで単色の楕円(黒い境界線なし)を描画する方法

  12. 12

    p5.jsで描画した楕円の半径を変更するには?

  13. 13

    線の太さでPythonPILで楕円を描画します

  14. 14

    JFrameで長方形と楕円を描画する方法

  15. 15

    ポリゴンを使用してopenglで楕円体をモデル化する方法

  16. 16

    ポリゴンを使用してopenglで楕円体をモデル化する方法

  17. 17

    JPanelに楕円を描くのに問題がある

  18. 18

    JavaScriptでforループを使用してCanvasを描画する際の問題

  19. 19

    内部の描画でUIViewを回転させる際の問題

  20. 20

    OpenGL:コードで楕円を生成する

  21. 21

    タートルグラフィックス(Python)で楕円/楕円をどのように描画しますか?

  22. 22

    HashSetに構造体を挿入する際の借用の問題

  23. 23

    HashSetに構造体を挿入する際の借用の問題

  24. 24

    構造体の配列を初期化する際の問題C ++

  25. 25

    AMD / ATI FireGLV3300でOpenGL2.1を> 3に更新する際の問題

  26. 26

    d3とnumericjsを使用してJavaScriptでエラー楕円を描画する

  27. 27

    d3とnumericjsを使用してJavaScriptでエラー楕円を描画する

  28. 28

    HTML5キャンバスで楕円形を描画する方法は?

  29. 29

    楕円角の計算と点の計算に関する問題

ホットタグ

アーカイブ