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

C++

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

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

09.09.2016, 10:06. Просмотров 391. Ответов 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);
}


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

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

Обработка некорректного формата файла - C++
Здравствуйте. Такой вопрос: по заданию нужно организовать обработку неккоректного формата входящего файла, не знаю как именно можно...

Создание собственного формата файла - C++
Я уверен что данный вопрос уже рассматривался на форуме но поискав ничего такого не смог найти. По этому поясню что мне надо. Появилась...

Считывание из файла определенного формата - C++
Доброе время суток, запутался тут, помогите пожалуйста. информация в файле представлена следующим образом ...

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

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

У кого есть описание формата скрипт файла ресурсов (.rc) - C++
У кого есть описание формата скрипт файла ресурсов (.rc) для линкера.

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

Неразрешенных внешних элементов FBX Sdk - C++
Подключаю к проекту: #include &lt;fbxsdk.h&gt; Ругается на функцию: FbxManager *manager = FbxManager::Create(); Пишет: error LNK2019:...

Каким образом открыть двоичный код, файла любого формата? - C++
Каким образом открыть двоичный код, файла любого формата? Гугл читал, толком ничего не нашел, может кто что-то посоветует?

Исследование "неизвестного" формата (отрезать начало файла до определённого заголовка) - C++
Здравствуйте! Программированию я учусь собственными силами, о преподаваемом в университетах или на курсах не имею ни малейшего понятия....

Отображение файла в памяти - 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