Humanoidアニメーションの表示がGenericと不一致

今回の主な話題:Humanoidアニメーションの表示がGenericと不一致、Resources.UnloadAsset()でロードされた画像をアンロードすると異常になります、コンストラクターのGCが大きすぎます、特定の設備にある白すぎる問題、GPU Skinningに基づく色の変化の拡大を実現する方法。


Animation

Q1:私たちのプロジェクトのキャラクターは腕にいくつかのリボンがあります。一部のリボンはHumanoidに設置された後に、変な回転角度になり、Max及びGenericで表示するアニメーションと異なります。例えば、Maxで腕リボンの垂れアニメーションを設置したら、Humanoidの下にある2つのリボンがX字型の十字として表示されます。

現在確認した内容は以下のとおりです。

1、Avatarにあるボーンを再び正常に設定し、そしてT-Poseであり、腕のリボン以外に、他のボーンのアニメーションは正常です。

2、アニメーションインポート設定のmaskはすでにボーン全体をチェックしました。

3、前には腕Twistボーンが引き起こしたエラーと思いましたが、後でTwistボーンの無い状況のアニメーションをテストした時には依然として異常です。

4、Avatar設置のMuscle Setupで、Upper Arm TwistパラメーターとLower Arm Twistパラメーターを調整すれば問題を少し修正できますが、完全に修復することはできません。そして他の部分のアニメーションにも問題が発生する可能性があります。

5、2つのモードのAnimationファイルを比較すると、対応するフレームのデータに違いがあることがわかります。同じボーンが同じフレームの2つモードのtransform値が異なります。

Humanoidに変更すると、ボーンには空間変換と中間ボーンの挿入値があるため、位置情報が完全に対応していない可能性があります。問題主が1つのDemoをアップロードする方がよりいいと感じます。または、Humanoidがマップするボーンではなくで、追加ボーンにリボンを掛けることを試せますか?これで追加ボーンはGenericに沿って、Humanoidの影響に避けられます。

 

問題主は、AvatarのT-poseにある腕リボンのボーンたちの位置が異常かどうかを確認しましたか?PCでの3D Maxがアンインストールされているため、テストが不便です。RetargetingをするときにUnityのT-poseに問題のあるボーン位置は、3D Maxのデフォルトposeのボーン位置と一致するかどうかを注意ください。

HumanoidタイプのアニメーションがAvatarを選択した後、差分値を格納するように変更されます。これらの値は、アニメーションの毎フレームposeとT-poseの「減算」であり、実行する時に差分値をターゲットモデルに適用されます。同じモデルで、理論上の結果はGenericの結果とまったく同じである必要があります。そうではない場合、アニメーションファイルまたはモデルファイルのあるposeの違いが原因であるはずです。

Demo検証を行うのは不便ですが、問題主に提案をします。同じアニメーションファイルから1つのMeshと1つのアニメーションをエクスポートし、このリソースのセットを検証し、アニメーション効果が正しいかどうかを確認できます。これが可能であれば、私が言ったことを確認できます。

 

現在、1つの解決策があります。

前の質問で述べたように、AvatarのMuscle Settingで、Upper Arm TwistパラメーターとLower Arm Twistパラメーターを調整すると、問題をわずかに修正できます。後で、これらのパラメーターを深く探究したところ、以前のチューニング方法が間違っている可能性があることがわかりました。

HumanoidはTwistボーンのマッピングをサポートしていないと推測するため、これら2つのパラメータを追加して、腕の追加ボーンの移動を実現します。

Lower Arm Twistはデフォルトで0.5の場合、前腕リボンは手首によってある程度回転します。

Lower Arm Twistは0である場合、前腕の回転は肘の影響のみを受け、効果はGenericと同じです。

ボーンのレイヤーは次とおります。


Asset

Q2: Resources.UnloadAsset()を使用してロードされた画像をアンロードしましたが、アンロードが無効であることがわかりました。コードは次のとおりです。

初めてLoadする後に、メモリはこのようになりました。

Resources.UnloadAssetをコールすると、メモリに変化が起こされましたが、まだメモリにあります。

Resources.UnloadUnusedAssets()を最後にコールますまで、メモリから完全にクリアされます。

アンロードされていないように感じます。UnloadAssetの後に、ロードされたSpriteは依然として使用できます。

私の理解では、Resources.UnloadAssetをコールして、1つのSpriteを解放した後、このSpriteを引用したImageもアセットを失うはずです。私の理解が間違いたかどうかはわかりませんが、現在の状況では、UnloadAssetを実行しても、このImageの引用画像がまだ残っています。

貴方の理解は正しいです。貴方のコードはSpriteでのみ動作し、Spriteによってインデックス付けされたTextureではありませんので、UnloadAssetはTextureをアンロードしません。インデックスがない場合、UnloadUnusedAssetsを介してのみアンロードできます。


GC

Q3: プロジェクトにネットにあるJSONをロードし、メモリにOpenCTMを介してUnity Meshを生成します。ただし、OpenCTM形式を逆シリアル化すると、大量のGCが生成されます。位置は下層のコンストラクターにあります。これに対して何か解決策ありませんか?

使用されているプラ​​グインはOpenCTMのC#ライブラリです。この問題は主に、OpenCTMデータ分析中にインスタンス化されるOutWindowクラスが多すぎるために発生します。これにより、大量のガベージが生成され、GCがトリガーされ、データの解析時間は特別に長くなります。

最適化方法は、OutWindowインスタンスをキャッシュすることです。


Render

Q4: 特定の設備の画面が白くすぎる問題を解決するにはどうすればよいですか?

以前もこのような問題にあることがありました。特定の設備(例えばiPhone Xなど)で画面が白くすぎで、見ると黒い点を生成するところの計算にエラーがあるようです。

テスト状況:プログラマーがコードを確認すると、DOF階段に問題が起こし、Bloomが問題を拡大したことを推測しました。コードを変更したけど問題が解決しませんでした。当時に、問題のあるところがFresnel効果に引き起こされ、pow(1-NdotV,exp)の計算に、1-NdotVは0である時にトリガーさあれ、Max(1-NdotV, 1e-4)に変更します(1e-4は10の-4乗、つまり0.0001です)。


Render

Q5: GPU Skinningに基づいて色変更機能を拡張したいと思います。つまり、下図のように、チームごとに色が異なります。

私が現在使用している方法:Shaderを自分で変更しました。非実行状態でのパフォーマンスは問題ありませんが、起動して実行すると、すべてのインスタンスが同じになります。

Shared Materialを自分がnewするMaterialに変更してもダメです。その後、1つの新しいShaderを作成しました。実行する後、Shaderのパラメーターはまた強制的に統一されます。つまり、表現は同じようになります。そして、2枚のTextureを作成して違うShaderを指定しても、起動すると同じままでした。Shaderが同じなら、何を取り替えや変更しても、実行すると同じ1つものに取り替えると感じます。

私の考えが間違っているかどうか、またはその過程で何かに気づいたなかったものがあるかどうか、教えてください。感謝します!

HSVは、Property介して直接割り当てることはできません。次のようにすることはダメです。

このシステムで使用するマテリアルは最終的にホストされますから、貴方が作成したShaderではありません。

一部のパラメーターをカスタマイズしたい場合、MaterialPropertyBlockを使用する必要があります。GPU SkinningPlayer.csでこのMaterialPropertyBlockを見つけられ、そして自分が望む値を設置したら大丈夫です。次のようです。


UWA公式サイト:https://jp.uwa4d.com

UWA公式ブログ:https://blog.jp.uwa4d.com

UWA公式Q&Aコミュニティ(中国語注意)https://answer.uwa4d.com