Du bist nicht angemeldet.

Werbeanzeige

Samuel G.

Treue Seele

  • »Samuel G.« ist der Autor dieses Themas

Beiträge: 110

Wohnort: Stuttgart

Beruf: Schüler

  • Private Nachricht senden

1

29.06.2005, 20:17

Animationen Laden

Hallo :) :) :)


Weiß jemand wie man Animationen lädt (möglichst ne professionelle Methode)?

Ich lade zurzeit meine Modelle aus 3ds-Dateien. Meine Vermutung ist, dass der "K E Y F R A M E R C H U N K" Infos über die Animationen beinhaltet.

Stimmt das?
Wenn ja, wie interpretiert man diese (grobe Beschreibung genügt, ich habe mir auch die Funktion mancher Subchunks des 3D editor chunks erschlossen)?


Dange.


Samuel G.
Quak

2

29.06.2005, 21:45

Guck dir mal das SDK von David an.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

DrthM2001

Alter Hase

Beiträge: 721

Wohnort: Karlsruhe

  • Private Nachricht senden

3

29.06.2005, 23:19

also ich hab einige zeit damit verbracht 3ds zu implementieren. irgendwie sind die modelle untereinander inkompatibel. liegt vielleicht daran dass das format nicht für spiele gemacht ist. schau dir mal md2 an, ist seeehr einfach zu implementieren, und funtzt super.
ich habs in rekordverdächtig wenigen zeilen hinbekommen

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
121
122
123
124
125
126
127
128
129
130
131
#include "globals.h"

float Normals[162][3]=
{
#include "anorms.h"
};


Vector3 MD2Model::GiveVertex(int Frame, int Index)
{
    frame_md2* selectedframe= (frame_md2*) ((char*)(pFrames)+Header.frameSize*Frame);
    return Vector3((float)selectedframe->verts[Index].vertex[0]*(float)selectedframe->scale[0]+(float)selectedframe->translate[0],
                   (float)selectedframe->verts[Index].vertex[1]*(float)selectedframe->scale[1]+(float)selectedframe->translate[1],
                   (float)selectedframe->verts[Index].vertex[2]*(float)selectedframe->scale[2]+(float)selectedframe->translate[2]);
}

textureCoordinate_md2 MD2Model::GiveTexCoordinate(int Index)
{
    textureCoordinate_md2 tex;
    //tex.x=(float)Header.skinHeight/(float)pTexCoords[Index].u;

    //tex.y=(float)Header.skinWidth/(float)pTexCoords[Index].v;

    tex.u=pTexCoords[Index].u;
    tex.v=pTexCoords[Index].v;
    return tex;
}

Vector3 MD2Model::GiveNormal(int Frame, int Index)
{
    frame_md2* selectedframe= (frame_md2*) ((char*)(pFrames)+Header.frameSize*Frame);
    return Vector3(Normals[selectedframe->verts[Index].lightNormalIndex][0],
                   Normals[selectedframe->verts[Index].lightNormalIndex][1],
                   Normals[selectedframe->verts[Index].lightNormalIndex][2]);
}

bool MD2Model::LoadModel(char *Filename)
{
    FILE* FileHandle;
    FileHandle=fopen(Filename, "rb");
    if (FileHandle==NULL)
        return false;
    fread(&Header, 1, sizeof(header_md2), FileHandle);
    if(Header.magic!=844121161)
        return false;
    
      pSkins     = new TextureFilename_md2[ Header.numSkins ];

      pTexCoords = new textureCoordinate_md2[ Header.numTexCoords ];

      pTriangles = new triangle_md2[ Header.numTriangles ];

      pFrames    = (frame_md2*)malloc(Header.numFrames*Header.frameSize);
 
      fseek(FileHandle, Header.offsetSkins, SEEK_SET);
      fread(pSkins, Header.numSkins, sizeof(TextureFilename_md2), FileHandle);

      fseek(FileHandle, Header.offsetTexCoords, SEEK_SET);
      fread(pTexCoords, Header.numTexCoords, sizeof(textureCoordinate_md2), FileHandle);

      fseek(FileHandle, Header.offsetTriangles, SEEK_SET);
      fread(pTriangles, Header.numTriangles, sizeof(triangle_md2), FileHandle);

      fseek(FileHandle, Header.offsetFrames, SEEK_SET);
      fread(pFrames, Header.numFrames*Header.frameSize, 1, FileHandle);
      
      fseek(FileHandle, Header.offsetGlCommands, SEEK_SET);
      fread(pglCommands, Header.numGlCommands, sizeof(int), FileHandle);

      fclose(FileHandle); 
      //Textur laden

        
      LOG("INFO: Die Textur für das Modell %s namens %s wird geladen.\n", Filename, pSkins[0].Filename);
      TextureHandleMD2=Game.TextureManager->LoadTexture("droideka.tga", LINEAR_FILTERING);

      //Jetzt die Listen vorbereiten, für jeden Frame eine

      for(int counter=0; counter<Header.numFrames; counter++)
      {
          Listnumbers[counter]=glGenLists(1);
          glNewList(Listnumbers[counter], GL_COMPILE);
          Game.TextureManager->ActivateTexture(TextureHandleMD2);
          glBegin (GL_TRIANGLES);
          for(int counter2=0; counter2<Header.numTriangles; counter2++)
          {
          Vector3 first=GiveVertex(counter, pTriangles[counter2].vertexIndices[0]);
          Vector3 second=GiveVertex(counter, pTriangles[counter2].vertexIndices[1]);
          Vector3 third=GiveVertex(counter, pTriangles[counter2].vertexIndices[2]);

          textureCoordinate_md2 temptex;
          Vector3 Normal=GiveNormal(counter, pTriangles[counter2].vertexIndices[0]);
          temptex=GiveTexCoordinate(pTriangles[counter2].textureIndices[0]);
          glTexCoord2f((float)temptex.u/(float)Header.skinWidth,1-(float)temptex.v/(float)Header.skinHeight);
          glNormal3fv(Normal);
          glVertex3fv(first);
          //LOG("erster vertex für frame %d lautet %f-%f-%f\n", counter, first.x, first.y, first.z);


          Normal=GiveNormal(counter, pTriangles[counter2].vertexIndices[1]);
          temptex=GiveTexCoordinate(pTriangles[counter2].textureIndices[1]);
          glTexCoord2f((float)temptex.u/(float)Header.skinWidth,1-(float)temptex.v/(float)Header.skinHeight);
          glNormal3fv(Normal);
          glVertex3fv(second);

          Normal=GiveNormal(counter, pTriangles[counter2].vertexIndices[2]);
          temptex=GiveTexCoordinate(pTriangles[counter2].textureIndices[2]);
          glTexCoord2f((float)temptex.u/(float)Header.skinWidth,1-(float)temptex.v/(float)Header.skinHeight);
          glNormal3fv(Normal);
          glVertex3fv(third);
          }
            
          glEnd ();

          glEndList();

      }
    return true;
}

void MD2Model::RenderFrame(unsigned int Number)
{
    glPushMatrix();
    glPushAttrib(GL_ALL_ATTRIB_BITS);
    
    glRotatef(270.f, 1,0,0);
    glFrontFace( GL_CW );
    glEnable( GL_CULL_FACE );
    glCullFace( GL_BACK );
    glEnable(GL_TEXTURE_2D);
    glCallList(Listnumbers[Number]);
    glDisable( GL_CULL_FACE );

    glPopAttrib();
    glPopMatrix();
}
[/code]

dot

Supermoderator

Beiträge: 9 850

Wohnort: Graz

  • Private Nachricht senden

4

07.07.2005, 15:59

warum alle bloß immer 3ds verwenden wollen!?

imho eines der bösesten formate dies gibt...

5

07.07.2005, 16:15

seh ich auch so dot.

und 3ds hat keine richtigen keyframes so weit ich weiß.
nur std.operationen auf den einzelnen objekten. (rotieren bewegen)
also alles objekt-, nicht vertex-basiert
GLAUB ICH

dot

Supermoderator

Beiträge: 9 850

Wohnort: Graz

  • Private Nachricht senden

6

07.07.2005, 16:27

3ds wurde ja auch nicht für spiele gedacht und es gibt nicht einmal eine offizielle beschreibung zum aufbau des formats, weshalb afaik die wenigsten loader auch wirklich mit jeder 3ds datei klarkommen.

ich verwend meistens ms3d, weil ich dann gleich nehmen kann was mein modeller ausspuckt (is allerdings auch net für spiele gedacht und hat so seine eigenheiten, aber dafür gibts ne offizielle doku).
wenns an was größeres geht, kommt ein eigenes format mit export plugin oder konverter zum einsatz.

wenn du echt nur reine keyframe animation willst, ohne skelett usw, dann dürfte md2 sicher keine schlechte wahl sein...

Samuel G.

Treue Seele

  • »Samuel G.« ist der Autor dieses Themas

Beiträge: 110

Wohnort: Stuttgart

Beruf: Schüler

  • Private Nachricht senden

7

12.08.2005, 15:27

Beitrag

Meiner laedt jedes 3DS-Format! :)
Er ist aus einer hohen Abstraktionsebene runterkonkretisiert (geile Ausdrucksweise, ne?).


Samuel G.
Quak

Dave

Alter Hase

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

8

12.08.2005, 16:21

Re: Beitrag

Zitat von »"Samuel G."«

Meiner laedt jedes 3DS-Format! :)


mit solchen aussagen wäre ich immer vorsichtig ;)

dot

Supermoderator

Beiträge: 9 850

Wohnort: Graz

  • Private Nachricht senden

9

12.08.2005, 16:35

Zitat

Meiner laedt jedes 3DS-Format!


yep, da wär ich wirklich vorsichtig. ich glaub kaum dass es einen solchen 3ds loader gibt (außer evtl. einen von autodesk persönlich), da 3ds kein offenes format ist...

10

12.08.2005, 18:08

Ich benutz .X. Ich hab mir vor kurzem "Advanced Animation With DirectX" von Jim Adams gekauft. Kompliziert aber damit kann man auch Animationen blenden (also mischen).
Mein Projekt: Rise of the Sylvan

Werbeanzeige