Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование графики
Войти
Регистрация
Восстановить пароль
 
Examnes
2 / 2 / 1
Регистрация: 04.11.2017
Сообщений: 49
1

[collada] Как получить bind shape из visual_scene ,а не из контроллера скелета?

03.01.2019, 14:06. Просмотров 446. Ответов 1

Для скелетной анимации нужны 3 вещи: обратная трансформация для каждой кости ,вершина и поза привязки.
С первыми двумя проблем нет: вершина находится в <library_geometries> , а анимация в <library_animations>.
Я писал свой парсер файлов collada, и мне даже удалось читать данные анимации и использовать их. Но как оказалось тот способ, который я использовал работает только, когда все кости в скелете СВЯЗАНЫ с вершинами. Я читал bind pos из контроллера скелета, но как выяснилось после нескольких странных экспериментов, туда попадают только те кости, которые непосредственно влияют на вершины.

Чисто пример:
[collada] Как получить bind shape из visual_scene ,а не из контроллера скелета?

XML
1
2
3
4
5
6
7
8
   <source id="Armature_Cube-skin-joints">
     <Name_array id="Armature_Cube-skin-joints-array" count="4">Bone Bone_001 Bone_003 Bone_005</Name_array>
     <technique_common>
       <accessor source="#Armature_Cube-skin-joints-array" count="4" stride="1">
         <param name="JOINT" type="name"/>
       </accessor>
     </technique_common>
   </source>
Как видно из скриншота костей там 6, но 2 и 4 кости просто соединяют остальные, и для них нет pind pos-ы в контроллере скелета.

Зато в visual_scene эти кости есть:
Кликните здесь для просмотра всего текста
очень много
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
         <node id="Armature" name="Armature" type="NODE">
        <translate sid="location">0 0 -1</translate>
        <rotate sid="rotationZ">0 0 1 0</rotate>
        <rotate sid="rotationY">0 1 0 0</rotate>
        <rotate sid="rotationX">1 0 0 0</rotate>
        <scale sid="scale">1 1 1</scale>
        <node id="Armature_Bone" name="Bone" sid="Bone" type="JOINT">
          <matrix sid="transform">1 0 0 0 0 0 -1 0 0 1 0 0 0 0 0 1</matrix>
          <node id="Armature_Bone_001" name="Bone.001" sid="Bone_001" type="JOINT">
            <matrix sid="transform">1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1</matrix>
            <node id="Armature_Bone_002" name="Bone.002" sid="Bone_002" type="JOINT">
              <matrix sid="transform">1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1</matrix>
              <node id="Armature_Bone_003" name="Bone.003" sid="Bone_003" type="JOINT">
                <matrix sid="transform">1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1</matrix>
                <node id="Armature_Bone_004" name="Bone.004" sid="Bone_004" type="JOINT">
                  <matrix sid="transform">1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1</matrix>
                  <node id="Armature_Bone_005" name="Bone.005" sid="Bone_005" type="JOINT">
                    <matrix sid="transform">1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1</matrix>
                    <extra>
                      <technique profile="blender">
                        <connect sid="connect" type="bool">1</connect>
                        <layer sid="layer" type="string">0</layer>
                        <tip_x sid="tip_x" type="float">0</tip_x>
                        <tip_y sid="tip_y" type="float">0</tip_y>
                        <tip_z sid="tip_z" type="float">1</tip_z>
                      </technique>
                    </extra>
                  </node>
                  <extra>
                    <technique profile="blender">
                      <connect sid="connect" type="bool">1</connect>
                      <layer sid="layer" type="string">0</layer>
                    </technique>
                  </extra>
                </node>
                <extra>
                  <technique profile="blender">
                    <connect sid="connect" type="bool">1</connect>
                    <layer sid="layer" type="string">0</layer>
                  </technique>
                </extra>
              </node>
              <extra>
                <technique profile="blender">
                  <connect sid="connect" type="bool">1</connect>
                  <layer sid="layer" type="string">0</layer>
                </technique>
              </extra>
            </node>
            <extra>
              <technique profile="blender">
                <connect sid="connect" type="bool">1</connect>
                <layer sid="layer" type="string">0</layer>
              </technique>
            </extra>
          </node>
          <extra>
            <technique profile="blender">
              <layer sid="layer" type="string">0</layer>
            </technique>
          </extra>
        </node>
      </node>

Особый интерес, как я думаю тут представляют элементы <matrix> <translate> <scale> и <rotate>
Кто-нибудь знает, можно ли получить из этих матриц и преобразований матрицу привязки кости?

Не уверен поможет ли это :
Кликните здесь для просмотра всего текста

PS:Я делал анимацию так, что в первом кадре кости не меняют положение вершин, по этому (по идее) при перемножении матрицы из первого ключевого кадра и матрицы привязки должна получиться единичная матрица(то есть получившаяся из вон той ерунды выше матрица должна равняться обратной матрице из первого ключевого кадра)
PPS: я посчитал обратную матрицу из анимации она должна быть равна

1 0 0 0
0 0 1 0
0 -1 0 0
0 0 0 1

PPPS:Я пробовал найти обратную матрицу для произведения матриц из visual_scene, и в данном случае это работает, но в других нет, так что видимо надо сделать что то еще.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2019, 14:06
Ответы с готовыми решениями:

Как получить объект из bind
Добрый день Я новичок, и столкнулся с проблемой, есть такой код (function ( $ ) { $.myFunction...

Как получить hWnd Label, Image, Shape?
Кто подскажет ка можно получить hWnd Label, Image, Shape ... ???

Сохранить свой shape как нормальный shape
Создаю свой shape в MS Office Word 2007 Скажите, есть ли возможность сохранить его как shape для...

Как во view получить данные из контроллера в формате Json или javascript-массива?
Здравствуйте! Есть view в которой у меня есть раздел &lt;script&gt;&lt;/script&gt; . Там я создаю таблицу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Examnes
2 / 2 / 1
Регистрация: 04.11.2017
Сообщений: 49
03.01.2019, 19:56  [ТС] 2
Так, я нашел решение. Удивительно, но после 2х дней тягостных раздумий решение пришло только, когда я осмелился написать на форуме о своей проблеме. Видимо частью решения является осознание проблемы и ее разложение.
Короче, чтобы получить bind pose матрицу из visual_scene достаточно умножить translate rotate и scale в виде соответсвующих матриц на transform матрицы в узлах костей в прямом порядке. В моем случае для 3 кости надо умножить

Armature/location * Armature/rotationZ * Armature/rotationY * Armature/rotationX * Armature/scale * Armature_Bone/transform * Armature_Bone_001/transform * Armature_Bone_002/transform

а потом от получившейся матрицы найти обратную.

PS:Скажите, я ничего не упустил, а то я хз: я до этого опытным путем дошел...
0
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru