Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

05.07.2012, 17:37

[OpenGL] Modelle als *.obj importieren + allgemeine Probleme

Hallooo!
Ja, leider gibts mal wieder ein Problemchen bezüglich OpenGL.
Ich lade ein Objekt aus einer *.obj-Datei und dieses Objekt lässt sich einfach nicht auf den Bildschirm bekommen.
Ich hab die Koordinaten überprüft, ich sollte es eigentlich sehen können.

C-/C++-Quelltext

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
116
117
118
119
120
int loadObject(const std::string& filename)
{
    std::ifstream stream(filename.c_str());
    std::vector<std::string> data;
    std::vector<coordinate*> vertizes;
    std::vector<coordinate*> normals;
    std::vector<face*>  faces;

    if(!stream.is_open())
        return -1;
    
    char buf[256];
    while(!stream.eof()-1)
    {
        stream.getline(buf, 256);
        data.push_back(std::string(buf));
    }
    for(unsigned int i=0; i<data.size(); ++i)
    {
        if(data[i][0]=='#')
            continue;
        else if(data[i][0]=='v' && data[i][1]==' ')
        {
            float tmpx, tmpy, tmpz;
            sscanf_s(data[i].c_str(), "v %f %f %f", &tmpx, &tmpy, &tmpz);
        }
        else if(data[i][0]=='v' && data[i][1]=='n')
        {
            float tmpx, tmpy, tmpz;
            sscanf_s(data[i].c_str(), "vn %f %f %f", &tmpx, &tmpy, &tmpz);
            normals.push_back(new coordinate(tmpx, tmpy, tmpz));
        }
        else if(data[i][0]=='f')
        {
            int a, b, c, d, e;
            if(std::count(data[i].begin(), data[i].end(), ' ')==4)
            {
                sscanf_s(data[i].c_str(), "f %d//%d %d//%d %d//%d %d//%d", &a, &b, &c, &b, &d, &b, &e, &b);
                faces.push_back(new face(b, a, c, d, e));
            }
            else
            {
                sscanf_s(data[i].c_str(), "f %d//%d %d//%d %d//%d", &a, &b, &c, &b, &d, &b);
                faces.push_back(new face(b, a, c, d));
            }

        }
    }

    //draw
    int num;
    num = glGenLists(1);
    glNewList(num, GL_COMPILE);
    for(unsigned int i=0; i<faces.size(); ++i)
    {
        if(faces[i]->quad)
        {
            glBegin(GL_QUADS);
            
            glNormal3f(normals[faces[i]->facenum-1]->x, normals[faces[i]->facenum-1]->y, normals[faces[i]->facenum-1]->z);
            glVertex3f(vertizes[faces[i]->faces[0]-1]->x, vertizes[faces[i]->faces[0]-1]->y, vertizes[faces[i]->faces[0]-1]->z);
            glVertex3f(vertizes[faces[i]->faces[1]-1]->x, vertizes[faces[i]->faces[1]-1]->y, vertizes[faces[i]->faces[1]-1]->z);
            glVertex3f(vertizes[faces[i]->faces[2]-1]->x, vertizes[faces[i]->faces[2]-1]->y, vertizes[faces[i]->faces[2]-1]->z);
            glVertex3f(vertizes[faces[i]->faces[3]-1]->x, vertizes[faces[i]->faces[3]-1]->y, vertizes[faces[i]->faces[3]-1]->z);

            glEnd();
        }
        else
        {
            glBegin(GL_TRIANGLES);
            
            glNormal3f(normals[faces[i]->facenum-1]->x, normals[faces[i]->facenum-1]->y, normals[faces[i]->facenum-1]->z);
            glVertex3f(vertizes[faces[i]->faces[0]-1]->x, vertizes[faces[i]->faces[0]-1]->y, vertizes[faces[i]->faces[0]-1]->z);
            glVertex3f(vertizes[faces[i]->faces[1]-1]->x, vertizes[faces[i]->faces[1]-1]->y, vertizes[faces[i]->faces[1]-1]->z);
            glVertex3f(vertizes[faces[i]->faces[2]-1]->x, vertizes[faces[i]->faces[2]-1]->y, vertizes[faces[i]->faces[2]-1]->z);
            
            glEnd();
        }
    }
    glEndList();

    for(unsigned int i=0; i<vertizes.size(); ++i)
        delete vertizes[i];
    for(unsigned int i=0; i<normals.size(); ++i)
        delete normals[i];
    for(unsigned int i=0; i<faces.size(); ++i)
        delete faces[i];

    return num;
}

int iTower=0;

void InitRendering()
{
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_COLOR_MATERIAL);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, 640/480, 1, 200);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    iTower = loadObject("Test.obj");
}

void DrawScene()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glTranslatef(camX, camY, camZ-8.f);
    
    glCallList(iTower);

    glutSwapBuffers(); //Send the Scene to screen. :3
}

Danke für eventuell helfende Unterstützung bei diesem Problem.

MfG
Check

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Checkmateing« (07.07.2012, 01:22) aus folgendem Grund: Grundänderung des allgemeinen Themas


2

05.07.2012, 18:09

Die Zeilen die mit "f" beginnen, sind anders aufgebaut.

Ich habe es so gemacht:

C-/C++-Quelltext

1
fscanf(file, "%d/%d/%d %d/%d/%d %d/%d/%d\n", &vertexIndex[0], &uvIndex[0], &normalIndex[0], &vertexIndex[1], &uvIndex[1], &normalIndex[1], &vertexIndex[2], &uvIndex[2], &normalIndex[2]);


Mfg
Delop

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

05.07.2012, 19:17

Außerdem ist sowas wie glBegin(), glEnd(), glVertex(), ... komplett veraltet und sollte eigentlich nicht mehr benutzt werden (außer auf ganz alten Möhren vielleicht). Schreib die Daten in jeweils einen vector, erstell dir Buffer dazu (glGenBuffers()) und render alles mit Shadern.

4

05.07.2012, 19:24

Waha, NeHe-Tutorials und Video-Kram und so bringts anscheinend doch nicht.
Du hast es wo gelernt? Buch?

MfG
Check

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

5

05.07.2012, 19:36

DelphiGL

Lies dir mal was zu VertexBuffern durch.
Die sind jedenfals für sowas pefekt geeigent.
Weil die Daten statisch und indiziert sind.

Das Obj-Format kann man aber leider nicht so schnell einlesen, da die Indizierung für Normale, Position und Texturkoordinate einzeln vorliegt.
Ich würde dir daher ein anderes Format anraten. Ich habe mir damals ein eigenes binäres Format geschrieben, von dem die Daten direkt ohne Umwege in den Grafikspeicher kopiert werden können. Das spart viel Ladezeit.

6

05.07.2012, 19:52

Klingt jetzt gar nicht überfordernd bei meinem Wissenstand. :crazy:

MfG
Check

7

05.07.2012, 19:57

Ich würde dir das hier empfehlen. (OpenGL 3.3 und höher) :)
Das hatte mir auch sehr geholfen.

Mfg
Delop

8

05.07.2012, 20:26

Also nochmal von vorn, jetzt immerhin 'richtig'. Danke! :D
EDIT: Nicht ironisch gemeint, auch wenns so rüber kommt. :/

MfG
Check

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

9

05.07.2012, 20:58

Beginning OpenGL Game Programming Second Edition

Wobei ich es inzwischen als ziemlich oberflächlich betrachte, aber für die Grundlagen reicht es allemal.

10

06.07.2012, 02:51

Ich nutze einfach mal den selbigen Thread.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
    //Drawing Triangle
    static const GLfloat Triangle[] = {1.f, 1.f, 1.f,
                                       1.f, 0.f, 0.f,
                                       1.f, 0.f, 1.f};
    GLuint VertexBuffer;
    glGenBuffers(1, &VertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(Triangle), Triangle, GL_STATIC_DRAW);

Dieser Code soll fehlerhaft sein, und zwar bei glGenBuffers. Ich bekomme da ein Access Violation. 8|
Wäre für weitere Hilfe sehr dankbar. :)

MfG
Check

Werbeanzeige

Ähnliche Themen