↓こちらでも記入したのですが、Japanese Sectionにも書いてとの事だったのでこちらでも投稿させていただきます。
link text
元の投稿より詳しくかいておきます。(情報がもっと整理できたので)
以下の問題が起きている状態です。
問題:
1.DCCツールで法線を直接操作して、法線をロックして、書き出したモーフターゲット付きのFBXをUnrealで読み込み、ウェイトを設定すると、設定と違う法線を向く。
こちらに関して以下のようなテストを行いました。
テスト条件:
1.簡単な四角形で、1頂点だけを動かして、動かす前の法線が、動かしたあとも維持されるようにロックして書き出す。
添付した[2016_morphnormals.fbx.txt]になります。(中身はFBXです)
2.簡単な四角形で、1頂点だけを動かして、動かした1頂点の法線を90度回してロックする。
添付した[2016_morphnormals90_3.fbx.txt]になります。(中身はFBXです)
テスト結果:
1.ASCIIで書き出したFBXを確認
■テスト条件1の方は、法線情報が 0,0,0 になっていました。
■テスト条件2の方は、法線情報が90度傾いたような値になっていました。
このことからおそらく格納された法線情報はターゲットの法線ではなく、移動量と思われる。
2.FBX SDK のサンプル[Import Scene]に通してDumpしてみる
■テスト条件1もテスト条件2もダンプ結果の法線は、頂点から再計算したような結果になっていました。
90度回転させてdumpした結果の方を添付しました。
[Dump_morphnormals90_3.txt]になります。
このことから、FBX SDKに問題があるように思われますので、こちらはAutoDeskに報告した次第です。
3.書き出したFBXをunrealに通して、デバッガで確認。
こちらコードを確認したのですが、法線がまともに取れないためか、こちらどのimport設定をしてもモーフターゲットは頂点から再計算するようです。
最初に割り当てる法線も、モーフ前の元モデルのものが最初割り当てられ、その後に再計算な手順に見えました。
モーフターゲットの法線を適応するために:
1.FBX SDK側の対応。→こちらは前述のとおりAutoDeskに質問を投げました。
2.UE4側のimport設定の対応。
こちらはモーフターゲットの法線をFBXの法線を使う設定が必要になると思われます。
すでに問題は認識済みとの事だったので、なにとぞよろしくお願いいたします。
link text
link text
link text
link text
使われたアンリアルのバージョンをいくつでしょうか?
UE 4.11になります。
後、既に把握はしているとのことでした。
バグということですね、4.9の時FBXのアニメーションがうまく取り込めない問題があったのでそれに関係があるかもですね。
そうですね。なので最初BugReportの方にあげました。
FBXSDK側は最新のものでも、モーフターゲットの法線で同じ問題があるようです。
importした段階でモーフターゲットのタンジェントが、そもそもロックしたかどうかに関わらず頂点位置からの計算結果になってるので、そこからではあるのですが。
なので、UE側でもそもそも取れてない情報なので、再計算しているようです。
こちらエンジンのソースの拡張で対応ができました。
もしAutoDeskとのやり取りでFBX SDKの改善が行われなさそうということであれば、unreal側でも参考にしていただければと思います。
以下の手順で対応を行いました。
エンジンの拡張:
1.FBXのimportSettingに別途MorphTargetのスケルタルメッシュをぶら下げられるように対応。
2.再インポート時のMorphTargetのMorphAnimationを計算する際に、MorphTargetのTangentX,TangentY,TangentZを
別途ぶら下げた スケルタルメッシュの法線で置き換え。(どのメッシュと差し替えるかはMorphTargetと同じ名前の別途ぶら下げたスケルタルメッシュの名前で判定。同一の名前を使うようにルールを決めました)
こうした理由としては、importした時のベースモデルからは正しい法線が取得できるため、回りくどい方法をとりました。
置き換える際は、MorphTargetの頂点と別途ぶらさげたスケルタルメッシュの頂点で比較を行い、【Tangent以外の要素が全く同じだった場合】に置き換えるように対応しました。 (MorphTargetを例えば顔だけにした場合に、頂点の並びが合わなくなるため。MorphTargetとの違いはTangentだけのはずなので、これでつじつまがとれるはず)
手順
1.FBXには通常通り、MorphTarget付きで書き出す。
2.各Morph Targetを単体のモデルとして書き出す。
3.Morph Target付きのものをベースのスケルタルメッシュとして、unrealに登録。
4.各MorphTargetも、別々にスケルタルメッシュとしてunrealに登録
5.FBX Import Settingsの拡張した、スケルタルメッシュ登録用のインターフェースにモーフターゲットと同じ名前のスケルタルメッシュを登録。
6.再インポートを行う。
後は、拡張したエンジンの処理でつじつま合わせが行われます。
諸事情あって、コードと画像が乗せられませんが宜しくお願いいたします。
以上です。宜しくお願いいたします。
すみません。もうひとつ手順が必要でした。
シェーダー内で、タンジェントと従法線が再計算されてしまうので、タンジェントと従法線もモーフさせるようにしないと、ロックした法線とは一致しません。
法線とタンジェントまでのモーフで大丈夫な事が確認できました。
モーフ用の頂点バッファは増えますが、こうしないと直接調整した法線を再現できません。
不具合の報告と修正のご提案ありがとうございます。
このスレッドの詳細を、開発データベースのUE-33456 - Unexpected vertex normal orientation when manipulating some morph targetsに追記いたしました。
こちらの英語スレッドと重ねてのお願いになりますが、修正部分についてはGithubからのプルリクエストをご検討いただければ幸いです。プルリクエストをしていただければ開発チームが修正内容について検討することが可能です。
プルリクエストの際にこのスレッドにご一報いただければ助かります。
よろしくお願いいたします。
了解いたしました。
諸事情あって載せられる状態にないので、現在確認を取っているところです。
UPすることになると思いますが、UPし次第再度スレッドに記載させて頂きます。
ソースを【Morph Target Normal - Work Around(モーフィング時にモーフターゲットの法線が適応されない問題の対処)】というタイトルでプルリクエスト致しました。
最初に報告してから、改善や不具合修正を行ったので、仕様が変わっています。
添付した【説明.txt】が書き込んだ説明になります。
宜しくお願いいたします。
[link text][1]
テキストがまずかったので上げなおします。
link text
PullRequestしたら説明を英語で書いてほしいとのメールを頂きコメントを追加いたしました。
宜しくお願いいたします。
ご連絡ありがとうございます。社内の開発者データベースでの関連する不具合報告にもPull requestの件を追記しました。Pull requestの登録、英語での説明の追加、ありがとうございました。
ViLeDeth
(ViLeDeth)
15
こんにちは、yuu -この問題についても私を助けてくれませんか?あなたが言及したソリューションを利用するためにエディターを拡張したいのですが、4.26のエディターの最新バージョンではあなたの努力を見ることができません。
自分でコードを書き直しますが、どこを見ればいいのかわかりません。自分でそれを行う場所の例やガイドを教えてください。
読んでくれてありがとう。