低ポリ 3D フィギュアのメッシュ内でスケルトンのボーンを回転させています。頂点シェーダーでは、このように適用されます。
glsl:
vec4 vert1 = (bone_matrix[index1]*vertex_in)*weight;
vec4 vert2 = (bone_matrix[index2]*vertex_in)*(1-weight);
gl_Position = vert1+vert2;
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
左は形状の開始方法、中央は上記の式がどのように回転するか、右は私の目標です。中間点は加重され0.5
ます。曲がれば曲がるほど悪化し、180 度では直径がゼロになります。
- 結果の頂点の代わりに重みを回転に適用できるように、シェーダーでマトリックスを組み立ててみました。右の写真のように完璧に見えますが、頂点ごとに行列を組み立てる必要があります (費用がかかります)。
- 私はクォータニオンを調べましたが、glsl はそれらをネイティブにサポートしておらず (間違っている場合は訂正してください)、混乱しています。それは私がする必要があることですか?
- 関節ごとに 3 つのボーンを考え、すべてのボーンの間に「膝頭」を追加しました。これで問題が解決するわけではありませんが、軽減されます。
- 頂点を回転させた後、軸から元の距離に頂点を投影することを検討しています。これは 180 度で失敗しますが、(比較的) 安価です。
では、オプション、または私が考慮しなかった可能性のある他のオプションを考慮すると、他の人はこのピンチ効果をどのように回避していますか?
編集: 四元数を使用して SLERP を動作させましたが、GLSL がネイティブでサポートしていないため、使用しないことにしました。トムが説明したように、幾何学的な SLERP を機能させることができませんでした。最初の 90 度で NLERP が機能するようになったので、各ジョイント間に余分な「ボーン」を追加しました。前腕を 40 度曲げるには、肘と前腕をそれぞれ 20 度ずつ曲げます。これにより、骨の量が 2 倍になるという犠牲を払って挟み込み効果がなくなりますが、これは理想的な解決策ではありません。