2013-12-06 3 views
15

Можно ли создать динамическую анимацию, применяя преобразования к костям 3D-модели с помощью three.js? Я попытался перемещать и поворачивать кости SkinnedMesh, но сетка не обновлялась.Динамическая анимация костей в Three.js

 loader = new THREE.JSONLoader(); 
     loader.load('/JS-Projects/Virtual-Jonah/Modelos/initialPose.js',function jsonReady(geometry) 
     { 
      mesh = new THREE.SkinnedMesh(geometry, new THREE.MeshNormalMaterial({skinning : true})); 
      mesh.scale.set(10, 10, 10); 
      mesh.position.z = mesh.position.y = mesh.position.x = 0; 
      mesh.geometry.dynamic = true; 
      scene.add(mesh); 

      var index = 0; 
      for (var i = 0; i < mesh.bones.length; i++) 
      { 
       if (mesh.bones[i].name == "forearm_R") 
       { 
        index = i; 
        break; 
       } 
      } 


      setInterval (function() 
      { 
       mesh.bones[index].useQuaternion = false; 
       mesh.bones[index].position.z += 10;  
       mesh.bones[index].matrixAutoUpdate = true; 
       mesh.bones[index].matrixWorldNeedsUpdate = true; 
       mesh.geometry.verticesNeedUpdate = true; 
       mesh.geometry.normalsNeedUpdate = true; 

       renderer.render(scene, camera); 
      }, 33); 

      renderer.render(scene, camera); 
     }); 

модели я использую была создана с MakeHuman (ночные сборки), экспортируемый в Collada, импортируемый в Blender и экспортируемый в three.js модели JSON. Ссылка на модели заключается в следующем:

https://www.dropbox.com/sh/x1606vnaoghes1y/gG_BcZcEKd/initial

Спасибо!

+0

Я предполагаю, что сетка должна быть обновлена ​​в соответствии с новым положением кости. Метод animation.update() может содержать ответ. В противном случае я нашел метод mesh.updateMorphTargets(), а также Bone.update(), который мог бы помочь ... –

+0

Является ли это специфическим как для трех .js *, так и для Unity? Некоторые из ответов, похоже, указывают на то, что это так. –

ответ

14

Да, вы можете! Вам необходимо установить mesh.skeleton.bones[i], оба mesh.skeleton.bones[i].rotation и mesh.skeleton.bones[i].position. Вращение имеет тип Euler. Позиция имеет тип Vector3. Я действительно проверил это, используя свой код здесь https://github.com/lucasdealmeidasm/three-mm3d (который включает рабочую оболочку с объектами, прикрепленными к кости), и это действительно можно сделать.

Обратите внимание, что ответ Инатено очень не прав, существует много случаев, когда это необходимо. Например, в FPS используется динамическая и нединамическая анимация. Когда персонаж пробегает и держит пистолет, направление, в котором он указывает пистолет, находится в динамическом режиме (можно использовать mesh.skeleton.bones [i] .rotation, где «i» - это индекс для кости, назначенной для руки) в то время как остальная часть анимации, включая ходьбу, производится в редакторе и загружается. В трех случаях можно использовать «THREE.AnimationHandler.update (delta)»; а затем изменить положение и поворот одиночных костей в коде для решения этих проблем.

+0

Спасибо, Лукас, отличный ответ!Я смог заставить его работать сейчас :) –

+0

@ FábioPicchi почему бы не отметить правильный ответ? – ProllyGeek

+1

@ProllyGeek Извините, я не привык делать сообщения. Теперь отмечен как ответ corret =) –

-1

Я знаю, что вы можете экспортировать анимацию, управляемую костью из Blender в формате JSON, для использования в THREE.js, есть несколько руководств по всему миру. Надеюсь, это поможет. Удачи.

+0

это не вопрос –

-4

Если я понимаю, что вы хотите сами создать анимацию внутри кода? Вы должны сделать это, в Unity у вас есть простой редактор анимации, вы никогда не манипулируете костями прямо в коде.

Это длинный, скучный, неэффективный. Для анимации модели используйте анимацию напрямую. Вот результат анимации с некоторыми манипуляциями с костями, но есть анимация.

http://threejs.org/examples/webgl_animation_skinning_morph.html

Вот учебник о создании простой анимации, если вам нужно http://blog.romanliutikov.com/post/60461559240/rigging-and-skeletal-animation-in-three-js

И здесь родственный сообщению о проблемах анимации только в случае Blender exports a three.js animation - bones rotate strangely

Надеется, что это поможет :)

+0

Прошу прощения, я не согласен. Вы правы в большинстве основных случаев, но поскольку вам нужно сделать некоторые продвинутые анимации с обратной кинематикой (чтобы избежать лунной прогулки, полного контакта с ногами), вам необходимо применять динамические правила к костям, таким образом, управлять кодом по крайней мере, часть скелета; даже используя Unity –

Смежные вопросы