1.5K Views
August 22, 19
スライド概要
ゲーム中にリアルな皺を高速に表現する方法の紹介資料です。
事前計算された大量の衣類変形データを参照する手法における、以下の知見を紹介させて頂きます。
・衣類の変形データの作成方法
・ランタイムでの実装方法の紹介
・制作中に判明した問題点と解決方法の紹介
・ゲームに取り入れるための、チューニング例の紹介
株式会社ヘキサドライブの資料共有用アカウントです。 公式ブログ:https://hexadrive.jp/hexablog/ note :https://note.com/hexadrive
より詳細な衣類の変形を表現する 現実的な手法 ~ データベースを用いたリアルタイムしわ表現 ~
目次 ・ 動機と手法の特徴の紹介 ・ 手順の説明 ・ 事例と今後の課題について
動機と手法の特徴の紹介 今回紹介する手法での達成目標 ・ 皺などの細かい衣服の表現をしたい ・ ゲームに組み込んでも問題なく動作する速度が出せる
動機と手法の特徴の紹介
動機と手法の特徴の紹介 ・ 皺などの細かい衣服の表現をしたい - メッシュの頂点変形を行う - メッシュの頂点変形だけでは表現しきれない小皺を、 テッセレーションを用いたディスプレイスメントマップで表現 ・ ゲームに組み込んでも問題なく動作する速度が出せる - 事前計算したデータを使用することで、実行時のコストを削減
動機と手法の特徴の紹介 事前にゲーム中でとられそうな姿勢の衣服の形状を計算しデータベース化しておく 衣服形状DB 事前にシミュレーションした形状データから、 姿勢をキーにデータを検索できるデータベースを構築する
動機と手法の特徴の紹介 ゲーム中のポーズと近しいポーズの衣服形状を抽選 抽選した衣服形状を合成 衣服形状DB ゲーム中のポーズ
目次 ・ 動機と手法の特徴の紹介 ・ 手順の説明 ・ 事例と今後の課題について
手順の説明 事前に行うこと ・ 衣服の形状を計算し、データベース化する 実行時に行うこと ・ 今の姿勢に合わせた衣服の形状を抽選し合成する
手順の説明 ■衣服の形状を計算し、データベース化する 衣服のシミュレーション ・ ゲームに使用する予定のモーションを使用し、シミュレーションを行う そのゲームで行う動作に対しては漏れのないデータベースを作りやすいから ・ 0.5~1秒程度のモーションを200種類ほどシミュレーションにかける モーションが長すぎると服が過去の形状の影響を受けすぎてうまくブレンドできなくなる 長すぎるモーションは分割して使用する
手順の説明 ■衣服の形状を計算し、データベース化する シミュレーション結果のデータベース化 ・ シミュレーションした結果はハイポリゴンのメッシュとなっているため そのままゲームでは使用できない ・ ゲーム用モデルに形状を転送し、ブレンドシェイプ化する 10フレーム間隔程度でブレンドシェイプ化
手順の説明 ■衣服の形状を計算し、データベース化する シミュレーション結果のデータベース化 ・形状と姿勢をペアにしてデータベースに登録 ・登録されているポーズと比較し、一番似ていないポーズを追加していく 一番似ていないものを追加 データベースが十分な容量になるまで繰り返し(256ペアが目安) 衣服形状DB
手順の説明 ■衣服の形状を計算し、データベース化する シミュレーション結果のデータベース化 ・ 登録された衣服形状に小皺のディスプレイスメントマップの反映レートを計算し埋め込む ・パラメータは衣服の元形状の法線方向とポリコンの面積を使用し小皺のレートを計算する ・初期姿勢で小皺が入っている部位に関しては頂点カラーを使用してペイントしておく 法線が元形状より内側を向いていたら皺 スキンなし時より面積が小さくなっていたら皺
手順の説明 事前に行うこと ・ 衣服の形状を計算し、データベース化する 実行時に行うこと ・ 今の姿勢に合わせた衣服の形状を抽選し合成する
手順の説明 ■実行時プロセスの流れ 姿勢からの 一致度のスコアを算出 データベースの姿勢と現在の姿勢を比較し、姿勢ごとのスコア算出 合成レートの計算 合成する衣服形状と合成レートを算出 衣服形状の算出 合成レートをもとに、変形した衣服形状を算出 描画 衣服形状に埋め込んだパラメータをもとに、ディスプレイスメントマップを行う めり込み補正もここで行う
手順の説明 ■姿勢からの一致度のスコアを算出 データベースに記録するポーズ数を削減するために 部位ごとに分けた抽選を行う 部位はスキンウェイトを参考にボーン単位で分ける
手順の説明 ■姿勢からの一致度のスコアを算出 ・スコア算出にはボーンの腰からの相対の姿勢を使用 腰の回転はY軸回転しか見ない ・ボーンにスコア算出に影響するウェイトをつける ボーンは部位ごとのウェイトを持っている ・回転と座標をもとに一致度を計算する 現在の姿勢とデータベースに登録された姿勢を比較し、 一致している度合によってスコアをつける
手順の説明 ■合成レートの計算 スコアに対し、POW計算することで元形状が反映される強さを変えられる 1 4 10
手順の説明 ■描画 ・衣服の下に体がない場合のめり込み補正 袖口や足のすそなどにカプセルを入れることで対応 カプセルが入れにくいような場所でめり込みが起こる場合は、 頂点ペイントで変形を抑制するパラメータを入れておく
手順の説明 ■描画 ・衣服の下に体がある場合のめり込み補正 抽選された衣服頂点 ブレンド結果 腕の断面
手順の説明 ■描画 ・ディスプレイスメントマップによる小皺表現
手順の説明 ■描画 ・ディスプレイスメントマップによる小皺表現 特に変化の大きい腰のひねりに合わせて3パターンのデータを用意する
手順の説明 ■描画 ・ディスプレイスメントマップによる小皺表現 頂点にペイントされたデフォルトの小皺のレートと、 抽選された結果の小皺のレートを合わせたものをディスプレイスメントマップの影響度とする 小皺のバリエーションを増やしたい場合は、 データベースに登録するのを小皺のレートだけでなく 小皺の種類も記録するなどの手もある ピクセルシェーダでフェッチするテクスチャの種類が増えるのは リアルタイムで動作するゲームを作るうえであまりお勧めはできません
手順の説明 ■高速化対応 姿勢からの 一致度のスコアを算出 合成レートの計算 衣服形状の算出 描画 このあたりの処理は重いし、毎フレームやらなくてもいいのでは?
手順の説明 ■高速化対応 3フレームに分けて処理 毎フレーム 姿勢からの 一致度のスコアを算出 衣服目標形状に むかって変形 合成レートの計算 描画 衣服目標形状の算出
目次 ・ 動機と手法の特徴の紹介 ・ 手順の説明 ・ 事例と今後の課題について
事例と今後の課題について コンシューマー機での処理負荷 Unityでは最適化が難しかったので内製環境で最適化を行い計測 Gbuffer構築にかかる時間 高速化対応 人数 ポリゴン数 処理負荷(ms) データベース容量 MB(メガバイト) 対応前 6 1700 13.1 ~ 14.8 5 対応後 6 1700 0.62 ~ 0.65 5 対応後 6 7000 0.95 ~ 1.2 15
事例と今後の課題について 今後の課題 ・ ポーズによるマッチングを行っているので慣性を考慮した衣服形状が作りにくい - 抽選に過去のポーズも含める 抽選負荷増 - ニューラルネットを用いた抽選をやってみる ・外からの力を考慮できない - 風とかであれば、抽選に風の方向と力を入れてみる - 何かがぶつかってくるとかになると物理を使うしかない
参考 2014_siggraph_SensitivityClothRig