Du bist nicht angemeldet.

Werbeanzeige

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

1

14.10.2010, 20:17

Assimp Loader programmieren

Hi

Ich will gerne einen Assimp Loader mit C++ und DirectX 9 prorammieren.

Nun gibt es beim programmieren von Parsern allgemeine Informationen, denn ich weiss nicht wie ich anfangen soll mit dem Programmieren eines Parsers. Gibt es dazu Tutorials oder Beispielcodes?

MfG Patrick

2

14.10.2010, 20:20

Nimm doch Assimp :D
Also willst du das Assimp File Format ohne Assimp laden ?

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

3

14.10.2010, 20:34

Doch ich will mit Assimp ein Modell in eine DirectX 9 Szene reinladen.

Ich wollte erstmals nur wissen, ob es Tutorials oder Beispielcodes zum allgemeinen Parsen gibt, denn ich weiss nicht wie das funktioniert.
Aber wenn es gute Tutorials über Assimp gibt, bei welchem auch ich drauss komme, da ich noch keine Parserfahrung habe, dann würde ich gerne ein solches durcharbeiten.

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

4

14.10.2010, 23:14

Ich habe nun das Sample von Assimp als Hilfe genommen. Ich habe die Funktionen von OpenGL in DirectX9 Funktionen umgeschrieben. Nun weiss ich jedoch nicht bei allen welche Funktion von DirectX 9, diese von OpenGL ersetzen. Vor allem bei apply_material und recursive_render weiss ich nicht wie die in DirectX 9 lauten.

Alle Funktionen hier im Code die von OpenGL stammen, weiss ich nicht wie ich diese ersetzen soll mit DirectX 9.

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
void apply_material(const struct aiMaterial *mtl)
{
    float c[4];

    enum fill_mode;
    int ret1, ret2;
    struct aiColor4D diffuse;
    struct aiColor4D specular;
    struct aiColor4D ambient;
    struct aiColor4D emission;
    float shininess, strength;
    int two_sided;
    int wireframe;
    int max;

    set_float4(c, 0.8f, 0.8f, 0.8f, 1.0f);
    if(AI_SUCCESS == aiGetMaterialColor(mtl, AI_MATKEY_COLOR_DIFFUSE, &diffuse))
        color4_to_float4(&diffuse, c);
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, c); // Welche Funktion soll ich für glMaterialfv in DirectX 9 verwenden?

    set_float4(c, 0.0f, 0.0f, 0.0f, 1.0f);
    if(AI_SUCCESS == aiGetMaterialColor(mtl, AI_MATKEY_COLOR_SPECULAR, &specular))
        color4_to_float4(&specular, c);
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, c);

    set_float4(c, 0.2f, 0.2f, 0.2f, 1.0f);
    if(AI_SUCCESS == aiGetMaterialColor(mtl, AI_MATKEY_COLOR_AMBIENT, &ambient))
        color4_to_float4(&ambient, c);
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, c);

    set_float4(c, 0.0f, 0.0f, 0.0f, 1.0f);
    if(AI_SUCCESS == aiGetMaterialColor(mtl, AI_MATKEY_COLOR_EMISSIVE, &emission))
        color4_to_float4(&emission, c);
    glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, c);

    max = 1;
    ret1 = aiGetMaterialFloatArray(mtl, AI_MATKEY_SHININESS, &shininess, &max);
    max = 1;
    ret2 = aiGetMaterialFloatArray(mtl, AI_MATKEY_SHININESS_STRENGTH, &strength, &max);
    if((ret1 == AI_SUCCESS) && (ret2 == AI_SUCCESS))
        glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess * strength);
    else {
        glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 0.0f);
        set_float4(c, 0.0f, 0.0f, 0.0f, 0.0f);
        glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, c);
    }

    max = 1;
    if(AI_SUCCESS == aiGetMaterialIntegerArray(mtl, AI_MATKEY_ENABLE_WIREFRAME, &wireframe, &max))
        fill_mode = wireframe ? GL_LINE : GL_FILL;
    else
        fill_mode = GL_FILL;
    glPolygonMode(GL_FRONT_AND_BACK, fill_mode); // Welche Funktion soll ich für glPolygonMode in DirectX 9 verwenden?

    max = 1;
    if((AI_SUCCESS == aiGetMaterialIntegerArray(mtl, AI_MATKEY_TWOSIDED, &two_sided, &max)) && two_sided)
        glEnable(GL_CULL_FACE); // Welche für glEnable?
    else 
        glDisable(GL_CULL_FACE); // Welche für glDisable?
}


Hier nochmals das Gleiche.

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
void recursive_render (const struct aiScene *sc, const struct aiNode* nd)
{
    int i;
    unsigned int n = 0, t;
    struct aiMatrix4x4 m = nd->mTransformation;

    // update transform
    aiTransposeMatrix4(&m);
    glPushMatrix();
    glMultMatrixf((float*)&m);

    // draw all meshes assigned to this node
    for (; n < nd->mNumMeshes; ++n) {
        const struct aiMesh* mesh = scene->mMeshes[nd->mMeshes[n]];

        apply_material(sc->mMaterials[mesh->mMaterialIndex]);

        if(mesh->mNormals == NULL) {
            glDisable(GL_LIGHTING);
        } else {
            glEnable(GL_LIGHTING);
        }

        if(mesh->mColors[0] != NULL) {
            glEnable(GL_COLOR_MATERIAL);
        } else {
            glDisable(GL_COLOR_MATERIAL);
        }

        for (t = 0; t < mesh->mNumFaces; ++t) {
            const struct aiFace* face = &mesh->mFaces[t];
            enum face_mode;

            switch(face->mNumIndices) {
                case 1: face_mode = D3DPT_POINTLIST; break;
                case 2: face_mode = D3DPT_LINELIST; break;
                case 3: face_mode = D3DPT_TRIANGLELIST; break;
                default: face_mode = D3DPT_TRIANGLEFAN; break;
            }

            glBegin(face_mode);

            for(i = 0; i < face->mNumIndices; i++) {
                int index = face->mIndices[i];
                if(mesh->mColors[0] != NULL)
                    Color4f(&mesh->mColors[0][index]);
                if(mesh->mNormals != NULL) 
                    glNormal3fv(&mesh->mNormals[index].x);
                glVertex3fv(&mesh->mVertices[index].x);
            }

            glEnd();
        }

    }

    // draw all children
    for (n = 0; n < nd->mNumChildren; ++n) {
        recursive_render(sc, nd->mChildren[n]);
    }

    glPopMatrix();
}


Oder muss ich für DirectX 9 einen anderen Assimp Code verwenden um ein Modell auf den Bildschirm zu präsentieren?

5

14.10.2010, 23:49

Es hört sich für mich nicht danach an, als ob du wirklich verstandne hättest, was du da machen willst.

Assimp nimmt dir ne Menge Arbeit beim Laden ab, alles was du sonst noch wissen musst, steht in der Assimp Doku.
Wenn du damit nicht zurecht kommst (was offensichtlich so ist), solltest du zunächst mehr zum Thema 3D Programmierung lernen, z.B. ein gutes Buch lesen.

Es würde vielleicht helfen, wenn du uns mitteilen würdest, was du kannst (d.h. welche Bücher/Tutorials du durchgearbeitet und verstanden hast) und was du eigentlich genau machen willst. (Einen Assimpviewer gibts doch schon, oder willst du die Modelle in ein Spiel einbauen?).
Lieber dumm fragen, als dumm bleiben!

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

6

15.10.2010, 00:07

Ja ich will die Modelle in ein Spiel einbauen.

Ich habe Spieleprogrammierung mit C++ von Haiko Kalista gelesen
Ich habe das Buch 3D Spieleprogrammierung mit DirectX 9 und C++ von David Scherfgen angefangen zu lesen nun Anfang Kap. 3
Und ich habe3D Effekte für Spieleprogammierer von Alexander Rudolph angefangen zu lesen erstes Kapitel durch

Also mit DirectX 9 kann ich schon relativ gut umgehen. Ich habe bereits einen eigenen Intro und ein eigenes Menü für ein Spiel programmiert und nun bin ich daran am eigentlichen Spiel zu programmieren.

7

15.10.2010, 01:39

(...) angefangen zu lesen nun Anfang Kap. 3 (...) angefangen zu lesen erstes Kapitel durch (...) Also mit DirectX 9 kann ich schon relativ gut umgehen.

Hm... widerspricht sich das nicht ein bisschen? Ich würde das vielleicht nicht umbedingt als "gut umgehen können" betiteln. ;)

Gruß
SaRu_

8

15.10.2010, 08:55

Wer suchet wird auch finden! ;)
Empfehlenswert ist die Lektüre des Suchergebnisses #3

Nee, im Ernst. Anstatt Crossposting zu betreiben, solltest du vielleicht erst mal lernen, mit Suchmaschinen umzugehen.

Dann findest du vielleicht auch sowas...
fka tm

Werbeanzeige