XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Общение> Hard & Soft
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
ScorpioT1000
think().do().enjoy()
offline
Опыт: отключен
Collada формат моделей .DAE (+ FCollada API) model format
Эта тема, где я буду складывать некоторые вещи касательно Collada.
COLLADA — это формат, разработанный для обмена между 3D приложениями. Управляется некоммерческой организацией Khronos Group.
COLLADA использует открытый стандарт XML для обмена форматами, которые в противном случае были бы несовместимы.
COLLADA был задуман как промежуточный формат для переноса файлов. Реализована поддержка таких программ, как Maya (используя ColladaMaya); 3ds Max (при помощи ColladaMax); Poser (v.7.0); Lightwave 3D (version 9.5); Cinema 4D (MAXON); Softimage|XSI; Houdini; MeshLab; CityScape, CityEngine, SketchUp, Blender, modo и Strata 3D. Adobe Photoshop с версии CS3. Игровые движки, такие как Unreal engine, Unity и Torque 3D, также поддерживают этот формат.
— Wikipedia.
После того, как моя работа с коллада будет закончена, хочу, чтобы эти файлы остались - вдруг, пригодятся.
Я остановился на API FCollada, поскольку данный пакет очень быстро поставился, в отличие от других.
Однако, в 2008 году Feeling Software Inc. перестали поддерживать данный API и стали работать над другим, коммерческим. Но это не значит, что я обязан отказаться от его использования.
Документация из кода FCollada
Пример реиндексации геометрии
Структура хранения костей
Далее есть некоторые беседы по поводу Collada из icq. Тоже выложу здесь, чтобы не потерять =)
» О том, что делать, когда информации о позициях меньше, чем самих вершин
ScorpioT1000, 23.12.2012 20:50:14:
смотри мы обсуждали что нормалей 6,позиций 4 и индексов 6, дальше получается что у тебя каждый индекс указывает на каждую новую позицию ?
ScorpioT1000, 20:50:25:
ну когда ты говорил что создаешь
ScorpioT1000, 20:50:35:
ну да в принципе так и есть
ScorpioT1000, 20:50:47:
т.е. число индексов = числу вершин
Jonny, 20:50:48:
да, получается 6 индексов 6 вершин, каждый индекс указывает на уникальную вершину
ScorpioT1000, 20:50:55:
ясно
ScorpioT1000, 20:51:00:
я щас так сделаю
ScorpioT1000, 20:51:25:
тока меня напрягает то что если полигон состоит из независимых треугольников, не будет ли там швов?
ScorpioT1000, 20:51:49:
ну вдруг рендер какойто не очень хороший, я же както еще предполагаю обратный экспорт в колладу
Jonny, 20:51:50:
всмысле не зависимых?
ScorpioT1000, 20:52:08:
ну тоесть позиция берется из разных значений а не из 1
Jonny, 20:52:15:
швы могут быть только если координаты вершин не равны
ScorpioT1000, 20:52:18:
и фейсы рендерятся считай неслитно
ScorpioT1000, 20:52:24:
тоесть это 100% ?
Jonny, 20:52:29:
да
ScorpioT1000, 20:52:44:
меня это напрягает немного, ну посмотрим тогда
Jonny, 20:53:01:
шов может получится хоть из-за ошибок округления, т.е. сделал ((x*2)+100)/2 и у тебя есть вероятность шова
Jonny, 20:53:13:
т.е. не так
Jonny, 20:53:15:
ну ты понял
Jonny, 20:53:38:
((x*2)+100)/2-50
ScorpioT1000, 20:53:59:
да, не я скорее про другое например в какомто случае эти вершины будут обрабатываться отдельно, хз в каком
Jonny, 20:54:02:
если просто брать и копировать координаты по значению то шва не будет
ScorpioT1000, 20:54:05:
тоесть позиции
ScorpioT1000, 20:54:13:
хотя в принципе они всегда отдельно как я понял
ScorpioT1000, 20:54:36:
тоесть выводятся на девайс
ScorpioT1000, 20:54:52:
параллельными массивами, а не так чтобы гдето меньше и гдето больше
Jonny, 20:55:10:
непонял
ScorpioT1000, 20:55:58:
ну типа нельзя так в графический девайс отправить, чтобы индексов позиций было меньше чем индексов
Jonny, 20:56:20:
можно
Jonny, 20:56:37:
так обычно и бывает
Jonny, 20:56:51:
или не понял
ScorpioT1000, 20:57:12:
ты говорил что так как оно представлено в формате коллады не подходит к реальному рендеру
Jonny, 20:58:11:
не подходит, в рендере можно рисовать вершины представленые по разному, это может быть один массив вершин состоящих из нормалей позиций и пр., а погут быть паралельные массивы вершин нормалей и пр.
Jonny, 20:58:28:
но массив индексов для этих массивов толкьо один
ScorpioT1000, 20:59:51:
ага тоесть
ScorpioT1000, 21:00:04:
нельзя сделать чтобы нормали шли не в том же порядке что вершины
Jonny, 21:00:18:
но паралельными массивами на практике никто не пользуется, это для специфических случаев если какието маленькие обьемы состовных частей вершины обновляется отдельно от других больших обьемов
ScorpioT1000, 21:00:19:
или нет
Jonny, 21:00:25:
нельзя
ScorpioT1000, 21:00:29:
ясно
ScorpioT1000, 21:00:51:
ну тоесть по сути надо вот так вот как выше обсуждалось "распаковывать" при случае
ScorpioT1000, 21:01:06:
при случае разных массивов
Jonny, 21:01:07:
да
ScorpioT1000, 21:15:20:
вроде получилось
модель в принципе может больше весить изза распаралленивания массивов вершин/нормалей/юв, но в противном случае будет потеря нормалей и текстурных карт в большинстве случаев. я это потом решу отдельно оптимизацией - он будет смотреть где нет потери и там соединять нормально
» про bind_shape_matrix
ScorpioT1000, 30.12.2012 16:08:32:
тут хрень такая есть
ScorpioT1000, 16:08:39:
<bind_shape_matrix>
1 0 0 0
0 1 0 90
0 0 1 0
0 0 0 1
</bind_shape_matrix>
ScorpioT1000, 16:09:12:
говорят что эта матрица описывает, как трансформировать геометрию в правильную систему координат для использования костями
и так может быть для каждого объекта я так понял
есть матрица трансформаций в анимации
и есть эта херня
они перемножаются чтоли?
ScorpioT1000, 16:10:47:
т.е. если мне нужна универсальная линейка кадров, надо каждый кадр анимации домножить на это?
Jonny, 16:14:17:
привет
Jonny, 16:14:36:
ну если так говорят то да, просто перемножаешь и все
» FCollada - как превратить матрицу трансформации в translate/rotate/scale и обратно
ScorpioT1000, 30.12.2012 17:12:54:
void Decompose(FMVector3& scale, FMVector3& rotation, FMVector3& translation, float& inverted) const;
ScorpioT1000, 17:13:23:
Recompose this matrix from its scale, rotation, and translation
components.; it also tells whether it is inverted.
ScorpioT1000, 30.12.2012 17:14:37:
/** Decompose this matrix into its scale, rotation, and translation
components; it also tells whether it is inverted. To get back the
Так же в FCollada есть кватернионы вращения, кусок кода, как я это делал:
#include "FMath/FMath.h"

// ...

                        FMVector3 rot;
                        FMVector3 trans;
                        FMVector3 scal;
                        float decompInv;
                        for(size_t i=0; i < transfVector.size(); ++i) {
                            transfVector[i].second.Decompose(scal,rot,trans,decompInv);
                            FMQuaternion quat = FMQuaternion::EulerRotationQuaternion(rot.x,rot.y,rot.z);
                            
                            mdl.m_Bones[outBoneId].rotation.m_FrameArray[i].m_iFrame = transfVector[i].first;
                            mdl.m_Bones[outBoneId].rotation.m_FrameArray[i].m_Values[0].m_val = quat.x;
                            mdl.m_Bones[outBoneId].rotation.m_FrameArray[i].m_Values[1].m_val = quat.y;
                            mdl.m_Bones[outBoneId].rotation.m_FrameArray[i].m_Values[2].m_val = quat.z;
                            mdl.m_Bones[outBoneId].rotation.m_FrameArray[i].m_Values[3].m_val = quat.w;
                            mdl.m_Bones[outBoneId].translation.m_FrameArray[i].m_iFrame = transfVector[i].first;
                            mdl.m_Bones[outBoneId].translation.m_FrameArray[i].m_Values[0].m_val = trans.x;
                            mdl.m_Bones[outBoneId].translation.m_FrameArray[i].m_Values[1].m_val = trans.y;
                            mdl.m_Bones[outBoneId].translation.m_FrameArray[i].m_Values[2].m_val = trans.z;
                            mdl.m_Bones[outBoneId].scaling.m_FrameArray[i].m_iFrame = transfVector[i].first;
                            mdl.m_Bones[outBoneId].scaling.m_FrameArray[i].m_Values[0].m_val = scal.x;
                            mdl.m_Bones[outBoneId].scaling.m_FrameArray[i].m_Values[1].m_val = scal.y;
                            mdl.m_Bones[outBoneId].scaling.m_FrameArray[i].m_Values[2].m_val = scal.z;
                        }
// ...

Отредактировано ScorpioT1000, 04.01.2013 в 01:04.
Старый 04.01.2013, 00:09
ScorpioT1000
think().do().enjoy()
offline
Опыт: отключен
Полезный топик, как читать матрицы преобразований Matrix-animation-output-transform-array, в анимациях:
Старый 04.01.2013, 07:45
ScorpioT1000
think().do().enjoy()
offline
Опыт: отключен
Хороший туториал по структуре collada www.wazim.com/Collada_Tutorial_1.htm
ScorpioT1000 добавил:
Ещё я узнал, что FCollada читает файлы текстур во время парсинга - видимо, сверяет заголовки. Так вот, там есть бага - иногда обращение по несуществующей ячейке и фатал, фиксится так:
файл FUUri.cpp, строка 289
заменить
			if (path[0] == '/' && path[3] == '/')
на
			if ((path.length() >= 4) && path[0] == '/' && path[3] == '/')
естественно, если у вас есть сорцы. если нет - снимать штаны и бегать)
Старый 05.01.2013, 13:00
ScorpioT1000
think().do().enjoy()
offline
Опыт: отключен
ОЧЕНЬ ДОЛГО мучался с матрицами позиций, теперь все строго и по полочкам:
  1. у контроллера есть статик матрицы
  1. у джоинтов есть статик матрицы
  1. у костей есть статик матрицы
  1. у костей есть анимированные матрицы
1 и 2 надо перемножить, обратить и применить к позициям костей
2 я пока взял только translation и вычел ее из 4, т.е. из каждой матрицы анимаций
ну с 4 все ясно, делим на кватернион, перемещение и масштабирование
Старый 21.01.2013, 04:26
ScorpioT1000
think().do().enjoy()
offline
Опыт: отключен
Результат трудов: xgm.ru/p/wc3/xldataconverter
Старый 22.01.2013, 07:16
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 03:02.