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

C++

Войти
Регистрация
Восстановить пароль
 
Warsmit
3 / 3 / 2
Регистрация: 13.05.2016
Сообщений: 38
#1

Отображение файла формата .fbx - C++

09.09.2016, 10:06. Просмотров 418. Ответов 0

Здравствуйте,здесь мы будем мучать openGL, fbx sdk, ImageMagick, assimp.
В двух словах, как я думаю, у меня проблема с UV координатами.

Мне необходимо сделать программу для отображения .fbx файлов.
Файлы .fbx делаются в 3d max.

Текстуры мне предоставляются в .png, и на одном файле могут находиться текстуры для 10ти моделей.
Накладываясь на модели, но она должна растягиваться по UV координатам, а у меня текстуры копирует всю .png картинку на модель, и вместо загрузки на деталь одного куска текстуры из png у меня на текстуру натягиваются несколько полных копии этого png файла.

Как я дошёл до такого.

Я скачал FBX SDK, стырил ихний samples - ViewScene(из fbx sdk 2016)
Модель загружается корректно, но в примере используются текстуры только формата TGA, а мои файлы .fbx с png текстурами. Я подключил библиотеку ImageMagick, и смог загрузить текстуры png формата, но проблема в том, что слетела UV развёртка.
Результат на 1 картинке.
код загрузки файла с помощью ImageMagick

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
bool LoadTextureFromFile(const FbxString & pFilePath, unsigned int &pTextureObject)
{
    try
    {
        m_pImage = new Magick::Image((std::string)pFilePath);
        m_pImage->write(&m_blob, "RGB", 8);
    }
    catch (Magick::Error& Error)
    {
        //std::cout << "Error loading texture '" << pFilePath << "': " << Error.what() << std::endl;
        return false;
    }
 
    glGenTextures(1, &pTextureObject);
 
    glBindTexture(GL_TEXTURE_2D, pTextureObject);
 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_pImage->columns(), m_pImage->rows(), 0, GL_RGB, GL_UNSIGNED_BYTE, m_blob.data());
 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
 
    glGenerateMipmap(GL_TEXTURE_2D);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
 
    return true;
}


Помимо этого примера, я долго изучая гугл нашёл один ресурс.
На нём парень учит работать с openGL через шейдеры, всё на русском и подробно.
ссылка на уроки- http://triplepointfive.github.io/ogltutor/

у него я нашёл "Урок 22 - Загрузка моделей через Assimp"
http://triplepointfive.github.io/ogl...utorial22.html

я собрал данный пример, загрузил свой .fbx файл
модель не правильно загрузилась, но полазив в настройках и добавив в Assimp::Importer Importer настройку aiProcess_OptimizeMeshes я получил правильно загруженную модель(правда в одном месте, смотря сверху не загрузилась деталька модели, хотя если изнутри смотреть она есть, от отрисовывалась)

Но опять же, UV развёртки нету.
Результат на второй картинке.
код загрузки файла с помощью ImageMagick

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
#include <iostream>
#include "texture.h"
 
Texture::Texture(GLenum TextureTarget, const std::string& FileName)
{
    m_textureTarget = TextureTarget;
    m_fileName      = FileName;
    m_pImage        = NULL;
}
 
bool Texture::Load()
{
    try 
    {
        m_pImage = new Magick::Image(m_fileName);
        m_pImage->write(&m_blob, "RGBA");
    }
    catch (Magick::Error& Error) 
    {
        std::cout << "Error loading texture '" << m_fileName << "': " << Error.what() << std::endl;
        return false;
    }
    std::cout << "m_textureTarget " << m_textureTarget << " m_textureObj " << m_textureObj << " filename " << m_fileName << "\nm_blob.data() " << m_blob.data() << " width " << m_pImage->columns() << " height " << m_pImage->rows() << std::endl;
    glGenTextures(1, &m_textureObj);
    glBindTexture(m_textureTarget, m_textureObj);
    glTexImage2D(m_textureTarget, 0, GL_RGBA, m_pImage->columns(), m_pImage->rows(), 0, GL_RGBA, GL_UNSIGNED_BYTE, m_blob.data());
 
    glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_T, GL_REPEAT);
 
    glTexParameteri(m_textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(m_textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 
 
    return true;
}
 
void Texture::Bind(GLenum TextureUnit)
{
    glActiveTexture(TextureUnit);
    glBindTexture(m_textureTarget, m_textureObj);
}


Я очень рассчитываю на вашу помощь я уже потратил много времени на эту проблему.
0
Миниатюры
Отображение файла формата .fbx   Отображение файла формата .fbx  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2016, 10:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Отображение файла формата .fbx (C++):

Сохранение файла с сохранением формата - C++ Builder
Доброго времени суток! Дела обстоят так : Пишу текстовый редактор,все написано,осталось сделать сохранение файла. И вот как мне сделать,...

Отображение иконок из PE файла - C++ Builder
Пробую для начала считать 1ю иконку.Но выходит только ERROR_RESOURCE_TYPE_NOT_FOUND :( OpenDialog1-&gt;Execute(Form1-&gt;Handle); ...

Скачивание файла, и отображение прогресса - C++ Builder
Собственно такой вопрос: скачиваю какой-то файл через IdHTTP (пример нашёл где-то случайно) TFileStream* fs = new...

Считывание из файла и отображение в Canvas - C++ Builder
Столкнулся с проблемой, когда вывожу данные из файла, то вместо 0 считывает 4 и к любому символу будь то 5 или любой другой добавляется 4. ...

Отображение названия файла с которым работаешь ? - C++ Builder
Редактирую таблицу StringGrid - данные загружены через OpenDialog из текстового файла .txt Подскажите как реализовать - чтобы на Form1 ...

Отображение текстового файла в ListBox с использованием буфера - C++ Builder
Здравствуйте! Есть текстовый файл размером 2 Мб. Нужно отобразить данный файл в ListBox с размером буфера 2 б. Подскажите, как можно...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2016, 10:06
Привет! Вот еще темы с ответами:

Изменение даты и времени в заголовке файла PE-формата - Visual C++
Дорогие друзья, помогите, пожалуйста. Я хочу изменить дату и время в заголовке файла PE-формата. Вот кусок кода, где я пытаюсь вывести...

Проигрывание файла формата mp3 - C++ WinAPI
Пишу Игру Паопао. Есть фоновая мелодия, и есть звук при клике на одинаковые картинки. Фоновая мелодия в мп3, а на картинки wav. Из...

Чтение файла журнала событий старого формата (*.evt) - C++ WinAPI
Есть необходимость написать просмоторщик файлов журналов событий. В том числе и файлов старого формата (*.evt) созданных, к примеру на...

Отображение файла в памяти - C++ WinAPI
Разбирал пример из книги Побегайло про проецирование объекта в памяти. Код: #include &quot;StdAfx.h&quot; #include &lt;windows.h&gt; #include...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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