Difference between revisions of "Mesh Converter"

From Ciliz|W4
Line 25: Line 25:
 
Если посмотрите файл с помощью утилиты Autodesk FBX Review, увидите примерно то же, что на рисунке.
 
Если посмотрите файл с помощью утилиты Autodesk FBX Review, увидите примерно то же, что на рисунке.
 
</translate>
 
</translate>
 +
 
[[File:D1b94d56-cb70-428b-ac1c-65701c690238.png|500px]]  
 
[[File:D1b94d56-cb70-428b-ac1c-65701c690238.png|500px]]  
 +
 
<translate>
 
<translate>
 
Обратите внимание на положение носика чайника при просмотре fbx, мы вернемся к этому чуть позже.
 
Обратите внимание на положение носика чайника при просмотре fbx, мы вернемся к этому чуть позже.
Line 35: Line 37:
 
Далее, для преобразования модели в формат нашего движка (asset) необходимо выполнить:
 
Далее, для преобразования модели в формат нашего движка (asset) необходимо выполнить:
 
</translate>
 
</translate>
 +
 
  ./W4MeshConverter utah-teapot.fbx teapot
 
  ./W4MeshConverter utah-teapot.fbx teapot
 +
 
<translate>
 
<translate>
 
В результате появится директория teapot содержащая данные ассета.
 
В результате появится директория teapot содержащая данные ассета.
Line 43: Line 47:
 
Для работы с ассетом необходимо скопировать его директорию (в нашем случае это teapot) в директорию resources проекта. Директория resources располагается на том же уровне структуры проекта, что и sources. Таким образом, структура проекта станет подобна следующей:
 
Для работы с ассетом необходимо скопировать его директорию (в нашем случае это teapot) в директорию resources проекта. Директория resources располагается на том же уровне структуры проекта, что и sources. Таким образом, структура проекта станет подобна следующей:
 
</translate>
 
</translate>
 +
 
  .
 
  .
 
  └── W4TemplateGame
 
  └── W4TemplateGame
Line 66: Line 71:
  
 
  auto asset = Asset::load(Path("resources/teapot", "teapot.asset"));
 
  auto asset = Asset::load(Path("resources/teapot", "teapot.asset"));
 +
 
<translate>
 
<translate>
 
Добавление в Render (отображение на экране):
 
Добавление в Render (отображение на экране):
 
</translate>
 
</translate>
 +
 
  auto root = RootNode::make();
 
  auto root = RootNode::make();
 
  root->addChild(asset->getRoot());
 
  root->addChild(asset->getRoot());
 
  Render::instance().getPass(0)->setRoot(root);
 
  Render::instance().getPass(0)->setRoot(root);
 +
 
<translate>
 
<translate>
 
Полный код примера:
 
Полный код примера:
 
</translate>
 
</translate>
 +
 
  #include "W4Framework.h"
 
  #include "W4Framework.h"
 
   
 
   
Line 105: Line 114:
 
В результате выполнения должен отобразиться тот же чайник, но с небольшим отличием.
 
В результате выполнения должен отобразиться тот же чайник, но с небольшим отличием.
 
</translate>
 
</translate>
 +
 
[[File:1b952599-fc03-428f-96e8-ae86935b46d8.png|500px]]
 
[[File:1b952599-fc03-428f-96e8-ae86935b46d8.png|500px]]
 +
 
<translate>
 
<translate>
 
Если сравнить рисунки, можно заметить, что нос чайника в FBX Review смотрит в одну сторону, а в нашем примере в другую. Это происходит из-за различий в системах координат и поведении конвертера.
 
Если сравнить рисунки, можно заметить, что нос чайника в FBX Review смотрит в одну сторону, а в нашем примере в другую. Это происходит из-за различий в системах координат и поведении конвертера.
 
</translate>
 
</translate>
 +
 
<translate>
 
<translate>
 
Система координат FBX Scene Axis and Unit Conversion является правосторонней (с осью Y направленной верх), тогда как [[Система координат W4]] левосторонняя (ось Y также направлена верх).
 
Система координат FBX Scene Axis and Unit Conversion является правосторонней (с осью Y направленной верх), тогда как [[Система координат W4]] левосторонняя (ось Y также направлена верх).
Line 117: Line 129:
 
Конвертация utah-teapot.fbx в ассет с именем asset в текущей директории:
 
Конвертация utah-teapot.fbx в ассет с именем asset в текущей директории:
 
</translate>
 
</translate>
 +
 
  ./W4MeshConverter utah-teapot.fbx
 
  ./W4MeshConverter utah-teapot.fbx
 +
 
<translate>
 
<translate>
 
Конвертация utah-teapot.fbx в ассет с именем teapot в текущей директории:
 
Конвертация utah-teapot.fbx в ассет с именем teapot в текущей директории:
 
</translate>
 
</translate>
 +
 
  ./W4MeshConverter utah-teapot.fbx teapot
 
  ./W4MeshConverter utah-teapot.fbx teapot
 +
 
<translate>
 
<translate>
 
Конвертация utah-teapot.fbx в ассет с именем teapot, который будет сохранен в директории ~/some/dir:
 
Конвертация utah-teapot.fbx в ассет с именем teapot, который будет сохранен в директории ~/some/dir:
 
</translate>
 
</translate>
 +
 
  ./W4MeshConverter utah-teapot.fbx teapot ~/some/dir  
 
  ./W4MeshConverter utah-teapot.fbx teapot ~/some/dir  
  
Line 131: Line 148:
 
Справка:
 
Справка:
 
</translate>
 
</translate>
 +
 
  -h, --help
 
  -h, --help
 +
 
<translate>
 
<translate>
 
Вывод статистики сцены:
 
Вывод статистики сцены:
 
</translate>
 
</translate>
 +
 
  -v, --verbose
 
  -v, --verbose
 +
 
<translate>
 
<translate>
 
Пример статистики:
 
Пример статистики:
 
</translate>
 
</translate>
 +
 
  (DEBUG) ==================== Scene statistics ====================
 
  (DEBUG) ==================== Scene statistics ====================
 
  (DEBUG) Nodes: 2
 
  (DEBUG) Nodes: 2
Line 155: Line 177:
 
  (DEBUG) create default material...
 
  (DEBUG) create default material...
 
  (DEBUG) create default skinned material...
 
  (DEBUG) create default skinned material...
 +
 
<translate>
 
<translate>
 
Управление размером (scale) на конвертации, где arg - значение, например (10, 1, 0.1):
 
Управление размером (scale) на конвертации, где arg - значение, например (10, 1, 0.1):
 
</translate>
 
</translate>
 +
 
  --scale arg
 
  --scale arg
 +
 
<translate>
 
<translate>
 
Переворот UV.Y координаты:
 
Переворот UV.Y координаты:
 
</translate>
 
</translate>
 +
 
  --uv-flip
 
  --uv-flip
  
Line 168: Line 194:
 
Для всех Mesh'ей могут быть заданы ограничения на максимальное количество вершин и индексов. Для Skinned Mesh'ей могут быть заданы ограничения на максимальное количество костей и максимальное количество костей на вершину.  
 
Для всех Mesh'ей могут быть заданы ограничения на максимальное количество вершин и индексов. Для Skinned Mesh'ей могут быть заданы ограничения на максимальное количество костей и максимальное количество костей на вершину.  
 
</translate>
 
</translate>
 +
 
<translate>
 
<translate>
 
Модель, которая упирается в текущие ограничения, можно сконвертировать с помощью флага force, однако работоспособность данной модели не гарантируется:
 
Модель, которая упирается в текущие ограничения, можно сконвертировать с помощью флага force, однако работоспособность данной модели не гарантируется:
 
</translate>
 
</translate>
 +
 
  -f, --force
 
  -f, --force
 +
 
<translate>
 
<translate>
 
Установка ограничения на максимальное количество вершин на объект, где arg - значение, по умолчанию не задано:
 
Установка ограничения на максимальное количество вершин на объект, где arg - значение, по умолчанию не задано:
 
</translate>
 
</translate>
 +
 
  --max-vertex arg
 
  --max-vertex arg
 +
 
<translate>
 
<translate>
 
Установка ограничения на максимальное количество индексов на объект, где arg - значение, по умолчанию не задано:
 
Установка ограничения на максимальное количество индексов на объект, где arg - значение, по умолчанию не задано:
 
</translate>
 
</translate>
 +
 
  --max-index arg
 
  --max-index arg
 +
 
<translate>
 
<translate>
 
Установка ограничения на максимальное количество костей для Skinned Mesh, где arg - значение, по умолчанию 28:
 
Установка ограничения на максимальное количество костей для Skinned Mesh, где arg - значение, по умолчанию 28:
 
</translate>
 
</translate>
 +
 
  --max-bones arg
 
  --max-bones arg
 +
 
<translate>
 
<translate>
 
Установка ограничения на максимальное количество костей на вершину для Skinned Mesh, где arg - значение, по умолчанию 8:
 
Установка ограничения на максимальное количество костей на вершину для Skinned Mesh, где arg - значение, по умолчанию 8:
 
</translate>
 
</translate>
 +
 
  --max-bones-per-vertex arg
 
  --max-bones-per-vertex arg

Revision as of 13:55, 13 May 2020

Scope

Игровой движок W4 использует собственный формат хранения сцены. Следовательно, прежде чем использовать сторонний ассет, его необходимо преобразовать в наш формат. Сделать это можно с помощью инструмента Mesh Converter, который поставляется вместе с нашим SDK.

Mesh Converter позволяет преобразовывать ассеты из формата Autodesk FBX (.fbx). Другие форматы не поддерживаются.

Technical limitations

Конвертер может преобразовать любой меш, но стоит помнить про ограничения движка, которые завязаны на ограничения WebGL. Оптимальное сочетания работоспособности и компактности решений достигается, если skinned mesh содержит не более 28 костей и/или 8 вершин на кость.

How to use

Загрузка репозитория проекта описана в статье Quick Start. Файл конвертера W4MeshConverter.bin находится в каталоге w4framework/tools . Конвертация запускается из командной строки, как это описано на следующем примере.

Exmple

Preparing

Возьмем для примера Utah teapot). Если посмотрите файл с помощью утилиты Autodesk FBX Review, увидите примерно то же, что на рисунке.

D1b94d56-cb70-428b-ac1c-65701c690238.png

Обратите внимание на положение носика чайника при просмотре fbx, мы вернемся к этому чуть позже.

Converting

Скопируем файл модели в директорию конвертера.

Далее, для преобразования модели в формат нашего движка (asset) необходимо выполнить:

./W4MeshConverter utah-teapot.fbx teapot

В результате появится директория teapot содержащая данные ассета.

Adding to the project structure

Для работы с ассетом необходимо скопировать его директорию (в нашем случае это teapot) в директорию resources проекта. Директория resources располагается на том же уровне структуры проекта, что и sources. Таким образом, структура проекта станет подобна следующей:

.
└── W4TemplateGame
    ├── resources
    │   └── teapot
    │       ├── Animations
    │       ├── BoneInfo
    │       ├── Materials
    │       │   ├── defaultMaterial.matInst
    │       │   └── defaultSkinnedMaterial.matInst
    │       ├── Splines
    │       ├── teapot.asset
    │       └── VertexData
    │           ├── Utah Teapot Quads_0.ib
    │           └── Utah Teapot Quads.vb
    └── sources
        └── main.cpp

Code example

Загрузка:

auto asset = Asset::load(Path("resources/teapot", "teapot.asset"));

Добавление в Render (отображение на экране):

auto root = RootNode::make();
root->addChild(asset->getRoot());
Render::instance().getPass(0)->setRoot(root);

Полный код примера:

#include "W4Framework.h"

W4_USE_UNSTRICT_INTERFACE

class AssetSample : public w4::IGame
{
public:

    AssetSample() = default;
    ~AssetSample() = default; 

    void onStart() override
    {
        auto cam = Render::instance().getScreenCamera();
        cam->setWorldTranslation({0.f, 0, -50.f});

        auto asset = Asset::load(Path("resources/teapot", "teapot.asset"));

        auto root =  RootNode::make();
        root->addChild(asset->getRoot());
        Render::instance().getPass(0)->setRoot(root);
    }
};

W4_RUN(AssetSample)

Result

В результате выполнения должен отобразиться тот же чайник, но с небольшим отличием.

1b952599-fc03-428f-96e8-ae86935b46d8.png

Если сравнить рисунки, можно заметить, что нос чайника в FBX Review смотрит в одну сторону, а в нашем примере в другую. Это происходит из-за различий в системах координат и поведении конвертера.

Система координат FBX Scene Axis and Unit Conversion является правосторонней (с осью Y направленной верх), тогда как Система координат W4 левосторонняя (ось Y также направлена верх).

Short manual

Basics

Конвертация utah-teapot.fbx в ассет с именем asset в текущей директории:

./W4MeshConverter utah-teapot.fbx

Конвертация utah-teapot.fbx в ассет с именем teapot в текущей директории:

./W4MeshConverter utah-teapot.fbx teapot

Конвертация utah-teapot.fbx в ассет с именем teapot, который будет сохранен в директории ~/some/dir:

./W4MeshConverter utah-teapot.fbx teapot ~/some/dir 

Common keys

Справка:

-h, --help

Вывод статистики сцены:

-v, --verbose

Пример статистики:

(DEBUG) ==================== Scene statistics ====================
(DEBUG) Nodes: 2
(DEBUG) Geometries: 1
(DEBUG) Poses: 0
(DEBUG) Materials: 1
(DEBUG) Textures: 0
(DEBUG) ====================== Axis & Scale ======================
(DEBUG) Up: +Y, Front: +ParityOdd, System: RightHanded
(DEBUG) Scale: 1.000000
(DEBUG) ================ Mesh: Red_label ================
(DEBUG) Vertex count: 404
(DEBUG) Index count: 2118
(DEBUG) All polygons are triangles: 1
(DEBUG) ==========================================================
(DEBUG) create default material...
(DEBUG) create default skinned material...

Управление размером (scale) на конвертации, где arg - значение, например (10, 1, 0.1):

--scale arg

Переворот UV.Y координаты:

--uv-flip

Setting limitations

Для всех Mesh'ей могут быть заданы ограничения на максимальное количество вершин и индексов. Для Skinned Mesh'ей могут быть заданы ограничения на максимальное количество костей и максимальное количество костей на вершину.

Модель, которая упирается в текущие ограничения, можно сконвертировать с помощью флага force, однако работоспособность данной модели не гарантируется:

-f, --force

Установка ограничения на максимальное количество вершин на объект, где arg - значение, по умолчанию не задано:

--max-vertex arg

Установка ограничения на максимальное количество индексов на объект, где arg - значение, по умолчанию не задано:

--max-index arg

Установка ограничения на максимальное количество костей для Skinned Mesh, где arg - значение, по умолчанию 28:

--max-bones arg

Установка ограничения на максимальное количество костей на вершину для Skinned Mesh, где arg - значение, по умолчанию 8:

--max-bones-per-vertex arg