Chaos_Optima
Так же быстрее:
float4 position = float4(In.position, 1.f); matrix finalMatrix; finalMatrix = In.weights.x * mat[bones.x]; finalMatrix += In.weights.y * mat[bones.y]; finalMatrix += In.weights.z * mat[bones.z]; finalMatrix += In.weights.w * mat[bones.w]; // Позиция position = mul( position, finalMatrix); // Нормаль, тангент и пр. normal = mul( In.normal, ( float3x3)finalMatrix);
Стоит, наверное, добавить описание или статью про скиннинг на двойных кватернионах.
Gurich
> Так же быстрее:
да, просто мне кажется то более наглядно не?
Аналогично - скелетную анимацию сделал сам и понимаю как она работает.
Статья бесполезна.
какая еще такая базе и резинная тфу - релизная матрица?
может localTransform, worldTransform
???
напиши еще как анимацию ног миксить с анимацией тела если они разные
скелетную анимацию сделал сам и понимаю как она работает.
Статья бесполезна.
и привязка вершины к кости программно интересно услышать и распределение весов - ну тупо если я хочу имея скелет погнуть на нем процедурный меш и тп
задать без UI
и твой шадер неуниверсален
посмотри на шадер нв демы , где арлекин бегает
все четко и с лупом
>пример приложу но без исходников
а нафига новичкам курящим тему демо да еще и без исходников?
и с тебя еще так же для новичков пример экспорта из maxAPI
)
на дтф была статья давнишняя - там все это описывалось
А вообще в "правильных движках" и "по-правильному" вершины двигаются шейдерами? Вертексными? Если я использую к примеру модель VBO в OpenGL, у мну есть указатель на массив вершин, указатель на массив треугольников, указатель на массив индексов и т.д., я могу двигать вершины из шейдера?
Еще: fbx ведь поддерживает скелетную анимацию. А как там хранится это все? есть описание fbx'а в природе?
Ох, как это я пропустил статью. :)
.Scotina
> вон Экзекутор писал, что то вроде "если нет примера, я и статью читать не буду")
Да да. :)
Зачем теория, которая на практике может вообще нифига не работает, а всё что в статье лишь фантазия автора. :)
> 1 — Индексы костей в вершине, обычно их бывает не больше четырёх.
Согласен, но спорно. В том же Думе 3 их больше 4, что-то около 8+.
В Unity как я понял тоже это значение больше 4ёх.
Я думаю фразу надо переписать как-то так:
1 - Индексы костей в вершине, обычно, при реализации скелетной анимации на GPU, их используют не больше четырёх
> 4 — Bind pose — это поза в которой была заклинена модель
Заклинена? Может заскинена?
> внутри файла это выглядит как массив обратных матриц на каждую кость и одна матрица для всей модели.
Не согласен, по разному бывает. У меня не обратная хранится и нет матрицы для всей модели.
> 6 — Сама анимация, обычно представляет из себя массив времени, где каждый элемент это время ключа, и массив матриц на каждую кость.
Я понял о чём речь, но звучит как-то не понятно про эти ключи и массивы времени.
> Final[ i ] = ModelBindPose * Offset[ i ] * Bone[ i ];
> Final[ i ] = ModelBindPose * Offset[ i ] * Bone[ i ];
Дважды дублируется один и тот же код, но я так и не понял что такое Offset и откуда он взялся.
Ну а дальше смысл от меня ускользает, не очень понятно о чём идёт речь.
> Это только для позиции, таким же способом нужно обновить нормали, тангенты и бинормали.
Не таким же. Для них уже ротейт матрица нужна, без транслейта, а если есть масштабирование, то ещё дополнительные действия.
Итог: Статья ничего не рассказывает на пальцах. Больше подходит на статью для термина "скелетная анимация", чтобы кратко общно рассказать что это, при этом не вдаваясь в детали.
San4es
> Еще: fbx ведь поддерживает скелетную анимацию. А как там хранится это все? есть описание fbx'а в природе?
Нужно курить документацию и примеры, курить усердно, потому что всё запутано и термины на всё у них свои. :)
San4es
> А вообще в "правильных движках" и "по-правильному" вершины двигаются шейдерами?
> Вертексными? Если я использую к примеру модель VBO в OpenGL, у мну есть
> указатель на массив вершин, указатель на массив треугольников, указатель на
> массив индексов и т.д., я могу двигать вершины из шейдера?
да.
San4es
> Еще: fbx ведь поддерживает скелетную анимацию. А как там хранится это все? есть
> описание fbx'а в природе?
есть fbx sdk с примерами и полной документацией по формату.
Executor
> Зачем теория, которая на практике может вообще нифига не работает, а всё что в
> статье лишь фантазия автора. :)
ну пример я выложил, демка построена по тем принципам что в описаны в статье.
Executor
> Я думаю фразу надо переписать как-то так:
справедливо, но я крайне редко встречал игры где было больше 4 индексов.
Executor
> Заклинена? Может заскинена?
упс. поправлю, спасибо.
Executor
> Я понял о чём речь, но звучит как-то не понятно про эти ключи и массивы
> времени.
да мне тоже не нравится, но ничего лучше не придумал.
Executor
> но я так и не понял что такое Offset и откуда он взялся.
это BindPose кости.
Executor
> Не таким же. Для них уже ротейт матрица нужна, без транслейта, а если есть
> масштабирование, то ещё дополнительные действия.
да поправлю. просто в HLSL при умножении float3 на float4x4 берётся float3x3 то есть только матрица вращения. А масштабирование обычно роли не играет, оно может помешать только при условии что оно не равно направленно.
Chaos_Optima
> ну пример я выложил, демка построена по тем принципам что в описаны в статье.
Это к тебе не относилось, я в общем объяснял свою позицию на этот счёт.
> 6 — Сама анимация, обычно представляет из себя массив времени, где каждый элемент это время ключа, и массив матриц на каждую кость.
Вообще, на мой взгляд, тут может быть несколько вариантов.
Первый, это когда мы имеем фиксированный шаг времени, соответственно мы не храним в каждом ключе время, а храним только трансформации. То есть у нас просто массив трансформаций и значение FPS.
struct Key { Transform transform; }; struct Anim { float fps; Key* keys; };
Второй вариант, это когда в каждом ключе хранится время, то есть шаг времени между ключами не фиксированный.
struct Key { Time time; Transform transform; }; struct Anim { Key* keys; };
Как я понимаю в статье у тебя именно это, только время и трансформации в разных массивах.
Ну и ещё третий вариант с сплайнами, некое расширение для второго варианта.
> это BindPose кости.
Ну так может и назвать её BindPose?
В сталкере меньше 4 весов. Больше чем 4 веса это что-то странное;
Andrey
В DOOM3 вроде как более 4 бывает :)
Кстати, есть в Сталкере привязка uniforms к register ?
>Final[ i ] = ModelBindPose * Offset[ i ] * Bone[ i ];
>Offset - это BindPose кости.
Так, стоп-стоп, все стало гораздно непонятней. Тогда что же таке ModelBindPose ?
Статья дает хорошее начало, но после заголовка "Процесс" превращается в нечто сделанное наспех на коленке. Было бы очень здорово, если бы автор переписал ее, добавив больше списков, примеров, пояснений, картинок, шейдеров, кватернионов. Я понимаю, что понять это очень просто, вся проблема в особенностях реализации, в мелочах, новичкам приходится трудно.
У меня еще одна проблема, связанная с порядком умножения матриц и пространством костей. Я сейчас запишу неправильный порядок (или правильный, не могу понять), а потом прошу меня поправить.
Тема в архиве.