問題タブ [skeletal-animation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
13427 参照

opengl - OpenGLアニメーション

歩行をアニメートしたい人体の3Dモデルがある場合、これを実現するための最良の方法は何ですか?これが実装されていることを私が見る可能性のある方法は次のとおりです。

  • 脚を異なる位置に配置して複数のモデルを作成し、これらのモデル間を補間します。
  • モデルをopenGLにロードし、どの頂点が脚に対応するかを何らかの方法で把握し、適切な変換を実行します。
  • スケルトンまたはアーマチュアを実装します(これに似ています:blenderアニメーションwiki)。
0 投票する
2 に答える
5876 参照

opengl - OpenGL スケルトン アニメーション

プログラムにアニメーションを追加しようとしています。

Blender で骨格アニメーションを使用して人間のモデルを作成しました。キーフレームをスキップして、モデルの歩行を確認できます。

モデルを XML (Ogre3D) 形式にエクスポートしました。この XML ファイルでは、特定の時間 (t=0.00000、t=0.00040、... など) で各ボーンに割り当てられた回転、移動、スケールを確認できます。 .)

私が行ったことは、どの頂点が各ボーンに割り当てられているかを見つけることです。ここで、ボーンに対して定義された変換をこれらの頂点のそれぞれに適用するだけでよいと仮定しています。これは正しいアプローチですか?

私の OpenGL draw() 関数 (大まかな擬似コード) では:

0 投票する
2 に答える
3296 参照

c++ - OpenGL ES は骨格アニメーションの実行に適していますか?

モバイル プラットフォーム用の 3D プロジェクトを開始する必要があります。まず、主な目的である骨格アニメーションの概要を説明したいと思います。解決策としては、OpenGL ES と C++ を考えていました。質問は次のとおりです。

  1. OpenGL ES はスケルタル アニメーション (スキニング シェーダーを含む) を処理するのに十分な堅牢性を備えていますか?
  2. OpenGL ES はモバイル プラットフォーム全体で広くサポートされていますか?また、最も有名なものは何ですか? (たとえば、iPad はサポートされていますか?)
  3. とにかくこれは可能ですか、つまり、十分な計算能力がありますか?
  4. SIMD 最適化のため、XNA 数学ライブラリを使用する価値はありますか?
  5. これにはC++を使用するのが良いですか? はいの場合、開発とテストにはどのコンパイラを選択する必要がありますか? さらに、モバイル プラットフォームにどのコンパイラが使用されているかわかりません。

お気づきかもしれませんが、私はまだモバイル プラットフォーム用にプログラミングしたことがありません。したがって、いくつかの一般的な推奨事項を歓迎します。

0 投票する
3 に答える
258 参照

oop - これは良い OO 設計ですか?

2D 骨格アニメーションを行うための API を自分で構築しています。

Bone クラスと Skeleton クラスがあります。

Skeleton はルート ボーンを作成し、親ボーンを提供することにより、Skeleton の add メソッドを介して後続のボーンが追加されます。

今やりたいことは、アニメーションとフレームを追加することです。

私が考えていたのは、アニメーションを読み込んで補間できるクラスです。つまり、アニメーションをロードするオブジェクトになります。次に、各フレームでスケルトンを取り込み、それに応じてスケルトンを変更します。

これは良いデザインですか?アニメーションはスケルトンを取り込む必要がありますか、それともスケルトンがアニメーションを取り込んでそれ自体に適用する必要がありますか?

0 投票する
1 に答える
1122 参照

opengl-es - OpenGL ES での骨格アニメーションの頂点の最適化

だから私は 2D スケルトン アニメーション システムで作業しています。

X 個のボーンがあり、各ボーンには少なくとも 1 つの部分 (四角形、2 つの三角形) があります。平均して、骨は 20 個ほど、パーツは 30 個あります。ほとんどのボーンは親に依存しており、ボーンはフレームごとに移動します。アニメーションごとに合計 1000 フレームまであり、約 50 のアニメーションを使用しています。一度に合計約 50,000 フレームがメモリにロードされます。パーツは、スケルトンのインスタンス間で異なります。

私が取った最初のアプローチは、各ボーンの位置/回転を計算し、各パーツに対してこれで構成される頂点配列を構築することでした:

そして、これをフレームごとに glDrawElements に渡します。

これは見栄えがよく、必要なすべてのシナリオをカバーし、メモリをあまり使用しませんが、犬のように機能します。iPod 4 では、これらのスケルトンを 10 個レンダリングすると、おそらく 15 fps を得ることができます。

フレームごとに非常に多くの頂点データをコピーすることで、ほとんどのパフォーマンスが損なわれていることがわかりました。私は別の極端に行くことに決め、アニメーションを「事前計算」し、各キャラクターの開始時に頂点バッファーを構築しました。これには、単一のキャラクターのすべてのフレーム、すべてのパーツの xyuv 座標が含まれていました。次に、特定の時間に使用する必要があるフレームのインデックスを計算し、現在のフレームと次のフレームの XY 位置の間を補間するために使用されるシェーダーに渡されるデルタ値を計算します。

頂点はフレームごとにこのように見えました

頂点シェーダーは次のようになります。

現在、パフォーマンスは素晴らしく、これらの 10 個が画面に表示され、50 fps で快適に使用できます。しかし今では、1 トンのメモリを使用しています。現在は ushort になっている xyuv の精度をいくらか落とすことで、これを最適化しました。

ボーン依存性が失われるという問題もあります。親と子の 2 つのボーンがあり、子のキーフレームが 0 秒と 2 秒で、親のキーフレームが 0 秒、0.5 秒、1.5 秒、2 秒の場合、子は 0.5 秒と 2 秒の間で変更されません。 1.5秒です。

私は、この骨の問題を解決する解決策を思いつきました。つまり、子に親と同じポイントにキーフレームを持たせることです。しかし、これはさらに多くのメモリを使用し、基本的にボーン階層のポイントを殺します。

これが私が今いるところです。パフォーマンスとメモリ使用量のバランスを見つけようとしています。ここには冗長な情報がたくさんあることはわかっています (特定のパーツのすべてのフレームで UV 座標が同一であるため、約 30 回繰り返されます)。また、パーツのセットごとに新しいバッファーを作成する必要があります (一意の XYUV 座標を持ちます。パーツによってサイズが異なるため、位置が変わります)。

現時点では、キャラクターごとに 1 つの頂点配列を設定して、すべてのパーツの xyuv を設定し、各パーツのマトリックスを計算して、シェーダーで再配置してみます。これが機能することはわかっていますが、最初に行っていた各フレームの XYUV をアップロードするよりもパフォーマンスが良くならないのではないかと心配しています。

得たパフォーマンスを失わずにこれを行うより良い方法はありますか?

私が試すことができるワイルドなアイデアはありますか?

0 投票する
3 に答える
4996 参照

three.js - three.js でボーン アニメーション (ブレンダー エクスポート) が正しくアニメーション化されないモデル

現在、three.js で骨格アニメーションのテストに取り組んでいます。ブレンダーでうまくアニメーションする単純なモデルがあります。基本的には、3 つの積み重ねられた曲がった立方体で構成されています。

Blender V2.64 で Blender Export プラグインを使用して Blender ファイルを three.js にエクスポートすると、webGl コンテキストのアニメーションがスキンの重み付けが間違っているかのように異なって表示されます。

WebGL デモ: http://rainbowrangers.de/threejs/animation_test01/

Blender ファイル: http://rainbowrangers.de/threejs/animation_test01/model/animation_test01.blend

three.jsで正しい結果を得るにはどうすればよいですか?

0 投票する
1 に答える
2299 参照

c++ - ASSIMP と GLSL を使用したスケルトン アニメーション: ボーンの均一配列サイズ

私は ASSIMP スケルタルアニメーションローダーとレンダラーに取り組んでおり、現在、すべてのデータが正しく読み込まれ、現在の時間枠で補間されています。ただし、まだ正常に機能していない部分が 1 つあります。それが頂点シェーダー ステージです。

VBOを介してvec4、ボーン ID と各頂点の重み (頂点ごとに最大4 つのボーン/重み)を含む2 つの を渡し、頂点シェーダーには100 個のボーン変換 (フレームごとに事前計算) のマトリックス配列があります) ボーン ID によってインデックス化されます。

ただし、ボーン ユニフォームには適切な変換が含まれていないようです。デバッグの目的で、重みの値とボーン ID の値を使用してモデルに色を付けました。これらには色 (したがって有効な値) が含まれています。ただし、ボーン変換によって頂点を変換し、その結果でモデルに色を付けると、モデル全体が黒くなります。つまり、変換行列はすべて0.0. したがって、それらは適切に初期化されていません。

問題は、マトリックスをユニフォーム配列に渡すこと、またはおそらくユニフォームの最大サイズにあると思います(ユニフォームマトリックスの数を32(現在のモデルのボーンの数)に設定しようとしましたが、効果はありませんでした)?

情報をシェーダーに渡す前に、変換マトリックスは実際に有効なマトリックス (ID/空のマトリックスではない) であるため、障害はおそらく GLSL シェーダーまたはユニフォームの受け渡しにあるはずです。

次のコードは、頂点シェーダーからのものです。

次のコード スニペットは、マトリックス データを GLSL シェーダーに渡します。

また、ボーン配列のすべての均一な位置を取得するコード:

0 投票する
3 に答える
2059 参照

matrix - マトリックスと頂点にウェイトを適用する (ボーンの回転)

低ポリ 3D フィギュアのメッシュ内でスケルトンのボーンを回転させています。頂点シェーダーでは、このように適用されます。
glsl:

bone_matrix[index1]は 1 つのボーンのbone_matrix[index2]マトリックスであり、もう 1 つのボーンのマトリックスです。 これらのボーンへの のメンバーシップをweight指定します。vertex_in問題は、ウェイトが .5 に近づくほど、回転が適用されたときに肘の直径が収縮することです。約 10,000 個の頂点の円柱形状 (重みの勾配あり) でテストしました。結果は、庭のホースを曲げたように見えました。

これらの情報源から重み付け方法を取得しました。それは実際に私が見つけることができる唯一の方法です:
http://www.opengl.org/wiki/Skeletal_Animation
http://ogldev.atspace.co.uk/www/tutorial38/tutorial38.html
http://blenderecia.orgfree.com /blender/skinning_proposal.pdf

initial_ugly_good

左は形状の開始方法、中央は上記の式がどのように回転するか、右は私の目標です。中間点は加重され0.5ます。曲がれば曲がるほど悪化し、180 度では直径がゼロになります。

  • 結果の頂点の代わりに重みを回転に適用できるように、シェーダーでマトリックスを組み立ててみました。右の写真のように完璧に見えますが、頂点ごとに行列を組み立てる必要があります (費用がかかります)。
  • 私はクォータニオンを調べましたが、glsl はそれらをネイティブにサポートしておらず (間違っている場合は訂正してください)、混乱しています。それは私がする必要があることですか?
  • 関節ごとに 3 つのボーンを考え、すべてのボーンの間に「膝頭」を追加しました。これで問題が解決するわけではありませんが、軽減されます。
  • 頂点を回転させた後、軸から元の距離に頂点を投影することを検討しています。これは 180 度で失敗しますが、(比較的) 安価です。

では、オプション、または私が考慮しなかった可能性のある他のオプションを考慮すると、他の人はこのピンチ効果をどのように回避していますか?

編集: 四元数を使用して SLERP を動作させましたが、GLSL がネイティブでサポートしていないため、使用しないことにしました。トムが説明したように、幾何学的な SLERP を機能させることができませんでした。最初の 90 度で NLERP が機能するようになったので、各ジョイント間に余分な「ボーン」を追加しました。前腕を 40 度曲げるには、肘と前腕をそれぞれ 20 度ずつ曲げます。これにより、骨の量が 2 倍になるという犠牲を払って挟み込み効果がなくなりますが、これは理想的な解決策ではありません。

0 投票する
1 に答える
1176 参照

opengl - 子育ての問題を伴うスケルトン アニメーション

tl;dr: モデルをアニメートするとき、各ジョイントは正しく動きますが、親ジョイントに対しては動きません。

ここに画像の説明を入力

Lua でカスタム構築された IQE ローダーとレンダラーを使用して、スケルトン アニメーション システムに取り組んでいます。この時点では、アニメーション時にスケルトンがバラバラに見えることを除いて、ほぼすべてが機能しています。各関節は正しく移動、回転、スケーリングしますが、親の位置を考慮していないため、ひどい問題が発生します。

IQM の仕様とデモを参照しても、何がうまくいかないのか一生わかりません。私の Lua コードは (私が知る限り) リファレンス C++ と同じです。

ベース ジョイント マトリックスの計算:

アニメーション フレーム マトリックスの計算

完全なコードは、詳細な調査のためにここにあります。関連するコードは /libs/iqe.lua にあり、関数 IQE:buffer() および IQE:send_frame() の下部近くにあります。このコードは LOVE ゲーム フレームワークのカスタム バージョンで実行され、Windows バイナリ (およびバッチ ファイル) が含まれています。

最後の注意: 私たちのマトリックス コードは、他の実装といくつかのテストに対して検証されています。