Войти
ПрограммированиеФорумОбщее

Формат 3DS: Первый шаг. (Комментарии к статье) (2 стр)

Страницы: 1 2 3 4 5 Следующая »
#15
19:01, 1 окт. 2006

Ворос к автору ...
Возник немного логический вопрос...Имеется следующее:

TRI_FACELIST (0x4120)
unsigned short nTriangles;//Число треугольников
struct {
unsigned short v0;//Индекс первой вершины
unsigned short v1;//Индекс второй вершины
unsigned short v2;//Индекс третьей вершины
unsigned short flags;//Флаги грани, которые мы смело будем игнорировать
} Triangles[nTriangles];//Список граней
Вопрос: что значит индекс такой-то вершины?
Если имеется ввиду номер, т.е. индекс нужной вершины в списке вершин, то этого не может быть, так как при отладке считываестся число (тип int) намного большее чем num, буквально для первой грани:

vertices[0]:
  v0 = 131072  (или 0x00020000)
  v1 = 393219  (или 0x00060003)
  v2 = 65539  (или 0x00010003)


Так может это адрес в файле, но это нелогично.

(подробнее http://www.gamedev.ru/code/forum/?id=54865)

Знающие люди, объясните каким обазом мне перестать тормозить...


Прошло более 1 года
#16
2:03, 9 дек. 2007

это не "экспорт"
чтение из файла называют "импорт"

#17
21:51, 15 янв. 2008

Проверь, не забыл ли точно выставить указатель в файле (например мог забыть считать кол-во граней - unsigned short nTriangles;//
Число треугольников).
Либо разберись с порядком байт : старший младший и т.п.

Я писал свой загрузчик у меня всё нормально.

#18
22:20, 15 янв. 2008

Я лично не нашел в инете ни одного нормального загрузчика(чтоб все файлы без ошибок грузил) кроме 3dsftk.

#19
22:36, 15 янв. 2008

  Да, кстати, у тебя длина unsigned short - кажется должна быть 2 байта, а не 4, если верить твоему примеру. Порой в этом направлении.

#20
2:36, 16 янв. 2008

CyberZX
>а кому вообще нужен этот формат и зачем? по-моему намного проще и удобнее
>придумать свой формат и экспортер для него, чем разбираться с 3ds
четыре года назад был таким наивным :)

#21
19:19, 8 мар. 2008

А как в 3ds файле обозначаются объекты-ссылки, которые создаются при копировании орикинального объекта-сетки в 3sd Maxe?

#22
15:39, 7 июня 2008

А не проще использовать "х" файлы, а не 3ds? Я насчёт DX.
У меня всё отлично грузин и работает!
Всётаки лучше чем писать загрузчик
неизвестного формата и ещё сортировщик вершин и индексов...
Есть давно уже готовые функции для загрузки моделеё и анимаций,
думаю что не стоит париться и создавать велосипед=)
Если кто заинтересовался - пишите!

#23
15:48, 7 июня 2008

прошу прощение... писать код для сортировки вершин и индексов... зачем это надо, кому? всё намного проще!

#24
14:48, 20 июля 2008

BlackKite, кстати 0x3D3D находится в точности шестнадцатым байтом. возможно у меня анализатор неправильно написан или 3ds файлы бывают разных версий.. не знаю.
Кстати, я поинтересовался этим форматом(3ds) потому что в "x" формате нет информации об анимации камеры(

#25
15:07, 20 июля 2008

Получается что правильно) 0x4D4D = 2 байта (онже самый первый)
потом идёт его размер равный 4 байта,
затем на шестом байте идёт версия,
а шестнадцатым идёт ужё 0x3D3D

#26
7:42, 10 ноя. 2008

может кому пригодится 3ds_лоайдер http://www.gamedev.ru/download/?id=8004 загружает n число обьектов
думаю мой быдло код будет понятен =)))
подгрузку текстуры не писал

#27
8:24, 10 ноя. 2008

Лучше использовать Колладу, если написать свой экспортер не по душе...

#28
16:17, 8 фев. 2009

Actor: спасибо за помощь - ты мне очень помог! Формат x хранит любую анимацию! Всё супер! Кстати формат 3дс тоже полезен - он хранит больше информации!

#29
18:12, 8 фев. 2009

                #include<d3d9.h>
                #include<d3dx9.h>
   
                D3DXVECTOR3 v[100];
                unsigned short id, numVerts;

    unsigned int len, filelen, posInFile=0;

    FILE *file;

    I

   

    if(!(file = fopen("kvadrat.3ds", "rb"))){MessageBox(0, _T("Error"), _T("No file"), MB_OK); return 0;}

    fseek(file, 0, SEEK_END);

    filelen = ftell(file);

    fseek(file, 0, SEEK_SET);


    while(posInFile < filelen)

    {

      fread(&id, 1, 2, file);

      fread(&len, 1, 4, file);

      switch(id)

      {

        case 0x4D4D:

        {

          MessageBox(0, _T("4D4D"), _T("OK"), MB_OK);

        }break;

     

        case 0x0002:

        {

          MessageBox(0, _T("0002"), _T("OK"), MB_OK);

          fseek(file, 16, 0);

          posInFile=ftell(file);

        }break;

     

        case 0x3D3D:

        {

          MessageBox(0, _T("3D3D"), _T("OK"), MB_OK);

        }break;

     

        case 0x4000:

        {

          unsigned char ch;

          int i=0;

          do

          {

            fread (&ch, 1, 1, file);

            i++;

          }while(ch != '\0' && i<20);

          MessageBox(0, _T("4000"), _T("OK"), MB_OK);

        }break;

        case 0x4100:

        {

          MessageBox(0, _T("4100"), _T("OK"), MB_OK);

        }break;

        case 0x4110:

        {

          fread (&numVerts, sizeof (unsigned short), 1, file);

          float x,y,z;

          for (int i=0; i<numVerts; i++)

          {

            fread (&x, sizeof(float), 1, file);

            fread (&y, sizeof(float), 1, file);

            fread (&z, sizeof(float), 1, file);

            v.p = D3DXVECTOR3(x, y, z);

            sprintf(chStr, "%f", x); MessageBox(0, TEXT(chStr), 0, MB_OK);

            sprintf(chStr, "%f", y); MessageBox(0, TEXT(chStr), 0, MB_OK);

            sprintf(chStr, "%f", z); MessageBox(0, TEXT(chStr), 0, MB_OK);

          }

         

          exit(0);

          MessageBox(0, _T("4110"), _T("OK"), MB_OK);

        }break;

     

        case 0x4120:

        {

          MessageBox(0, _T("4120"), _T("OK"), MB_OK);

        }break;

        case 0x4140:

        {

          MessageBox(0, _T("4140"), _T("OK"), MB_OK);

        }break;

        default:

        {

          fseek(file, len-6, 1);

          posInFile=ftell(file);

        }

      }

      if(posInFile == filelen)MessageBox(0, _T("END File"),  _T("OK"), MB_OK);

    }

    fclose(file);

Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.