2017-09-18 12 views
1

ブレンダーで描いた.objファイルをロードしてGUIに表示しようとしていますが、やり方については少し失われています。いくつかのドキュメントは、いくつかの機能について非常に簡単な情報を提供しています。openGL - .objをロードしてGUIで描画すると失敗する

これは私がそれを書いているときに続いたtutorialです。

私は単に私のopenGLWidgetをどのように描画するかについて今考えていません。

これはthink-が何か私のGUIが表示されるはずです-I私のコードで、まだそれはしていません:

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    load_obj("/home/yalishanda/Desktop/car.obj", suzanne_vertices, suzanne_normals, suzanne_elements); 

    //enable all vertices attributes 
    for(int i=0;i<suzanne_vertices;i++) 
    { 
     glEnableVertexAttribArray(i); 
    } 

    GLuint buffer; 
    glBindBuffer(GL_ARRAY_BUFFER, buffer); 
    glVertexAttribPointer(
     0, 
     4, 
     GL_FLOAT, 
     GL_FALSE, 
     0, 
     0 
    ); 

    // glEnableVertexAttribArray(0); 
     GLuint buffer2; 
     glBindBuffer(GL_ARRAY_BUFFER, buffer2); 
     glVertexAttribPointer(
     0, 
     3, 
     GL_FLOAT,   // the type of each element 
     GL_FALSE,   // take our values as-is 
     0,     // no extra data between each position 
     0     // offset of first element 
    ); 

     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 
     int size; 
     glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size); 
     glDrawElements(GL_TRIANGLES, size/sizeof(GLushort), GL_UNSIGNED_SHORT, 0); 

     paintGL(); 

} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 


void MainWindow::load_obj(const char* filename, std::vector<QVector4D> &vertices, std::vector<QVector3D> &normals, std::vector<GLushort> &elements) 
{ 
    std::ifstream in(filename, std::ios::in); 
    if (!in) 
    { 
     std::cerr << "Cannot open " << filename << std::endl; exit(1); 
    } 

    std::string line; 
    while (std::getline(in, line)) 
    { 
     if (line.substr(0,2) == "v ") 
     { 
      std::istringstream s(line.substr(2)); 
      QVector4D v; 
      //s >> v.x; 
      //s >> v.y; 
      //s >> v.z; 
      //v.w = 1.0f; 
      float helpValue; 
      s>>helpValue; 
      v.setX(helpValue); 
      v.setY(helpValue); 
      v.setZ(helpValue); 
      v.setW(1.0f); 
      vertices.push_back(v); 
     } 
     else if (line.substr(0,2) == "f ") 
     { 
      std::istringstream s(line.substr(2)); 
      GLushort a,b,c; 
      s >> a; s >> b; s >> c; 
      a--; b--; c--; 
      elements.push_back(a); elements.push_back(b); elements.push_back(c); 
     } 
     else if (line[0] == '#') 
     { 
      /* ignoring this line */ 
     } 
     else 
     { 
      /* ignoring this line */ 
     } 
    } 

    normals.resize(vertices.size(), QVector3D(0.0, 0.0, 0.0)); 
    for (int i = 0; i < elements.size(); i+=3) 
    { 
     GLushort ia = elements[i]; 
     GLushort ib = elements[i+1]; 
     GLushort ic = elements[i+2]; 

     QVector3D difference = QVector3D::crossProduct(
     QVector3D(vertices[ib]) - QVector3D(vertices[ia]), 
     QVector3D(vertices[ic]) - QVector3D(vertices[ia])); 

     QVector3D normal = difference.normalized(); 
     normals[ia] = normals[ib] = normals[ic] = normal; 
    } 
} 

void MainWindow::initializeGL() 
{ 
    glClearColor(0,0,0,1); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_LIGHT0); 
    glEnable(GL_LIGHTING); 
    glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); 
    glEnable(GL_COLOR_MATERIAL); 
} 

void MainWindow::paintGL() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    //draw all the vertices 
    // I guess that here I should select my openGL widget somehow and draw the vertices *on* it 
    glBegin(GL_VERTEX4_BIT_PGI); 
     for(int i=0; i<suzanne_vertices.size();i++) 
     { 
      glVertex3f(suzanne_vertices.at(i).x, suzanne_vertices.at(i).y, suzanne_vertices.at(i).z); 
     } 

    glEnd(); 
} 

答えて

0

私はあなたがカメラを指定していないすべての最初と思いますか?

私は

glm::mat4 view = glm::lookAt(
    glm::vec3(0.0, 2.0, 4.0), // eye 
    glm::vec3(0.0, 0.0, 0.0), // direction 
    glm::vec3(0.0, 1.0, 0.0)); // up 
    glm::mat4 projection = glm::perspective(45.0f, 1.0f*screen_width/screen_height, 0.1f, 100.0f); 

OpenGLは初めに非常に苦痛ライブラリである、それはそれはあなたを教えてくれませんその他、正しいものをレンダリングするために、完全に正しいとパイプラインを必要とし、チュートリアルからこのスニペットを取りましたどこが間違っていますか?

また、マテリアルとライトを無効にし、レンダリングカラーを(緑色にして)最初に見たいものに設定することができます。マテリアルが正しく設定されていないと、すべてのものを取り除く。

+0

確かに。私は今どのように私のウィジェットに描画する方法を指定するのですか?これはまた私にエラー "glmはこの範囲で宣言されていません" – traducerad

+1

@ traderad私は1と言うだろう1.ビューポートを設定する2.何かをそこに描画する(単純な三角形や線のような)3.メッシュをインポートし、 4.材料を行う。一歩一歩踏み込んで、私はここでは限界のためにあまりに精巧にすることはできないと思う –

関連する問題