Difference between revisions of "Mesh Converter"
(→Scope) |
|||
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
Contents
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, увидите примерно то же, что на рисунке.
Обратите внимание на положение носика чайника при просмотре 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
В результате выполнения должен отобразиться тот же чайник, но с небольшим отличием.
Если сравнить рисунки, можно заметить, что нос чайника в 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