春到来!仮想試着システム、事始め。
次第に暖かくなってきてそろそろ衣替えの季節ですね。外に出て服を買うのもいいですが、お家で仮装試着はいかがでしょう?
昨今のメタバースやNFTの流れもあり、バーチャルファッションに注目が集まりつつありますね。そんな背景もあり、ある商業施設に入っている各ブランドの商品を3D上で自由にコーディネートをしたいと相談を受け、最近までその案件をやっていました。通常各社ブランドは自身の世界観を崩さぬよう他のアイテムを取り入れたくないと思うので、ブランドの枠にとらわれずにコーディネートができるというのは非常に面白い試みだと思います。
アプリの紹介
今回作成したアプリはこちらからダウンロードできます。3月8日から一か月限定公開らしいので、観れる方はお早めに。
この投稿では、このアプリを実現する上で出た課題や解決策などをご紹介したいと思います。
衣服を3D化するにあたって
一般的に衣服を3D化する方法は下記の3つに絞れるかなと思います。
(モデリング方式)デザイナーやアーティストがモデリングする
(スキャン方式)実在する衣服をスキャンする
(推定方式) 一枚/複数枚の入力画像からテンプレートを使って3D形状を推定する
モデリング方式はアーティストのスキルが必要ですが一番きれいに再現できると思います。ただ実物の形状やマテリアル感を正確に再現しようとすると非常に手間がかかり、数をこなすには現実的ではありません[参考]。推定手法についても、研究として手法は提案されているものの、精度やロバスト性、バリエーションの面から現状厳しいと判断しました。今回の様に衣服の3Dデータが存在しない場合には、3Dスキャンが適切だと思います。
どうやって衣服を3Dスキャンしたか
今回の撮影では、Volumetric Video(VV)専用スタジオをお借りして、VVを単一フレームのみ復元することで撮影を行なっています。具体的にはVV用の撮影機材(およそ40個の多視点固定カメラ)で得られた画像からグリーンバックで対象部分のみ抜いて、視体積交差法という手法で形状を復元しています。
グリーンバックのお陰でその後のクリーンナップ(不要な箇所の頂点削除処理)の手間が少なくて済みました。別途、復元結果からマネキン部を削除する(衣服を残す)必要があり、マネキンもグリーンカラーにする事で自動化できると思ったのですが、反射で衣服に緑色が乗ってしまうという問題点等があり、今回はBlenderのブーリアン機能を使って手動で行いました。
使用するマネキンについて
最初の実験では腕が曲がる布地でできたマネキンを使用しており、着せ替えがラクであった反面、撮影の度にマネキンがズレてしまう問題がありました。またマネキンのポーズがAポーズのようなマネキンだと、ユルい衣服の場合に腕と胴が繋がってしまいました。これにより3D空間上でマネキンにスキャンした衣服を着せると位置が合わずにめり込んでしまったり、その後の重ね着やアニメーションが困難になったりします。
その反省から、本番では固定のマネキンを選ぶと共に、Tポーズなマネキンが存在しなかったのでマチバリなどで腕と胴が繋がらないように洋服を固定するなどの工夫が必要でした。マネキンを極力動かないようにしても多少めり込みが起きてしまうので、最終的にはBlender上でマネキンをコリジョンの対象とし、クロスシミュレーションで押し出す事でマネキンに位置合わせをしました。
重ね着の難しさについて考える
今回の案件で想像以上につまづいたのは重ね着をさせた時に生じるめりこみの問題です。図1を見てわかる通り、途方もないほどめり込んでいます。またそれ以外にも各アイテムのレイヤー順を考慮する必要があります。(図2参照)
まず手始めに重なりを取り除こうと思い、BlenderのClothを使って衝突判定をしながらめりこみを押し出す実験をしたのですが、最初のドレープ感が変わったり膨らみすぎたりして、あまりいい結果は得られませんでした。アプリ側で衝突判定するのも難しそうなので、事前に衝突を考慮した形状を作っておく方針になりました。
ただ、アイテムの数が非常に膨大なため、コーディネートの組み合わせを考えると数千に及びます。そこでその膨大なコーディネートパターンを如何に減らすかという問題に落とし込み、その解決策を考える、というのが主に今回の案件でやった事です。
どうやって重ね着を実現したか
まず、レイヤー順を決めることは重要です。三つのアイテム(Boots, Bottom, Inner)があった場合にどのような順序でアイテムを着るかをシステムがわかるようにする必要があるため、今回は下記左のようなjson形式で定義しました。同時に二つのアイテムの組み合わせ時にどちらのオブジェクトが変化するかの定義も決めました。これで、編集するアイテムの数を劇的に減らすことができます。
またクオリティの観点で、アウターの長さによってボトムやインナーのめり込み具合が変わるため、アウターをタイプ別に分け、それぞれの組み合わせによって適切な形状になるような方針にしました。なお適切な形状は事前にブレンドシェイプとして登録をしておいて、組み合わせに応じたウェイト制御によってめり込みが起きないようにしています。
作業する順序も割と重要で、Bottom x Boots, Bottom x Inner, 最後にBoots-Bottom-Inner-Outerのパターンをやっていくと、組み合わせ数を減らしつつ作業がより明確化されます。下記順序を実現するようなPermutationアルゴリズムを今回作りました。
最後は完全に鬼の所業なのですが、すべての組み合わせをBlenderのSculptツールで編集し、shapekeyを登録しています。今回はこれに非常に時間がかかってしまいました。今回の案件にぴったりの論文を見つけたのですが、これを実装するのがなかなか時間を要してしまいそうで非常にリスキーだったので今回はここまではいけませんでした。どなたかこちらの実装に興味がある方がいたら是非一緒にやりましょう。
事前処理が鬼の所業でしたが、アプリ側ではブレンドシェイプで非常にスマートにコーディネート表現ができます。
まとめ
洋服のスキャンから位置合わせ、重ね着とやる事が盛り沢山な内容でしたが、個人としては多くの知見が得られた案件でした。ちなみに今回データの作成とアプリ作成で異なる会社が行っていて、明らかに我々データ作成担当の分量が多くなってしまったため、関係者には大変多くの作業をお願いすることになってしまいました。無事リリースまで対応していただいたことを本当に感謝しています。コスト的に再度この案件が実現できるかがわかりませんが、先ほどの論文のような技術があればブレイクスルーがある気がします。
以下、リリース直後に試している様子。
長文を読んできただき、ありがとうございました。
バーチャルファッション興味あるので、何かご相談ある際はぜひお声がけください。