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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Vozyka Yaroslav
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 45
#1

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

26.07.2013, 10:20. Просмотров 1238. Ответов 9
Метки нет (Все метки)

Здравствуйте. Проблема с наложением текстуры.
С помощью библиотеки lib3ds.lib импортирую 3ds файл в программу (простой куб), накладываю текстуру. Текстура независимо от размера (64х64 или 512х512) накладывается маленькими повторяющимися квадратами. Когда беру 3ds файл из примера (был вместе с библиотекой) текстура накладывается нормально. Когда делаю в 3d max сцену из двух объектов, один мой, второй из примера тоже самое. На мой объект текстура накладывается квадратами, а на другой нормально.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2013, 10:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Экспорт из 3d max, наложение текстуры (C++):

Даны действительные числа A, B, C. Получить max(a,a+b)+max(a,b+c,a+b) \ 1+max(ab,bc)+max(a+bc,15,ac) - C++
Всем привет)Помогите пожалуйста написать в С++ Даны действительные числа A, B, C. Получить max(a,a+b)+max(a,b+c,a+b) \...

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

Определить значение Z=max(a,2b)*max(2a-b,b), где max(x,y)-максимальное из чисел x,y - C++
Помогите решить задачу: Определить значение Z=max(a,2b)*max(2a-b,b), где max(x,y)-максимальное из чисел x,y. Задачу решить двумя...

Определить значение функции max(a, max(a/2, cos b))*max(2a-b,b) - C++
Составьте программу для решения задачи. Определите значение õ=max(a, max(a/2, cos b))*max(2a-b,b) , где max(x,y)есть максимальное из...

Найти min(max(x, y), max(x, z), max(z, d) - C++
Даны различные действительные числа x, y, z, d. Найти min(max(x, y), max(x, z), max(z, d)).

Наложение текстуры - Графика и игры
Создаю обод при помощи gluDisk. Можно ли наложить текстуру только на полученный обод исключая отверстие? Пока у меня получается наложение...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
26.07.2013, 10:46 #2
Координаты текстуры неправильно выставляешь.
0
Vozyka Yaroslav
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 45
26.07.2013, 10:54  [ТС] #3
Экспорт делает заимствованный модуль, он же и выставляет координаты автоматически. Координаты ставит относительно объекта. Поэтому вопрос, почему практически идентичные объекты он раскрашивает по разному. Возможно создавать обект (в 3ds max) надо как то по осебенному или что-нибудь указывая?
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
26.07.2013, 10:57 #4
Перед тем как это сказать я специально скачал эту библиотеку, и посмотрел пример, в котором в ручную вписаны координаты текстуры.
Да и, может ты уже наконец покажешь как ты это делаешь в своей программе!? Нам что тут, гадать надо где у тебя там ошибки?
0
Vozyka Yaroslav
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 45
26.07.2013, 11:02  [ТС] #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
}
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
26.07.2013, 11:26 #6
У меня какая-то другая библиотека...
Тут скорее всего координаты вершин ( mesh->textarray[mesh->facearray[k].v1].u , mesh->textarray[mesh->facearray[k].v1].v ) не в масштабах [0,1]
0
Vozyka Yaroslav
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 45
26.07.2013, 11:48  [ТС] #7
Да. Координаты при использование объекта из примера 1,213.. и 1,426... Координаты при использовании моего обекта 11.12... и 12.432... (получено опытным путем). Попробовал вручную заменить координаты (mesh->textarray... на 1 и 1), вообще ничего не получилось.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
26.07.2013, 11:53 #8
Покажи хоть скриншот, чтобы представлять как это выглядит..
0
Vozyka Yaroslav
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 45
26.07.2013, 12:50  [ТС] #9
http://files.mail.ru/EB2F1B8DC4F3451E815B129795939D93 Скриншот
Слева плоскость из примера, текстура у плоскости и у прового цилиндра одинаковая (с не круглыми объектами тоже самое).
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
26.07.2013, 13:21 #10
Откуда либу брал? Может стоит попробовать эту: http://code.google.com/p/lib3ds/down...9.zip&can=2&q=
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2013, 13:21
Привет! Вот еще темы с ответами:

Наложение текстуры - OpenGL
Здравствуйте, подскажите пожалуйста почему при наложении текстуры выдается ошибка. С программой работаю впервые учебники читала, но так...

Наложение текстуры - OpenGL
Здравствуйте, как наложить текстуру на пятиугольник?

Наложение текстуры - HTML, CSS
Здравствуйте. Давно уже мучает один вопрос... Можно ли наложить текстуру с прозрачностью поверх сайта? Пробовал через отдельные блоки ...

Наложение текстуры - OpenGL
Добрый день! Пытаюсь наложить текстуру. Прочитать получается, а наложить не могу. Код: #include &quot;stdafx.h&quot; #include &quot;bmp.h&quot; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.07.2013, 13:21
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru