Подтвердить что ты не робот

Three.js - экземпляры скелетной сетки с кожей, анимации и смешивания

Я работаю над небольшой многопользовательской игрой, в которой есть единственная скин-сетчатая сетка, в которой многие игроки используют ее. Некоторые сведения: я пробовал загружать через майа и экспорт blender collada. Оба, похоже, ссылаются на некоторые данные анимации, но я не мог заставить их работать. Я пробовал экспортер майя JSON, который выплюнул крошечные файлы 1k только с материальной линией. Наконец, работал экспортер блендера JSON. Для тех, кто пытается загрузить скелетные сетки, я нашел это очень полезным: Модель с анимацией костей (экспорт блендера), анимированная неправильно в three.js

Итак, теперь у меня есть объект geometry и массив materials от загрузчика JSON.

Я могу установить skinning=true на материалы, создать THREE.SkinnedMesh, добавить его в сцену, добавить анимацию через THREE.AnimationHandler.add (Я не совсем понимаю, что на самом деле AnimationHandler), создайте THREE.Animation, вызовите play() и update(dt). Наконец, у меня есть одна сетка и анимация, играющая в моей сцене.

Теперь я хочу, чтобы эти...

  • Много экземпляров. Я хочу, чтобы в моей сцене работало более одной модели проигрывателя.

    • Я не хочу, чтобы одни и те же данные сетки и анимации загружались много раз.
    • Время анимации должно быть для каждого экземпляра (поэтому они не все ожидают синхронно).

    Должен ли я создавать много THREE.SkinnedMesh и THREE.Animation для одной и той же модели? Где находится THREE.AnimationHandler?

  • Многие анимации. Я хочу, чтобы режимы бездействия/запуска могли воспроизводиться индивидуально.

    AFAIK существует только одна временная шкала ключевых кадров анимации. Как это делает Three.js для меня, или мне нужно сделать это вручную?

  • Анимационное смешение. Когда персонаж перестает работать и стоит на месте с бездельной анимацией, я не хочу, чтобы мгновенная привязка от одного к другому. Я хотел бы приостановить анимацию запуска и смешать это состояние обратно в простую анимацию.

    Возможно ли это в случае с сетчатыми сетками (не морфовыми мишенями)? Есть ли примеры или документы об этом?

Любая информация была бы весьма признательна, даже просто подталкивание в правильном направлении. Я не после полного учебника, я бы хотел получить информацию более высокого уровня об этих функциях.

Я мог бы с радостью реализовать 2 и 3, но мне хотелось бы получить некоторые информационные/описательные документы о трехмерной оболочке и анимации, чтобы начать работу. Например, this не так много.

[EDIT]
Спасибо, @NishchitDhanani, эта страница неплоха, но не упоминает несколько анимаций или смешивания скелетных анимаций: http://chimera.labs.oreilly.com/books/1234000000802/ch05.html#animating_characters_with_skinning

Эта страница говорит о том, что несколько анимаций по-прежнему остаются актуальными, но не намного (обсуждаются немного в комментариях): http://devmatrix.wordpress.com/2013/02/27/creating-skeletal-animation-in-blender-and-exporting-it-to-three-js/

Текущие ответы...

  • Используйте много THREE.SkinnedMesh и все еще не уверены в THREE.AnimationHandler.
  • Не знаю. Возможно, есть способ изменить ключевые кадры запуска/завершения вручную в THREE.Animation.
  • Не реализовано AFAIK. Я могу попробовать создать пользовательский шейдер, который может принимать два THREE.Animation и интерполировать между ними.
4b9b3361

Ответ 1

Начиная с версии 67 (апрель 2014 года) поддерживаются как скелетные анимации, так и множественные анимации. Вам все равно нужно создать SkinnedMesh для каждой модели. AnimationHandler отвечает за обновление (тикание) анимаций в каждом кадре, поэтому вы должны называть это обновление, а не вручную, на каждом Animation.

См. недавно добавленный пример: webgl_animation_skinning_blending.html или ознакомьтесь с несколькими моими здесь:

Базовый контроллер символов (с измененной скоростью)

Time Warped Speed ​​Blend

Ответ 2

Мне удалось одновременно развернуть четыре различные анимированные модели, созданные с помощью Blender, и экспортировать их как файлы JSON, создав отдельные экранированные сетки для каждой модели, используя индивидуально индивидуальные функции с загрузчиком JSON. Каждая из четырех моделей имеет разные сетки, анимации, текстуры и количество ключевых кадров.

var loader = new THREE.JSONLoader(); 
loader.load("model_1.js", createSkinnedMeshforModel_1);
loader.load("model_2.js", createSkinnedMeshforModel_2);
loader.load("model_3.js", createSkinnedMeshforModel_3);

...

var animations = [];

function createSkinnedMeshforModel_1( geometry, materials )
{
  var myModel1, animation;
  THREE.AnimationHandler.add( geometry.animation );
  myModel1 = new THREE.SkinnedMesh(geometry, new THREE.MeshFaceMaterial(materials));
  enableSkinning( myModel1 );
  scene.add( myModel1 );
  animation = new THREE.Animation(myModel1, Model1_Animation_title, THREE.AnimationHandler.CATMULLROM);
  animations.push( animation );
  for( var i = 0; i < animations.length; i ++ )
  {
    animations[ i ].play();
  }
}


function createSkinnedMeshforModel_2( geometry, materials )
{
  var myModel2, animation;
  THREE.AnimationHandler.add( geometry.animation );
  myModel2 = new THREE.SkinnedMesh(geometry, new THREE.MeshFaceMaterial(materials));
  enableSkinning( myModel2 );
  scene.add( myModel2 );
  animation = new THREE.Animation(myModel2, Model2_Animation_title, THREE.AnimationHandler.CATMULLROM);
  animations.push( animation );
  for( var i = 0; i < animations.length; i ++ )
  {
    animations[ i ].play();
  }
}

function createSkinnedMeshforModel_3( geometry, materials )
{
  var myModel3, animation;
  THREE.AnimationHandler.add( geometry.animation );
  myModel3 = new THREE.SkinnedMesh(geometry, new THREE.MeshFaceMaterial(materials));
  enableSkinning( myModel3 );
  scene.add( myModel3 );
  animation = new THREE.Animation(myModel3, Model3_Animation_title, THREE.AnimationHandler.CATMULLROM);
  animations.push( animation );
  for( var i = 0; i < animations.length; i ++ )
  {
    animations[ i ].play();
  }
}

Функция enableSkinning() такая же, как в DEVMATRIX действительно полезный учебник

Переменная "Modelx_Animation_title" - это название названия анимации, определенное в Blender, и копируется в экспортированный модель JSON файла экспортером Three.js Blender.

Когда я загружаю несколько копий данной модели, они изначально оживают в Sync. Однако мне удалось заставить их отключиться от синхронизации, индивидуально приостанавливая каждую модель для короткой случайной продолжительности, прежде чем снова начать играть. Анимация для каждой отдельной модели возобновляется из кадра, на котором они были приостановлены.

animations[ i ].pause();
... (random delay) ...
animations[ i ].play();

Возможно, этот подход дает решение рода к вопросу 1 и, возможно, к вопросу 2.

Что касается Вопроса 2, выпуск Three.js r62 обновил экспортер Blender, чтобы разрешить "Экспортировать несколько действий". Хотя я не пробовал, возможно, это может позволить загрузить две или более копии данной модели, указав названия анимации для разных действий. Затем можно было бы поменять местами модели в и из вида, когда требуются различные действия.

Если это работает, то возможным решением вопроса 3 может быть создание дополнительного анимированного действия в Blender, которое смешивает модель с активным состоянием в этом состоянии бездействия.

Ответ 3

@Xealgo: Там есть новый экспортер для Maya, который также делает кости и анимации. Я бы хотел, чтобы это было несколько месяцев назад, прежде чем я был вынужден пойти с рабочим процессом Blender.:)

Здесь ссылка: https://github.com/mrdoob/three.js/tree/dev/utils/exporters/maya