Как проанализировать файл bvh для модели скелета, созданной в OpenGL?
Я пытаюсь проанализировать данные bvh для моего скелета, который я уже разработал с OpenGL. Есть одна вещь, касающаяся анализа данных, о которой мне стало интересно.
Данные Bvh состоят из двух частей: ИЕРАРХИЯ и ДВИЖЕНИЕ. HIERARCHY определяет древовидную структуру и данные OFFSET, которые используются для определения длины родительской кости. MOTION определяет положение корневой кости и конфигурации суставов каждой кости.
Я уже сделал свою модель с костями, которые были упомянуты в ИЕРАРХИИ. Я сделал свою модель под той же древовидной структурой, что и в HIERARCHY. (Конечно, длина между костями устанавливается мной произвольно, так как модель создается до анализа данных файла. Таким образом, длина моделируемой кости на самом деле немного отличается от данных OFFSET.)
Поскольку я уже создал модель, которую хочу анимировать, означает ли это, что я могу игнорировать часть HIERARCHY(=OFFSET) и просто читать часть данных MOTION для получения конфигурации соединения каждого соединения?
Я чувствую, что это действительно очевидный вопрос, но что-то кажется неправильным, потому что это означает, что я могу игнорировать первую половину (ИЕРАРХИЯ) файла и просто создать парсер для второй половины.
Есть ли какие-либо детали, которые я, возможно, упускаю из первой половины файла? Любая помощь будет оценена. Заранее спасибо!
1 ответ
ГСО HIERARCHY
содержит исходную позу скелета (без каких-либо MOTION
данные). Итак OFFSET
на самом деле определить начальную ориентацию каждой кости тоже. Если вы проигнорируете это, вы потеряете синхронизацию между BVH и вашей сеткой. Что вам нужно сделать, это:
- разбирать целиком
HIERARCHY
состав для каждого костного вычисления преобразование со шкалой, которая выравнивает вашу сетку по начальному положению BVH
это не так просто, как кажется, потому что у вас есть две конечные точки для каждой кости в BVH. Но для правильного положения сетки этого недостаточно, так как отсутствует вращение вокруг оси кости. Шкала представляет собой простое соотношение между костью BVH и размером ячейки сетки.
Что вам нужно, это построить 4x4 однородных матриц. Вот несколько идей о том, как:
разбирать целиком
MOTION
данныеза каждый кадр
Вычислите матрицы преобразования костей и примените их к вашей сетке (вместе с матрицами начальной позиции).
Я настоятельно рекомендую разобрать / воспроизвести BVH без сетки, используя только линии. И переходите на следующий уровень, только если он работает правильно. Потому что в зависимости от используемых порядков умножения матриц и систем координат у вас может быть искаженный вывод. Который дал бы вам трудное время для отладки материала на вершине.
Осторожно, повороты должны выполняться в определенном порядке и без смещения!!!
[edit1]
Вот небольшой пример с BVH:
HIERARCHY
ROOT Hips
{
OFFSET 0.00 0.00 0.00
CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
JOINT Chest
{
OFFSET 0.00 5.21 0.00
CHANNELS 3 Zrotation Xrotation Yrotation
JOINT Neck
{
OFFSET 0.00 18.65 0.00
CHANNELS 3 Zrotation Xrotation Yrotation
JOINT Head
{
OFFSET 0.00 5.45 0.00
CHANNELS 3 Zrotation Xrotation Yrotation
End Site
{
OFFSET 0.00 3.87 0.00
}
}
}
JOINT LeftCollar
{
OFFSET 1.12 16.23 1.87
CHANNELS 3 Zrotation Xrotation Yrotation
JOINT LeftUpArm
{
OFFSET 5.54 0.00 0.00
CHANNELS 3 Zrotation Xrotation Yrotation
JOINT LeftLowArm
{
OFFSET 0.00 -11.96 0.00
CHANNELS 3 Zrotation Xrotation Yrotation
JOINT LeftHand
{
OFFSET 0.00 -9.93 0.00
CHANNELS 3 Zrotation Xrotation Yrotation
End Site
{
OFFSET 0.00 -7.00 0.00
}
}
}
}
}
JOINT RightCollar
{
OFFSET -1.12 16.23 1.87
CHANNELS 3 Zrotation Xrotation Yrotation
JOINT RightUpArm
{
OFFSET -6.07 0.00 0.00
CHANNELS 3 Zrotation Xrotation Yrotation
JOINT RightLowArm
{
OFFSET 0.00 -11.82 0.00
CHANNELS 3 Zrotation Xrotation Yrotation
JOINT RightHand
{
OFFSET 0.00 -10.65 0.00
CHANNELS 3 Zrotation Xrotation Yrotation
End Site
{
OFFSET 0.00 -7.00 0.00
}
}
}
}
}
}
JOINT LeftUpLeg
{
OFFSET 3.91 0.00 0.00
CHANNELS 3 Zrotation Xrotation Yrotation
JOINT LeftLowLeg
{
OFFSET 0.00 -18.34 0.00
CHANNELS 3 Zrotation Xrotation Yrotation
JOINT LeftFoot
{
OFFSET 0.00 -17.37 0.00
CHANNELS 3 Zrotation Xrotation Yrotation
End Site
{
OFFSET 0.00 -3.46 0.00
}
}
}
}
JOINT RightUpLeg
{
OFFSET -3.91 0.00 0.00
CHANNELS 3 Zrotation Xrotation Yrotation
JOINT RightLowLeg
{
OFFSET 0.00 -17.63 0.00
CHANNELS 3 Zrotation Xrotation Yrotation
JOINT RightFoot
{
OFFSET 0.00 -17.14 0.00
CHANNELS 3 Zrotation Xrotation Yrotation
End Site
{
OFFSET 0.00 -3.75 0.00
}
}
}
}
}
MOTION
Frames: 2
Frame Time: 0.033333
8.03 35.01 88.36 -3.41 14.78 -164.35 13.09 40.30 -24.60 7.88 43.80 0.00 -3.61 -41.45 5.82 10.08 0.00 10.21 97.95 -23.53 -2.14 -101.86 -80.77 -98.91 0.69 0.03 0.00 -14.04 0.00 -10.50 -85.52 -13.72 -102.93 61.91 -61.18 65.18 -1.57 0.69 0.02 15.00 22.78 -5.92 14.93 49.99 6.60 0.00 -1.14 0.00 -16.58 -10.51 -3.11 15.38 52.66 -21.80 0.00 -23.95 0.00
7.81 35.10 86.47 -3.78 12.94 -166.97 12.64 42.57 -22.34 7.67 43.61 0.00 -4.23 -41.41 4.89 19.10 0.00 4.16 93.12 -9.69 -9.43 132.67 -81.86 136.80 0.70 0.37 0.00 -8.62 0.00 -21.82 -87.31 -27.57 -100.09 56.17 -61.56 58.72 -1.63 0.95 0.03 13.16 15.44 -3.56 7.97 59.29 4.97 0.00 1.64 0.00 -17.18 -10.02 -3.08 13.56 53.38 -18.07 0.00 -25.93 0.00
И вот предварительный просмотр:
слева скелет без применения MOTION
Данные (чистые смещения), как вы можете видеть, не выровнены по оси (но не далеко от нее), кости не находятся в одной плоскости и немного повернуты. Но нужно учитывать, что начальная конфигурация и поза могут быть любыми.
Справа - предварительный просмотр с примененными преобразованиями первого кадра из MOTION
данные.