お世話になります。 MV1SetAttachAnimBlendRateでアニメーションをブレンドした際の結果が ポーズ(フレームの回転率?)でブレンドされるのではなく、 ポリゴンメッシュの頂点座標(もしくはフレームの座標?)で合成されているようなのですがこれは正常な動作でしょうか? それとも、3Dモデルに不具合があると発生する現象でしょうか? 例えば腕を下げた状態から横に上げた状態にブレンドすると、 肩を中心に円を描いた軌道で補完されるのではなく、直線的に補完されるので腕が縮んでしまいます。 言葉で説明しづらいのでサンプルファイルを下記にアップしました。 https://thuploader.orz.hm/miniup/?mode=dl&id=5099 DLパス「lfxqw541」 ポーズが大幅に違うアニメーションをブレンドすると、ポリゴンが歪んでしまうので、 直線的なブレンドではなく、関節の回転を意識したブレンドができると助かるのですが…。 元々MV1SetAttachAnimBlendRateは大幅にポーズが違うものをブレンドする事は想定していないのでしょうか?
> ポーズが大幅に違うアニメーションをブレンドすると、ポリゴンが歪んでしまうので、 > 直線的なブレンドではなく、関節の回転を意識したブレンドができると助かるのですが…。 > 元々MV1SetAttachAnimBlendRateは大幅にポーズが違うものをブレンドする事は想定していないのでしょうか? すみません、一応歪まないようにする処理はあったのですが、その仕様が 『4x4行列の回転要素を正規化( ベクトルの大きさを 1.0 に統一する )する』というものでした × × × 〇 × × × 〇 × × × 〇 △ △ △ 〇 ( ×…拡大・回転要素 △…平行移動要素 〇…3Dモデルの変形では使用されない ) ただ、『行列の回転要素』の部分には拡大要素もあるため、単純に『行列の回転要素を正規化( ベクトルの大きさを 1.0 に統一 )』 してしまうとモデルに拡大値 1.0 以上のボーンやアニメーションがあると、その拡大値が 反映されない描画結果になってしまうので『行列の中の拡大要素が 1.0 以外の場合は正規化しない』ようにしていました SOTAI.mv1 のトップフレーム( BONE )には拡大率 100.0 が設定されているので上記の 『行列の中の拡大要素が 1.0 以外の場合は正規化しない』が適用され、 歪んでしまう直線的なブレンドの状態で描画されるようになっていました ただ、ちょっと頭を捻ったら『正規化した後、拡大率を乗算すれば良い』という事に気付いたので そのように処理を変更したところ『行列の中の拡大要素が 1.0 以外の場合は正規化しない』の処理を撤廃することができました というわけで、アップしていただいたアニメーションブレンドのプログラムで右腕の長さが 伸び縮みしないようになる修正版をアップしましたので、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.zip // Android版 ARM用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM64.zip // Android版 ARM64用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x86.zip // Android版 x86用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x64.zip // Android版 x64用 https://dxlib.xsrv.jp/temp/DxLibiOSTest.zip // iOS版 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
素早い対応ありがとうございます。 アップしてもらった修正バージョンで、ブレンドが歪まないで正常にされているのを確認しました。 (確認したのは「DxLibVCTest.zip」と「DxLibMakeTest.zip」でカスタムビルドしたものです。) > SOTAI.mv1 のトップフレーム( BONE )には拡大率 100.0 が設定されているので上記の > 『行列の中の拡大要素が 1.0 以外の場合は正規化しない』が適用され、 > 歪んでしまう直線的なブレンドの状態で描画されるようになっていました なるほど、モデルのデータの方もちょっと特殊な状態になっていたんですね…。 普段DxLibModelViewerでMV1に変換するときは一通りモーションのチェックはするのですが、 ボーンの拡大要素とかを細かくチェックしたことが無かったので盲点でした…。 モデルはBlender2.8で作成したもので、以下はDXライブラリとは関係ない話になってしまうのですが、 他にもBlender2.8で3Dモデル作ってる人がいて参考になるかもしれないのでメモがてら残しておきます。 さっきちょっとテストして分かったんですが、FBXに書き出す際にスケールを1.00に設定すると、 トップフレームの拡大要素が100.0になるようで、試しにスケール設定を0.01で書き出したら1.0になりました。 (ちなみに0.5にしたら50.0になったので、まんま100倍みたいです。) 今回修正してもらったので、今後はトップフレームの拡大要素が1.0以外でも問題は起こることはないと思いますが、 もし何か他の理由で、トップフレームの拡大要素が1.0のFBXモデルをBlender2.8で書き出したい場合は、 100倍のサイズでモデリングしてFBXエクスポーターでスケールを0.01に設定するしかないようです。