画像から 3D の模型を起こす Pixal3D で、検証用に用意した人物を作り、リアルタイムで動かせる軽さ(12,000 三角形)まで減らせるかを技術検証しました。骨を付けて動きを付けるところまではできましたが、見た目は粗いままで、成功とは言いがたい出来でした。

この記事は、その途中で、減らした人物から細部が消えた所の話です。Pixal3D の出来は良いのに、減らした後の人物はごつごつして、変に見えました。

結論

  • ごつごつの元は色ではなく形でした。中を詰めるための升(中空の殻の中を塗りつぶすのに使う3次元の格子)が 14mm だと、数 mm の彫り(目・鼻・口)、髪の房の切れ目、襟・ポケットの縁が消え、元の面に吸い付けたときに面がでこぼこになりました。升を 7mm にすると、色を抜いた絵で 14mm の形と見比べたときには、だいぶ戻りました。
  • ただ、表示を想定した材質で並べると、12,000 三角形まで減らした形では、升を 14mm・7mm・3mm と変えても目・口の彫りと襟・ポケットの縁が消えていました。減らすこと自体で消えています。
  • 元の 93 万面の凹凸を法線マップに焼いて貼ると、色を抜いて並べた絵では細部が戻りましたが、表示を想定した材質は法線マップを使わないので、そこでは効きません。その材質向けに元の形の陰(AO)を色に焼いて掛けると、目・口・襟・ポケット・髪の房は読めるようになりました。ただ、陰を焼いた後も、人物の仕上がりは粗いままでした。

試した環境

  • 模型:Pixal3D で4方向の絵から起こした人物、93 万面。厚さ 5mm ほどの中空の殻なので、升で中を塗りつぶしてから作り直して減らす
  • Blender 4.5:作り直す・減らす・焼くをスクリプトで
  • Unity 6:法線マップの取り込みと、表示を想定した材質での見比べ
  • 目標:12,000 三角形、色の絵 1024

色を付けた絵では、形の崩れが分かりにくかった

升 14mm で減らし、色を付けた人物。形がごつごつしている

色を付けた絵では、元の絵から貼った色が目と口を描き戻していて、形が崩れているかどうかが分かりにくい状態でした。色を抜いて Pixal3D の模型と並べると、崩れていたのは形でした。

原因は、中を詰めるための升の大きさでした。Pixal3D の人物は中空の殻なので、升に印を付けて外から塗りつぶし、中身を作ってから作り直していました。その升を前に別の人物で通った 14mm にしていたため、数 mm の彫り(目・鼻・口)、髪の房の切れ目、襟・ポケットの縁が消え、元の面に吸い付けたときに面がでこぼこになっていました。

升の細かさを比べた

升を 14mm・7mm・5mm で比べました。

升作り直しの途中の面整える時間結果
14mm103 万16 秒細部が消えてごつごつ
7mm459 万73 秒だいぶ戻る
5mm1018 万164 秒目・手・靴に穴

升 14mm は 16 秒、7mm は 73 秒、5mm は 164 秒

5mm は殻の厚さに近く、目・手・靴に穴が開きました。さらに細かい 3mm でも作り直しましたが、殻の外と中の空洞が1つの塊につながっていて外の面だけを分けられず、12,000 三角形まで減らした形は 7mm と変わりませんでした。升を使わずに、内側の殻の面を消して直に減らすやり方も試しましたが、境界の辺が 3.3 万本残り、減らすと尖った破片になりました。

ここでは 7mm にしました。7mm で減らすと小さなかけらが残って骨の自動ウェイトが失敗したので、一番大きい塊だけを残しました。

法線マップに焼いて貼る

7mm の形に加えて、元の 93 万面の凹凸を法線マップ(光の当たり方を描いた絵、1024)に焼き、12,000 三角形の面に貼りました。

色を抜いて並べた3体。左が元の 93 万面、中が升 7mm で減らした形、右がそれに法線マップを貼った物

色を抜いて並べた物で、左が元の 93 万面、中が 7mm で減らした形、右がそれに法線マップを貼った物です。Unity 6 では、焼いた絵を法線マップとして取り込みました。取り込んだ人物は 11,970 三角形・骨 25 本で、色と法線マップの2枚の絵(どちらも 1024)が付きました。法線マップの焼き込みを足して、整える段の時間は、升 14mm のときの 16 秒から 75 秒に延びました。

表示を想定した材質では、減らした形の細部は戻らなかった

その後、段ごとに分けて、Unity で同じカメラ・同じ材質に並べ直しました。元の Pixal3D の模型と、升を変えて減らした模型を、表示を想定した材質で「色あり」「色なし」「強い光で色なし」の3通りに撮りました。

表示を想定した材質は、明暗を 70〜100% の間でしか付けず、法線マップも使いません。この並びで見ると、12,000 三角形まで減らした形では、目・口の彫りと襟・ポケットの縁が消えていました。升を 14mm・7mm・3mm と変えても同じで、3mm で減らした形は 7mm と変わりませんでした。升の細かさではなく、減らすこと自体で消えていました。法線マップを使わない材質なので、法線マップで足した細部もここでは効きません。

なめらかな人形の胸像に、くぼみに沿って影がのる様子

元の形の陰(AO)を色に焼く

形で残せない細部を、色で戻しました。

  1. 元の 93 万面から陰(AO)を、12,000 三角形の UV に焼く。陰を取る距離は人物の高さの 1.3%、標本は 64。焼くのは 5 秒で済んだ
  2. 焼いた陰を、色の絵に強さ 0.8 で掛ける

表示を想定した材質で拡大して比べた顔と胸元。陰を焼いた色で目・口・襟が読める

陰だけを色にした状態でも、表示を想定した材質で、目・口・襟・ポケット・髪の房は読めるようになりました。ただ、読めるようになっただけで、仕上がりとしては粗いままでした。

確かめていないこと

  • 法線マップを足したときの、実機での負荷(テクスチャが1枚増える)は確かめていません。
  • 髪の長い人物やスカートの人物で、升 7mm で足りるかは確かめていません。
  • 色に焼いた陰が動きと合わなくなる所(腕を下ろすと脇の陰が残る)が、想定した表示で目立つかは確かめていません。

おわりに

減らした人物がごつごつして見えたら、色を抜いて元の模型と並べ、どの段で細部が消えたかを切り分けると、直す所がはっきりしました。12,000 三角形に収まらない細部は、使う材質に合わせて法線マップか色に焼いた陰で足すと読めるようにはなりましたが、人物の仕上がりは粗いままでした。

※ Pixal3D・Blender・Unity の振る舞いは執筆時点で試した物で、いまは変わっている可能性があります。