Динамическая анимация костей в Three.js
Можно ли создать динамическую анимацию, применив преобразования к костям 3D-модели, используя three.js? Я попытался перемещать и вращать кости SkinnedMesh, но сетка не обновлялась.
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 и экспортированной в модель jsON. Ссылка на модель выглядит следующим образом:
https://www.dropbox.com/sh/x1606vnaoghes1y/gG_BcZcEKd/initial
Спасибо!
Ответы
Ответ 1
Да, вы можете!
Вам нужно установить 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)"; а затем изменить положение и поворот отдельных костей в коде, чтобы решить эти проблемы.
Ответ 2
Я знаю, что вы можете экспортировать анимацию, управляемую костями, из Blender в формате JSON, для использования в THREE.js, есть несколько руководств по всему миру. Надеюсь, это поможет. Удачи.
Ответ 3
Если я понимаю, вы хотите сами создать анимацию внутри кода?
Вы, как предполагается, должны это делать, в Unity у вас есть простой редактор анимации, вы никогда не манипулируете костями непосредственно в коде.
Это долгий, скучный, неэффективный. Для анимации модели используйте анимацию напрямую.
Здесь результат анимации с некоторыми манипуляциями с костями, но есть анимация.
http://threejs.org/examples/webgl_animation_skinning_morph.html
Вот учебник по созданию простой анимации, если вам нужно http://blog.romanliutikov.com/post/60461559240/rigging-and-skeletal-animation-in-three-js
И вот связанный пост о проблемах с анимацией на всякий случай
Блендер экспортирует анимацию three.js - кости вращаются странно
Надеюсь, это поможет вам:)