Форум программистов, компьютерный форум CyberForum.ru

Чтение OBJ модели и выгрузка её в VBO - C++

Восстановить пароль Регистрация
 
Qadabr
2 / 2 / 1
Регистрация: 12.05.2013
Сообщений: 32
19.04.2014, 01:28     Чтение OBJ модели и выгрузка её в VBO #1
Здравствуйте!
Я очень долго мучился с загрузкой модели формата ".obj". Все таки победив, смог корректно загрузить её. Но, когда я попытался средствами OpenGL отобразить модель на экране, то столкнулся с выбросом исключения. Продебажив все хорошенько, стало понятно, что ошибка, скорее всего, находится в функции Load(). Но эта функция не видоизменялась с тех пор, когда я её тестил в консоли. Ниже приведу класс OBJ_Static и функцию main().

OBJ.hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <vector>
#include <string>
#include <fstream>
#include <GL\glew.h>
 
#ifndef OBJ_HPP
#define OBJ_HPP
 
class OBJ_Static
{
private:
    struct vec2
    {
        float x, y;
    };
 
    struct vec3
    {
        float x, y, z;
    };
 
    struct face
    {
        vec3 v, vn;
        vec2 vt;
    };
 
    std::vector<vec3> v, vn;
    std::vector<vec2> vt;
    unsigned self_num;
    GLuint self_vbo;
    bool textured;
    char *path;
    vec3 pos;
 
    static unsigned amount;
 
public:
    bool loaded;
    std::vector<face> faces;
 
    OBJ_Static();
    OBJ_Static(char *_path, bool _loadnow);
    ~OBJ_Static();
 
    void MoveTo(float x, float y, float z);
    void GetPos(float x, float y, float z);
    bool Load();
    void Draw();
};
 
#endif
OBJ.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include "OBJ.hpp"
 
unsigned OBJ_Static::amount = 0;
 
OBJ_Static::OBJ_Static()
{
    loaded = false;
 
    pos.x = 0;
    pos.y = 0;
    pos.z = 0;
 
    self_num = ++amount;
 
    //glGenBuffers(self_num, &self_vbo);
}
 
OBJ_Static::OBJ_Static(char *_path, bool _loadnow)
{
    path = _path;
    pos.x = 0;
    pos.y = 0;
    pos.z = 0;
 
    self_num = ++amount;
    glGenBuffers(self_num, &self_vbo);
 
    if (_loadnow)
        loaded = Load();
    else
        loaded = false;
}
 
OBJ_Static::~OBJ_Static()
{
}
 
bool OBJ_Static::Load()
{
    std::ifstream file;
    file.open(path);
    if (!file.is_open()) return false;
 
    std::string l;
 
    while (!file.eof())
    {
        getline(file, l);
        if (l.size() < 7) continue;
 
        if (l[0] == 'v')
        {
            if (l[1] == ' ')
            {
                vec3 vec;
                sscanf_s(l.c_str(), "v %f%f%f", &vec.x, &vec.y, &vec.z);
                v.push_back(vec);
            }
            else
            if (l[1] == 't')
            {
                vec2 vec;
                sscanf_s(l.c_str(), "vt %f%f", &vec.x, &vec.y);
                vt.push_back(vec);
            }
            else
            if (l[1] == 'n')
            {
                vec3 vec;
                sscanf_s(l.c_str(), "vn %f%f%f", &vec.x, &vec.y, &vec.z);
                vn.push_back(vec);
            }
        }
        else
        if (l[0] == 'f')
        {
            unsigned f[9];
            sscanf_s(l.c_str(), "f %d/%d/%d%d/%d/%d%d/%d/%d",
                &f[0],&f[1],&f[2],&f[3],&f[4],&f[5],&f[6],&f[7],&f[8]);
 
            face fc;
            for (int i = 0; i < 9; i += 3)
            {
                fc.v = v[f[i] - 1];
                fc.vt = vt[f[i + 1] - 1];
                fc.vn = vn[f[i + 2] - 1];
 
                faces.push_back(fc);
            }
        }
    }
 
    file.close();
 
    glBindBuffer(GL_ARRAY_BUFFER, self_vbo);
    glBufferData(GL_ARRAY_BUFFER, v.size() * sizeof(vec3),
        &v[0], GL_STATIC_DRAW);
    glVertexPointer(3, GL_FLOAT, 0, NULL);
    glBindBuffer(GL_ARRAY_BUFFER, self_vbo);
 
    return true;
}
 
void OBJ_Static::Draw()
{
    if (!loaded) return;
 
    glEnableClientState(GL_VERTEX_ARRAY);
    glDrawArrays(GL_TRIANGLES, 0,
        v.size() * sizeof(vec3) / sizeof(float) / 3);
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <GL/glew.h>
#include <SFML/Graphics.hpp>
#include <SFML/OpenGL.hpp>
 
#include "OBJ.hpp"
 
int main()
{
    OBJ_Static model = OBJ_Static("lich.obj", true);
    // Create the main window
    sf::RenderWindow App(sf::VideoMode(800, 600, 32), "SFML OpenGL");
 
    // Create a clock for measuring time elapsed
    sf::Clock Clock;
    
    //prepare OpenGL surface for HSR
    glClearDepth(1.f);
    glClearColor(0.3f, 0.3f, 0.3f, 0.f);
    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);
 
    //// Setup a perspective projection & Camera position
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(90.f, 1.f, 1.f, 300.0f);//fov, aspect, zNear, zFar
 
    bool rotate=true;
    float angle;
 
    // Start game loop
    while (App.isOpen())
    {
        // Process events
        sf::Event Event;
        while (App.pollEvent(Event))
        {
            // Close window : exit
            if (Event.type == sf::Event::Closed)
                App.close();
 
            // Escape key : exit
            if ((Event.type == sf::Event::KeyPressed) && (Event.key.code == sf::Keyboard::Escape))
                App.close();
 
            if ((Event.type == sf::Event::KeyPressed) && (Event.key.code == sf::Keyboard::A)){
                rotate=!rotate;
            }
 
        }
        
        //Prepare for drawing
        // Clear color and depth buffer
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
        // Apply some transformations for the cube
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslatef(0.f, 0.f, -20.f);
        
        if(rotate){
            angle=Clock.getElapsedTime().asSeconds();
        }
        glRotatef(angle * 50, 1.f, 0.f, 0.f);
        glRotatef(angle * 30, 0.f, 1.f, 0.f);
        glRotatef(angle * 90, 0.f, 0.f, 1.f);
        
        model.Draw();
 
        /*
        //Draw a cube
        glBegin(GL_QUADS);//draw some squares
            glColor3i(0,1,1);
            glVertex3f(-50.f, -50.f, -50.f);
            glVertex3f(-50.f,  50.f, -50.f);
            glVertex3f( 50.f,  50.f, -50.f);
            glVertex3f( 50.f, -50.f, -50.f);
 
            glColor3f(0,0,1);
            glVertex3f(-50.f, -50.f, 50.f);
            glVertex3f(-50.f,  50.f, 50.f);
            glVertex3f( 50.f,  50.f, 50.f);
            glVertex3f( 50.f, -50.f, 50.f);
 
            glColor3f(1,0,1);
            glVertex3f(-50.f, -50.f, -50.f);
            glVertex3f(-50.f,  50.f, -50.f);
            glVertex3f(-50.f,  50.f,  50.f);
            glVertex3f(-50.f, -50.f,  50.f);
 
            glColor3f(0,1,0);
            glVertex3f(50.f, -50.f, -50.f);
            glVertex3f(50.f,  50.f, -50.f);
            glVertex3f(50.f,  50.f,  50.f);
            glVertex3f(50.f, -50.f,  50.f);
 
            glColor3f(1,1,0);
            glVertex3f(-50.f, -50.f,  50.f);
            glVertex3f(-50.f, -50.f, -50.f);
            glVertex3f( 50.f, -50.f, -50.f);
            glVertex3f( 50.f, -50.f,  50.f);
 
            glColor3f(1,0,0);
            glVertex3f(-50.f, 50.f,  50.f);
            glVertex3f(-50.f, 50.f, -50.f);
            glVertex3f( 50.f, 50.f, -50.f);
            glVertex3f( 50.f, 50.f,  50.f);
 
        glEnd();*/
 
        // Finally, display rendered frame on screen
        App.display();
    }
 
    return EXIT_SUCCESS;
}
Прошу помощи в поиске ошибки.
P.S. отчаялся
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2014, 01:28     Чтение OBJ модели и выгрузка её в VBO
Посмотрите здесь:

Unresolved external '...' referenced from ...*.OBJ C++
открыть obj файл C++
Конвертер из форматов Blender(.obj) C++
Считывание obj файла C++
C++ как overload ++OBJ и --OBJ
C++ obj file
C++ Подключение файлов obj
C++ Вывод на экран List<Obj>

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 00:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru