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

Экспорт из 3d max, наложение текстуры - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Vozyka Yaroslav
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 45
26.07.2013, 10:20     Экспорт из 3d max, наложение текстуры #1
Здравствуйте. Проблема с наложением текстуры.
С помощью библиотеки lib3ds.lib импортирую 3ds файл в программу (простой куб), накладываю текстуру. Текстура независимо от размера (64х64 или 512х512) накладывается маленькими повторяющимися квадратами. Когда беру 3ds файл из примера (был вместе с библиотекой) текстура накладывается нормально. Когда делаю в 3d max сцену из двух объектов, один мой, второй из примера тоже самое. На мой объект текстура накладывается квадратами, а на другой нормально.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,027
Записей в блоге: 10
Завершенные тесты: 1
26.07.2013, 10:46     Экспорт из 3d max, наложение текстуры #2
Координаты текстуры неправильно выставляешь.
Vozyka Yaroslav
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 45
26.07.2013, 10:54  [ТС]     Экспорт из 3d max, наложение текстуры #3
Экспорт делает заимствованный модуль, он же и выставляет координаты автоматически. Координаты ставит относительно объекта. Поэтому вопрос, почему практически идентичные объекты он раскрашивает по разному. Возможно создавать обект (в 3ds max) надо как то по осебенному или что-нибудь указывая?
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,027
Записей в блоге: 10
Завершенные тесты: 1
26.07.2013, 10:57     Экспорт из 3d max, наложение текстуры #4
Перед тем как это сказать я специально скачал эту библиотеку, и посмотрел пример, в котором в ручную вписаны координаты текстуры.
Да и, может ты уже наконец покажешь как ты это делаешь в своей программе!? Нам что тут, гадать надо где у тебя там ошибки?
Vozyka Yaroslav
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 45
26.07.2013, 11:02  [ТС]     Экспорт из 3d max, наложение текстуры #5
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
    void LoadObj(char* fxname)
{
  num_texture = 0;
  // ----------------
  //* Откроем файл
  // ----------------
 
  file3ds *file= NULL;
  database3ds *db = NULL;
  file = OpenFile3ds(fxname, "rw");
 
 
 
  PRINT_ERRORS_EXIT(stderr);
  InitDatabase3ds(&db);
  PRINT_ERRORS_EXIT(stderr);
  CreateDatabase3ds(file, db);
  PRINT_ERRORS_EXIT(stderr);
 
 
  // ----------------
  //* Обработка файла
  // ----------------
    material3ds *mat=NULL;
    ulong3ds nbrmat = GetMaterialCount3ds(db);
    mesh3ds *mesh=NULL;
    ulong3ds nbrmesh=GetMeshCount3ds(db);
 
 
 
    ulong3ds meshid;
 
    int nmatfaceind, indface;
 
    glClearColor(0.0, 0.0, 0.0, 0.0); // This clear the background color to black
    glShadeModel(GL_SMOOTH); // Type of shading for the polygons
    glViewport(0,0,Form1->Panel_Picture->Width,Form1->Panel_Picture->Height);
 
    // Projection transformation
    glMatrixMode(GL_PROJECTION); // Specifies which matrix stack is the target for matrix operations
    glLoadIdentity(); // We initialize the projection matrix as identity
    gluPerspective(45.0f,(GLfloat)Form1->Panel_Picture->Width/(GLfloat)Form1->Panel_Picture->Width,1.0f,10000.0f); // We define the "viewing volume"
 
    glEnable(GL_DEPTH_TEST); // We enable the depth test (also called z buffer)
    glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); // Polygon rasterization mode (polygon filled)
    glEnable(GL_TEXTURE_2D); // This Enable the Texture mapping
    float maxNumRan=0;
 
 
    for (int ind = 0; ind < int(nbrmesh); ind++) //sozdanie otdelnogo spiska dlya kajdogo elementa
    {
        glNewList(NumElement,GL_COMPILE);
 
        GetMeshByIndex3ds(db,ind,&mesh);
        num_texture = LoadBitmap(mat->texture.map.name);
 
        glBindTexture(GL_TEXTURE_2D, num_texture);       // We set the active texture
 
 
        if (mesh->matarray!=NULL)
        {
            nmatfaceind = mesh->nmats-1;
            for (int d = 0; d < mesh->nmats; d++)
             if (mesh->matarray[d].faceindex[0]==0)
             {
                InitMaterial3ds(&mat);
                GetMaterialByName3ds(db,mesh->matarray[d].name,&mat);
                indface = mesh->matarray[d].nfaces;
                break;
             }
 
        }
        for (int k = 0; k <  (mesh->nfaces); k++)
        {
            if (indface<k)
            {
                for (int d = 0; d < mesh->nmats; d++)
                 if (mesh->matarray[d].faceindex[0]==k-1)
                 {
                    InitMaterial3ds(&mat);
                    GetMaterialByName3ds(db,mesh->matarray[d].name,&mat);
                    indface = indface+mesh->matarray[d].nfaces;
                    break;
                 }
 
 
            }
 
            glColor3f(0.0,0.0,1);
            glBegin(GL_TRIANGLES);
            try
            {
                if ((mesh->facearray[k].v1  < mesh->nvertices) && (mesh->facearray[k].v1  < mesh->nvertices)
                    && (mesh->facearray[k].v1  < mesh->nvertices))
                {
                    glTexCoord2d(mesh->textarray[mesh->facearray[k].v1].u ,mesh->textarray[mesh->facearray[k].v1].v);
                    if (mesh->facearray[k].v1  < mesh->nvertices)
                    glVertex3d(mesh->vertexarray[mesh->facearray[k].v1].x,
                               mesh->vertexarray[mesh->facearray[k].v1].y,
                               mesh->vertexarray[mesh->facearray[k].v1].z);
 
 
                    glTexCoord2d(mesh->textarray[mesh->facearray[k].v2].u ,mesh->textarray[mesh->facearray[k].v2].v);
                    if (mesh->facearray[k].v2  < mesh->nvertices)
                    glVertex3d(mesh->vertexarray[mesh->facearray[k].v2].x,
                               mesh->vertexarray[mesh->facearray[k].v2].y,
                               mesh->vertexarray[mesh->facearray[k].v2].z);
                    glTexCoord2d(mesh->textarray[mesh->facearray[k].v3].u ,mesh->textarray[mesh->facearray[k].v3].v);
                    if (mesh->facearray[k].v3  < mesh->nvertices)
                    glVertex3d(mesh->vertexarray[mesh->facearray[k].v3].x,
                               mesh->vertexarray[mesh->facearray[k].v3].y,
                               mesh->vertexarray[mesh->facearray[k].v3].z);
               //   Form1->Label1->Caption=mesh->textarray[mesh->facearray[k].v1].u;
                //  Form1->Label_Pressure->Caption=mesh->textarray[mesh->facearray[k].v1].v;
                }
 
                else
                {
                    Form1->Memo_State->Lines->Add("err  " + k);
                }
                Application->ProcessMessages();
            }
             catch (Exception &exception)
            {
 
            }
            glEnd();
 
                if (mesh->facearray[k].v1  < mesh->nvertices)
                {
                maxNumRan = (maxNumRan>mesh->vertexarray[mesh->facearray[k].v1].x)?maxNumRan:(mesh->vertexarray[mesh->facearray[k].v1].x);
                maxNumRan = (maxNumRan>mesh->vertexarray[mesh->facearray[k].v1].y)?maxNumRan:(mesh->vertexarray[mesh->facearray[k].v1].y);
                maxNumRan = (maxNumRan>mesh->vertexarray[mesh->facearray[k].v1].z)?maxNumRan:(mesh->vertexarray[mesh->facearray[k].v1].z);
                }
                if (mesh->facearray[k].v2  < mesh->nvertices)
                {
                maxNumRan = (maxNumRan>mesh->vertexarray[mesh->facearray[k].v2].x)?maxNumRan:(mesh->vertexarray[mesh->facearray[k].v2].x);
                maxNumRan = (maxNumRan>mesh->vertexarray[mesh->facearray[k].v2].y)?maxNumRan:(mesh->vertexarray[mesh->facearray[k].v2].y);
                maxNumRan = (maxNumRan>mesh->vertexarray[mesh->facearray[k].v2].z)?maxNumRan:(mesh->vertexarray[mesh->facearray[k].v2].z);
                }
                if (mesh->facearray[k].v3  < mesh->nvertices)
                {
                maxNumRan = (maxNumRan>mesh->vertexarray[mesh->facearray[k].v3].x)?maxNumRan:(mesh->vertexarray[mesh->facearray[k].v3].x);
                maxNumRan = (maxNumRan>mesh->vertexarray[mesh->facearray[k].v3].y)?maxNumRan:(mesh->vertexarray[mesh->facearray[k].v3].y);
                maxNumRan = (maxNumRan>mesh->vertexarray[mesh->facearray[k].v3].z)?maxNumRan:(mesh->vertexarray[mesh->facearray[k].v3].z);
               }
 
        }
      glEndList();
      NumElement++;
    }
 
    nRange = 2*maxNumRan;
 
    SetViewport(true,Form1->Panel_Picture->Width,Form1->Panel_Picture->Height);
  if (mesh!=NULL)
  {
    RelMeshObj3ds(&mesh);
  }
  if (mat!=NULL)
  {
    RelMeshObj3ds(&mesh);
  }
 
  ReleaseDatabase3ds(&db);
  PRINT_ERRORS_EXIT(stderr);
  CloseFile3ds(file);
  PRINT_ERRORS_EXIT(stderr);
 
}
Это загрузчик

далее создание сетки
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
int LoadBitmap(char *filename)
{
    int i, j=0; //Index variables
    FILE *l_file; //File pointer
    unsigned char *l_texture; //The pointer to the memory zone in which we will load the texture
 
    // windows.h gives us these types to work with the Bitmap files
    BITMAPFILEHEADER fileheader;
    BITMAPINFOHEADER infoheader;
    RGBTRIPLE rgb;
 
    num_texture++; // The counter of the current texture is increased
 
    //Zadaem Texturu object 1
 
    if (NumPicture==1) {
    UnicodeString Texture= ExtractFileDir (Application->ExeName) + "\\texmal.bmp";
    filename = Texture.t_str();
    }
 
    //Zadaem Texturu obkect2
 
    if (NumPicture==2) {
    UnicodeString Texture= ExtractFileDir (Application->ExeName) + "\\Device.bmp";
    filename = Texture.t_str();
    }
 
    //Zadaem Texturu object 3
 
    if (NumPicture==3) {
    UnicodeString Texture= ExtractFileDir (Application->ExeName) + "\\Door.bmp";
    filename = Texture.t_str();
    }
 
    NumPicture++;
    if( (l_file = fopen(filename, "rb"))==NULL) return (-1); // Open the file for reading
 
    fread(&fileheader, sizeof(fileheader), 1, l_file); // Read the fileheader
 
    fseek(l_file, sizeof(fileheader), SEEK_SET); // Jump the fileheader
    fread(&infoheader, sizeof(infoheader), 1, l_file); // and read the infoheader
 
    // Now we need to allocate the memory for our image (width * height * color deep)
    l_texture = (byte *) malloc(infoheader.biWidth * infoheader.biHeight * 4);
 
    // And fill it with zeros
    memset(l_texture, 0, infoheader.biWidth * infoheader.biHeight * 4);
 
    // At this point we can read every pixel of the image
    for (i=0; i < infoheader.biWidth*infoheader.biHeight; i++)
    {
            // We load an RGB value from the file
            fread(&rgb, sizeof(rgb), 1, l_file);
 
            // And store it
            l_texture[j+0] = rgb.rgbtRed; // Red component
            l_texture[j+1] = rgb.rgbtGreen; // Green component
            l_texture[j+2] = rgb.rgbtBlue; // Blue component
            l_texture[j+3] = 255; // Alpha value
            j += 4; // Go to the next position
    }
 
    fclose(l_file); // Closes the file stream
 
    glBindTexture(GL_TEXTURE_2D, num_texture); // Bind the ID texture specified by the 2nd parameter
 
    // The next commands sets the texture parameters
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // If the u,v coordinates overflow the range 0,1 the image is repeated
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // The magnification function ("linear" produces better results)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); //The minifying function
 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); // We don't combine the color with the original surface color, use only the texture map.
 
    // Finally we define the 2d texture
    glTexImage2D(GL_TEXTURE_2D, 0, 4, infoheader.biWidth, infoheader.biHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, l_texture);
 
    // And create 2d mipmaps for the minifying function
    gluBuild2DMipmaps(GL_TEXTURE_2D, 4, infoheader.biWidth, infoheader.biHeight, GL_RGBA, GL_UNSIGNED_BYTE, l_texture);
 
    free(l_texture); // Free the memory we used to load the texture
 
    return (num_texture); // Returns the current texture OpenGL ID
}
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,027
Записей в блоге: 10
Завершенные тесты: 1
26.07.2013, 11:26     Экспорт из 3d max, наложение текстуры #6
У меня какая-то другая библиотека...
Тут скорее всего координаты вершин ( mesh->textarray[mesh->facearray[k].v1].u , mesh->textarray[mesh->facearray[k].v1].v ) не в масштабах [0,1]
Vozyka Yaroslav
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 45
26.07.2013, 11:48  [ТС]     Экспорт из 3d max, наложение текстуры #7
Да. Координаты при использование объекта из примера 1,213.. и 1,426... Координаты при использовании моего обекта 11.12... и 12.432... (получено опытным путем). Попробовал вручную заменить координаты (mesh->textarray... на 1 и 1), вообще ничего не получилось.
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,027
Записей в блоге: 10
Завершенные тесты: 1
26.07.2013, 11:53     Экспорт из 3d max, наложение текстуры #8
Покажи хоть скриншот, чтобы представлять как это выглядит..
Vozyka Yaroslav
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 45
26.07.2013, 12:50  [ТС]     Экспорт из 3d max, наложение текстуры #9
http://files.mail.ru/EB2F1B8DC4F3451E815B129795939D93 Скриншот
Слева плоскость из примера, текстура у плоскости и у прового цилиндра одинаковая (с не круглыми объектами тоже самое).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2013, 13:21     Экспорт из 3d max, наложение текстуры
Еще ссылки по теме:

Определить значение Z=max(a,2b)*max(2a-b,b), где max(x,y)-максимальное из чисел x,y C++
Определить значение функции max(a, max(a/2, cos b))*max(2a-b,b) C++
C++ Задача для курсовой: определить значение z=max(a, 2b)*max(2a-b,b), где max(x, y)-максимальные из чисел х и у

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,027
Записей в блоге: 10
Завершенные тесты: 1
26.07.2013, 13:21     Экспорт из 3d max, наложение текстуры #10
Откуда либу брал? Может стоит попробовать эту: http://code.google.com/p/lib3ds/down...9.zip&can=2&q=
Yandex
Объявления
26.07.2013, 13:21     Экспорт из 3d max, наложение текстуры
Ответ Создать тему
Опции темы

Текущее время: 10:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru