Text3D Plugin で一部の文字メッシュが正しく生成されない件について

This question was created in reference to: [Text3D Plugin [Content removed]

<br/>

お世話になっております。

<br/>

参照元のスレッドの件ですが、未解決のままクローズされてしまっており書き込めなくなってしまっておりました。

再開方法がわからなかったため、新規に書き込みをさせて頂いております。

<br/>

https://issues.unrealengine.com/issue/UE-383019

も未だ確認ができないのですが、現状の状況をお伺いできますでしょうか?

<br/>

問題が発生した文字に対して、以前報告させて頂いた方法を用いながら文字ごとに回避を行っていたのですが、

> 頂点をマージしているような処理ではありますが、処理を通り過ぎると輪郭が丸ごと消失してしまう挙動を確認しています。

> ※FixParityAndDivide(Child, !bInClockwise); をコールするだけにすると、添付画像のように改善が見られます

にて回避をしても一部分だけ FrontMesh が生成されず、ExtrudeMesh も反転している状態のメッシュが作成されてしまうようなケースが出てきてしまっており、

問題を解決できない文字がある、という状況となります。

<br/>

部分的に修正されたコードでも構いませんので、ご共有頂けると助かります。

<br/>

宜しくお願い致します。

[Attachment Removed]

お世話になっております。

前スレッドがクローズされた状態となっており、ご不便をおかけしました。こちらの新規スレッドで引き続き対応させていただきます。

UE-383019の現状ですが、社内トラッカーには登録済みです。ただ、現時点では担当者のアサインと修正バージョンの決定には至っておらず、エンジン側での修正コードは部分的なものも含めてまだ存在していません。そのため、恐れ入りますが現段階で共有できるコードがない状況です。

チケットには、御社の調査で判明した3つの問題(囗系の包含判定、日のInsertでの親子付け替え、会の自己交差分割)と修正の方向性を詳しく記載しており、担当チームが着手する際にそのまま使える形にしています。

状態は確認できない件は、公開Issueとしての反映がまだ完了していないためです。公開申請を行いましたので、反映されましたらissues.unrealengine.comでご確認いただけるようになります。それまでは本スレッドで状況をお伝えします。

FixParityAndDivide(Child, !bInClockwise);のみをコールする回避策についてですが、この変更は自己交差する輪郭の分割処理をスキップするため、実際に自己交差している輪郭がそのまま三角形分割に渡ります。その結果、向きやパリティの判定が崩れ、FrontMeshが部分的に生成されない、ExtrudeMeshが反転する、といった今回の症状につながっていると考えられます。会などの文字は改善する一方で、分割が本当に必要な文字では別の崩れが出るトレードオフになっているとみています。

お手数ですが、よろしくお願いします。

[Attachment Removed]

お世話になっております。

状況の方、承知致しました。

共有ありがとうございます。​

​> FixParityAndDivide(Child, !bInClockwise);のみをコールする回避策

FindJunction true 時の輪郭の分割周りを引き続き調査をしていましたが、輪郭を分割した後 RemoveUnneededNodes 内の

		if (Child->bClockwise == Node->bClockwise)
		{
			Children.RemoveAt(ChildIndex);
		}

にて分割した輪郭部分を丸ごと削除してしまっていることが確認できています。

そこで、該当の文字のみ ​​DetachFinishedContour 内で

	for (int32 ID = JunctionIndexInContour; ID < DividedContourIDs.Num(); ID++)
	{
		FinishedContour->AppendVertex(InitialVertices[DividedContourIDs[ID]]);
	}
 	// 反転
	if (FinishedContour->IsClockwise() == true)
	{
		FinishedContour->Reverse();
	}

あらかじめ​反転させるようにすることで輪郭が欠落することを回避できはしたのですが、この辺りの処理も怪しいようではあります。

引き続き、宜しくお願い致します。​

[Attachment Removed]

お世話になっております。

詳細な調査結果のご共有、ありがとうございます。

RemoveUnneededNodesでの削除の件、こちらでも//UE5/Release-5.8のソースを確認し、ご指摘の挙動を確認しました。RootForDetachingはNode.bClockwise、つまり親の向きで生成されて、RemoveUnneededNodesは親と同じ向きの子ノードを削除する実装になっています。分割後の輪郭の向きがグラフ走査の結果に依存するため、本来残すべきループが削除対象になり得る構造です。

あわせて、関連する箇所として、MergeRootForDetachingで親に戻された分割済みノードはbCanHaveIntersectionsがfalseであるため、その後FixParityAndDivideを通る際に向きの正規化処理がスキップされます。分割後の輪郭の向きが一度も揃えられないまま三角形分割に渡ることになり、FrontMeshの欠落やExtrudeMeshの反転につながる可能性があると考えています。

DetachFinishedContourでの事前反転による回避策についてですが、この方法はNode.bClockwiseがtrueとなる階層でのみ有効で、輪郭の入れ子が深く親の向きが反転している階層では、逆にすべての分割輪郭が削除対象になる可能性があるかと思います。。文字ごとに効果が異なる場合は、この点が影響しているかもしれません。

いただいた内容を担当チームへ共有します。よろしくお願いします。

[Attachment Removed]