私は、単一のスキンプレーヤーメッシュとそれを使用する多くのプレーヤーを持つ小さなマルチプレーヤーゲームに取り組んでいます。 いくつかの背景:mayaとblendercolladaのエクスポートを介してロードしてみました。どちらも何らかのアニメーションデータを参照しているようですが、機能させることができませんでした。私はmayaJSONエクスポーターを試しました。これは、マテリアル行のみで小さな1kファイルを吐き出します。最後に、BlenderJSONエクスポーターが機能しました。スキンメッシュをロードしようとしている人にとっても、これは非常に役立つことがわかりました: three.jsで正しくアニメーション化されていないボーンアニメーション(ブレンダーエクスポート)を使用したモデル
これで、JSONローダーからのgeometry
オブジェクトとmaterials
配列ができました。
マテリアルに_skinning=true
_を設定し、_THREE.SkinnedMesh
_を作成し、シーンに追加し、_THREE.AnimationHandler.add
_を介してアニメーションを追加できます(AnimationHandler
が実際に行うこと)、_THREE.Animation
_を作成し、play()
およびupdate(dt)
を呼び出します。最後に、単一のメッシュとアニメーションをシーンで再生しています。
今私が欲しいのはこれらです...
多くのインスタンス-シーン内で複数のプレーヤーモデルを実行したい。
同じモデルに対して多くの_THREE.SkinnedMesh
_と_THREE.Animation
_を作成する必要がありますか? _THREE.AnimationHandler
_はどこから来ますか?
多くのアニメーション-アイドル/実行サイクルを個別に再生できるようにしたい。
AFAIKには、アニメーションキーフレームのタイムラインは1つしかありません。 Three.jsはこれをどのように分割しますか、それとも手動で行う必要がありますか?
アニメーションブレンディング-キャラクターが実行を停止し、アイドル状態のアニメーションで静止している場合、一方から他方への瞬間的なスナップは必要ありません。実行アニメーションを一時停止し、その状態をアイドルアニメーションにブレンドして戻したいと思います。
これは現在、スキンメッシュ(モーフターゲットではない)で可能ですか?これに関する例やドキュメントはありますか?
正しい方向に少しだけでも、どんな情報でも大歓迎です。 完全なチュートリアルを終えていません、これらの機能に関するより高いレベルの情報が必要です。
2と3をうまく実装できましたが、threejsスキニングとアニメーションフレームワークに関する情報/説明ドキュメントが欲しいです。始めましょう。たとえば、 this はあまり先に進みません。
[[〜#〜]編集[〜#〜]]
ありがとう、@ 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
_で開始/終了キーフレームを手動で変更する方法があります。THREE.Animation
_を取り、それらの間を補間できるカスタムシェーダーを作成してみてください。リリース67(2014年4月)の時点で、スケルタルアニメーションブレンディングと複数のアニメーションの両方がサポートされています。モデルごとにSkinnedMesh
を作成する必要があります。 AnimationHandler
は、フレームごとにアニメーションを更新(ティック)する役割を果たします。したがって、各Animation
で手動ではなく、その上でupdateを呼び出す必要があります。
新しく追加された例を参照してください:webgl_animation_skinning_blending.htmlまたはここで私自身のいくつかをチェックしてください:
JSONローダーで個別に調整された関数を使用してモデルごとに個別のスキンメッシュを作成することで、Blenderで作成されJSONファイルとしてエクスポートされた4つの異なるアニメーションモデルを同時にデプロイすることができました。私の4つのモデルはそれぞれ、メッシュ、アニメーション、テクスチャ、キーフレームの数が異なります。
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内で定義され、Three.jsBlenderエクスポーターによってモデルのエクスポートされたJSONファイルにコピーされたアニメーションタイトル名です。
特定のモデルの複数のコピーをロードすると、最初は同期でアニメーション化されます。ただし、再生を再開する前に、各モデルをランダムな短い時間だけ個別に一時停止することで、アニメーションを同期から外すことができました。個々のモデルのアニメーションは、一時停止したフレームから再開されます。
animations[ i ].pause();
... (random delay) ...
animations[ i ].play();
おそらく、このアプローチは、質問1、そしておそらく質問2に対するある種の解決策を提供します。
質問2に関して、Three.jsリリースr62は、「複数のアクションをエクスポート」できるようにBlenderエクスポーターを更新しました。私は試していませんが、おそらくこれにより、さまざまなアクションのアニメーションタイトルを指定しながら、特定のモデルの2つ以上のコピーをロードできる可能性があります。その後、さまざまなアクションが必要な場合に、モデルをビューの内外で入れ替えることができる場合があります。
それが機能する場合、質問3の可能な解決策は、モデルをアクティブ状態からアイドル状態にブレンドする追加のアニメーションアクションをBlender内に作成することです。
@Xealgo:ボーンとアニメーションも行うMayaの新しいエクスポーターがあります。数ヶ月前、Blenderワークフローを使わざるを得なくなる前に、それが欲しいです。 :)
リンクは次のとおりです: https://github.com/mrdoob/three.js/tree/dev/utils/exporters/maya