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

この記事は、その途中の色を付ける段で詰まった話です。Pixal3D が付けた色をそのまま焼くと、seed ごとに別の所が崩れ、seed を選び直すだけでは揃いませんでした。

結論

  • Pixal3D の色は、seed ごとに崩れる所が変わりました(42:シャツに桃色の四角いしみ、7:灰色のしみと顔の点々、123:目の周りの灰色の影)。
  • Pixal3D に渡した4方向の絵を、被写体の高さと左右の真ん中で模型に合わせて投影し、面の向きで混ぜると、正面と横は元の絵どおりになりました。模型と絵の幅のずれは 0〜2% でした。
  • 投影では、目が二重に見える・縁に背景の白が載る・絵から見えない面に手前の物の色が載る・こめかみの筋・目のまわりの灰色の輪、が出ました。頭と斜めの面・上向きの面は Pixal3D の色、胴は投影、と分けると、こめかみの筋と目のまわりの灰色の輪は消えました。直せたのはこうした一つずつの崩れまでで、色を付けた人物全体の見た目は粗いままでした。
  • 焼く前に UV の余白を 0.015 から 0.004 に詰め、顔の島を2倍に広げると、正面の顔がくっきりしました。

試した環境

  • Pixal3D:4方向の絵(正面・横・背面・反対の横)から形と色を一度に起こす使い方、93 万面
  • Blender 4.5 LTS:UV・投影・焼き込みを Python のスクリプトで。焼き込みは Cycles
  • 色を貼る先:12,000 三角形に減らした模型、色の絵 1024

UV を詰め直すと、顔がくっきりした

最初は Pixal3D の色を、減らした模型の UV に焼きました。すると目の縁がにじみました。UV は smart_project で島の余白を 0.015 にしていて、紙の大半が空いていました。

余白 0.015 で並べた UV。紙の大半が空いている

余白を 0.004 にし、島の形を凹形のまま詰める並べ方に変えて、顔の島を2倍に広げました。これで正面の顔はくっきりしました。

余白 0.004・凹形で詰め直し、顔の島を広げた UV

seed を変えると、別の所が崩れた

それでも、シャツに桃色の四角いしみが残りました(seed 42)。

seed 42 の Pixal3D の色。シャツに桃色の四角いしみがある

seed を変えて起こし直すと、しみは消えても別の所が崩れました。7 では灰色のしみと顔の点々が出ました。

seed 7 の Pixal3D の色。灰色のしみと顔の点々がある

123 では、目の周りに灰色の影が出ました。

seed 123 の Pixal3D の色。目の周りに灰色の影がある

試した3つの seed のどれにも、どこかに崩れがありました。seed を選び直して当たりを探すやり方では、色は揃いませんでした。

入力の4方向の絵を投影する

そこで、Pixal3D に渡した4方向の絵そのものを、模型に投影して色を貼りました。

  1. 模型を絵の中の被写体の高さに合わせ、左右の真ん中を揃える
  2. 正面・横・背面・反対の横の絵を、それぞれの向きから模型に投影する
  3. 面の向きに応じて、4枚の色を混ぜる

模型と絵の幅のずれは 0〜2% で、正面と横は元の絵どおりになりました。

入力の4方向の絵を投影して色を貼った人物の正面

4枚の絵から人形に色を投影する様子

投影で出た崩れと、直し方

投影には投影の崩れがありました。出た物と直し方を並べます。

出たこと何が起きていたか直し方
目が二重に見えるくぼんだ目で面の向きが横に傾き、横の絵が混ざる頂点の向きを8回ならし、混ぜる重みを頂点に持たせる
縁に白い筋縁で、絵の背景の白を拾う絵の背景へ、被写体の色を 16px 染み出させておく
頭の上の筋見下ろしのカメラで一番見える所に出た上向きの面は Pixal3D の色を使う
襟や口元に、髭のような色T ポーズの横の絵では腕と鞄の紐が胸の前を隠していて、その色が襟や口元に載る。腕を下ろすと見えた絵から見えない面には塗らない
こめかみの筋正面と横の絵が、形と食い違ったまま混ざる正面と横の間の斜めの面は Pixal3D の色を使う
目のまわりの灰色の輪描いた目と、彫られた目のくぼみがずれる頭は Pixal3D の色を使う

Pixal3D の色は、Pixal3D の形と食い違いません。それなら全部を Pixal3D の色にすればよさそうですが、胴では Pixal3D の色がシャツに無い桃色の四角いしみを描きました。そこで、色の出どころを部位で分けました。

  • 頭(2.6 頭身なので、上から頭1つ分。高さの 1−1/2.6 より上)、正面と横の間の斜めの面、上向きの面:Pixal3D の色
  • 胴:入力の絵からの投影
  • 絵から見えない面:投影では塗らない

こめかみと目のまわりを拡大して比べた並び。右端が斜めの面と頭を Pixal3D の色にした物

右端が、斜めの面と頭を Pixal3D の色にした物です。こめかみの筋と、目のまわりの灰色の輪が消えました。

Blender の Python で Cycles が落ちた所

投影のスクリプトを書く途中で、Blender の Python の扱いでも1つ詰まりました。

投影の途中で、uv_layers.new で UV の層を足した後に、足す前に掴んでいた層の参照をそのまま使うと、Cycles が落ちました。層を足した後は、層を名前で取り直してから使いました。

確かめていないこと

  • 髪の長い人物やスカートの人物で、投影と頭の境目(高さの 1−1/2.6)が同じように合うかは確かめていません。
  • 途中で残っていた、背面の耳まわりやシャツのボタンまわり・手の色のにじみを、どこまで減らせるかは確かめていません。

おわりに

seed を替えて色の当たりを探すより、入力に使った絵を投影する方が、正面と横は絵どおりに揃いました。投影で崩れやすい頭や斜めの面は、形と食い違わない Pixal3D の色に任せると、こめかみの筋と目のまわりの輪は消えました。直せたのは一つずつの崩れまでで、色を付けた人物全体の見た目は粗いままでした。

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