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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Qadabr
2 / 2 / 1
Регистрация: 12.05.2013
Сообщений: 32
#1

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

19.04.2014, 01:28. Просмотров 431. Ответов 0
Метки нет (Все метки)

Здравствуйте!
Я очень долго мучился с загрузкой модели формата ".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. отчаялся
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2014, 01:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение OBJ модели и выгрузка её в VBO (C++):

как overload ++OBJ и --OBJ - C++
как overload ++OBJ и --OBJ

Загрузка obj модели в OpenGl - OpenGL
Есть .obj файл типа: v 1.25022 0 -0.0571689 vt -49.2212 2.25074 vn 0 -1 -0 v 0.108959 0 -0.0571689 vt -4.28972 2.25074 v...

Экспорт модели из формата OBJ - OpenGL
Всем доброго времни суток, начал изучать сложные трехмерные объекты, и напоролся на &quot;камень&quot;. Хочу из формата *.obj, где хранятся данные...

Загрузка obj модели, без SDK - DirectX
Здравствуйте, пишу загрузчик .obj моделей, но столкнулся с проблемой. Часть треугольников модели повернуты не в ту сторону, и...

SQL Server и ERWin. Выгрузка модели БД. - SQL Server
Здравствуйте читающе. Вопрос стоит таким образом: слышал, что в sql server есть возможность выгружать информационныю модель в виде ER...

Какую простую среду выбрать, если мне нужно создавать 3D модели в формате OBJ - 3D моделирование
Какую простейшую среду выбрать (т.е. не 3d max и не блендер (они для меня сложные)), если мне нужно создавать 3D модели в формата OBJ?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2014, 01:28
Привет! Вот еще темы с ответами:

Чтение из реестра информации о модели USB - C++ Builder
как прочитать подключи в реестре? Я уже раз 5 прочитал эту статью http://www.cyberforum.ru/cpp-builder/thread159991.html и пока что дело не...

Не работает if Not obj Is Nothing And Not obj.Property Then - Visual Basic .NET
В условии надо проверить, к примеру объект и его свойство if Not obj Is Nothing And Not obj.Property Then так вот если obj Is...

Насколько безопасна запись if( $obj && $obj->getname() == 'test' ) - PHP
То есть мне нужно условие, которое срабатывает если $obj существует и если у него существует метод getname(). Не вылезет ли ошибка, при...

delphi + VBO - OpenGL
Здравствуйте. Пытаюсь написать програмку, которая с помощью VBO рисовала бы треугольник. Вот код который имею, но изображения треугольника...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru