2015-07-01 41 views
4

我爲ASCII STL格式寫了一個簡單的解析器。當我嘗試呈現與所提供的法線三角形,生成的對象是缺少許多面孔:顯示STL數據時丟失面孔

這是應該的樣子:

我已經嘗試過:

  • 明確禁用背面剔除(雖然它本來不應該是活躍的)
  • 保證深度緩衝區被啓用

這裏是其再現誤差的最小樣品的程序:

#include <SDL2/SDL.h> 
#include <SDL2/SDL_main.h> 
#include <SDL2/SDL_render.h> 
#include <SDL2/SDL_opengl.h> 

int main(int argc, char **argv) { 
    SDL_Init(SDL_INIT_VIDEO); 
    int screen_w=1280,screen_h=720; 
    SDL_Window * win = SDL_CreateWindow("test", 20, 20, screen_w, screen_h, 
      SDL_WINDOW_OPENGL); 
    SDL_GLContext glcontext = SDL_GL_CreateContext(win); 


    STLParser stlparser; 
    std::ifstream file(".\\logo.stl"); 
    stlparser.parseAscii(file); 
    const auto& ndata = stlparser.getNData(); 
    const auto& vdata = stlparser.getVData(); 
    std::cout << "number of facets: " << ndata.size() << std::endl; 

    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 


    glMatrixMode(GL_PROJECTION | GL_MODELVIEW); 
    glLoadIdentity(); 
    glScalef(1.f, -1.f, 1.f); 
    glOrtho(0, screen_w, 0, screen_h, -screen_w, screen_w); 

    glClearDepth(1.0f); 
    glDepthFunc(GL_LEQUAL); 
    glEnable(GL_DEPTH_TEST); 

    glDisable(GL_CULL_FACE); 

    glEnableClientState(GL_NORMAL_ARRAY); 
    glEnableClientState(GL_VERTEX_ARRAY); 

    glNormalPointer(GL_FLOAT, 0, ndata.data()); 
    glVertexPointer(3, GL_FLOAT, 0, vdata.data()); 

    SDL_Event event; 
    bool quit = false; 

    while (!quit) { 
     while (SDL_PollEvent(&event)) 
      switch(event.type) { 
      case SDL_QUIT: quit = true; break; 
      } 
      ; 
     // Drawing 
     glClearColor(255,255,255,255); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

     glTranslatef(screen_w/2,0,0); 
     glRotatef(0.5,0,1,0); 
     glTranslatef(-screen_w/2,0,0); 


     glPushMatrix(); 
     glTranslatef(screen_w/2,screen_h/2,0); 


     glColor3f(0.5,0.5,0); 
     glDrawArrays(GL_TRIANGLES, 0, vdata.size()); 

     glPopMatrix(); 


     SDL_GL_SwapWindow(win); 

     SDL_Delay(10); 
    } 
    SDL_DestroyWindow(win); 
    SDL_Quit(); 
    return 0; 
} 

的STLParser方法getNData()getVData()具有以下特徵:

const std::vector<std::array<float,3>>& getNData() const; 
const std::vector<std::array<std::array<float,3>,3>>& getVData() const; 

STLParser輸出應該是正確的,但如果需要,我也可以提供源代碼。

我在做什麼錯?

+2

「stlparser輸出應該是正確的」。是嗎? – Robinson

+1

@Robinson是的,我甚至在嘗試渲染數據之前就測試過它。儘管謝謝! – TheBender

回答

7

你應該改變

glDrawArrays(GL_TRIANGLES, 0, vdata.size()); 

glDrawArrays(GL_TRIANGLES, 0, 3 * vdata.size()); 

count應該是頂點數,但不是三角形數。