画像から 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.004 にし、島の形を凹形のまま詰める並べ方に変えて、顔の島を2倍に広げました。これで正面の顔はくっきりしました。

seed を変えると、別の所が崩れた
それでも、シャツに桃色の四角いしみが残りました(seed 42)。

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

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

試した3つの seed のどれにも、どこかに崩れがありました。seed を選び直して当たりを探すやり方では、色は揃いませんでした。
入力の4方向の絵を投影する
そこで、Pixal3D に渡した4方向の絵そのものを、模型に投影して色を貼りました。
- 模型を絵の中の被写体の高さに合わせ、左右の真ん中を揃える
- 正面・横・背面・反対の横の絵を、それぞれの向きから模型に投影する
- 面の向きに応じて、4枚の色を混ぜる
模型と絵の幅のずれは 0〜2% で、正面と横は元の絵どおりになりました。


投影で出た崩れと、直し方
投影には投影の崩れがありました。出た物と直し方を並べます。
| 出たこと | 何が起きていたか | 直し方 |
|---|---|---|
| 目が二重に見える | くぼんだ目で面の向きが横に傾き、横の絵が混ざる | 頂点の向きを8回ならし、混ぜる重みを頂点に持たせる |
| 縁に白い筋 | 縁で、絵の背景の白を拾う | 絵の背景へ、被写体の色を 16px 染み出させておく |
| 頭の上の筋 | 見下ろしのカメラで一番見える所に出た | 上向きの面は Pixal3D の色を使う |
| 襟や口元に、髭のような色 | T ポーズの横の絵では腕と鞄の紐が胸の前を隠していて、その色が襟や口元に載る。腕を下ろすと見えた | 絵から見えない面には塗らない |
| こめかみの筋 | 正面と横の絵が、形と食い違ったまま混ざる | 正面と横の間の斜めの面は Pixal3D の色を使う |
| 目のまわりの灰色の輪 | 描いた目と、彫られた目のくぼみがずれる | 頭は Pixal3D の色を使う |
Pixal3D の色は、Pixal3D の形と食い違いません。それなら全部を Pixal3D の色にすればよさそうですが、胴では Pixal3D の色がシャツに無い桃色の四角いしみを描きました。そこで、色の出どころを部位で分けました。
- 頭(2.6 頭身なので、上から頭1つ分。高さの 1−1/2.6 より上)、正面と横の間の斜めの面、上向きの面:Pixal3D の色
- 胴:入力の絵からの投影
- 絵から見えない面:投影では塗らない

右端が、斜めの面と頭を Pixal3D の色にした物です。こめかみの筋と、目のまわりの灰色の輪が消えました。
Blender の Python で Cycles が落ちた所
投影のスクリプトを書く途中で、Blender の Python の扱いでも1つ詰まりました。
投影の途中で、uv_layers.new で UV の層を足した後に、足す前に掴んでいた層の参照をそのまま使うと、Cycles が落ちました。層を足した後は、層を名前で取り直してから使いました。
確かめていないこと
- 髪の長い人物やスカートの人物で、投影と頭の境目(高さの 1−1/2.6)が同じように合うかは確かめていません。
- 途中で残っていた、背面の耳まわりやシャツのボタンまわり・手の色のにじみを、どこまで減らせるかは確かめていません。
おわりに
seed を替えて色の当たりを探すより、入力に使った絵を投影する方が、正面と横は絵どおりに揃いました。投影で崩れやすい頭や斜めの面は、形と食い違わない Pixal3D の色に任せると、こめかみの筋と目のまわりの輪は消えました。直せたのは一つずつの崩れまでで、色を付けた人物全体の見た目は粗いままでした。
※ Pixal3D と Blender の振る舞いは執筆時点で試した物で、いまは変わっている可能性があります。


