2013-12-09 2 views
24

Я работаю над небольшой многопользовательской игрой, в которой есть единственная сетчатая игровая сетка, в которой многие игроки используют ее. Some Background: Я пробовал загрузиться через майю и экспорт blender collada. Оба, похоже, ссылаются на некоторые данные анимации, но я не мог заставить их работать. Я пробовал экспортер майя JSON, который выплюнул крошечные файлы 1k только с материальной линией. Наконец, работал экспортер блендера JSON. Для тех, кто также пытается загрузить кожуру сеток, я нашел, что это очень полезно: Model with bones animation (blender export) animating incorrectly in three.jsThree.js - экземпляры скелетных ячеек скелетной сетки, анимации и смешивания

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

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

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

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

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

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

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

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

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

    Возможно ли это с помощью экранированных сеток (не морфовых целей)? Есть ли примеры или документы об этом?

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

Я мог бы счастливо реализовать и , но я хотел бы некоторые информационные/описательные документы о threejs Skinning и рамке анимации, чтобы меня начали. Например, 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/

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

  1. Используйте много THREE.SkinnedMesh и все еще не уверены в THREE.AnimationHandler.
  2. Не знаю. Возможно, есть способ изменить начальные/конечные ключевые кадры вручную в THREE.Animation.
  3. Не реализовано AFAIK. Я мог бы попробовать создать пользовательский шейдер, который может принимать два THREE.Animation s и интерполировать между ними.
+0

Кто-нибудь есть какие-либо рекомендации для кого-то, кто должен экспортировать сцены из MAYA 2013, нет никаких других вариантов. Помимо импорта его в разные программы –

+0

@RyanBlevins Я использую collada для моего уровня mesh + lights и т. Д. Это просто скелетная анимация, которую я не мог получить. Загрузчик collada дает вам объект с '.scene'. Вы можете добавить все это или выбрать и выбрать из своих детей. – jozxyqk

+0

Он должен иметь скелетную анимацию с кожей. –

ответ

12

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

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

Basic Character Controller (with time warped speed blend)

Time Warped Speed Blend

+0

Не просматривая пример смешивания анимации в стиле webgl в любом месте сайта, а также экспортируя модель блендера с несколькими анимациями и загружая ее с помощью трех вершин 66, выдает сообщение об ошибке «Uncaught TypeError: Can not read property» name «undefined» любых идей? – Xealgo

+1

Правильно, он находится на текущей ветке «dev» и еще не дошел до версии. https://github.com/mrdoob/three.js/tree/dev – insominx

+0

А, ок! Я должен был осознать это: p Спасибо. – Xealgo

0

Я смог одновременно развернуть четыре различные анимированные модели, созданные с помощью 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's really helpful tutorial

«Modelx_Animation_title» переменная является имя заголовка анимации определено в Blender и копируется в экспортируемый файл JSON в модели с помощью трех. js Блендер экспортер.

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

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

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

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

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

0

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

Вот ссылка: https://github.com/mrdoob/three.js/tree/dev/utils/exporters/maya

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