投稿記事

satofumi 2020/11/04 20:00

プロジェクト管理ファイルの実装

今回はプロジェクトの管理まわりを実装していきます。プロジェクトとは、いわゆる編集途中の状態を保持させるあれです。

実装方針は「必要な情報を片っ端から yaml ファイルに登録して %appdata% 以下にフォルダを作って保存する」です。モーションのデータはプロジェクトとは別のファイルでの保存を考えています。

実装ですが、Unity Asset Store にある "YamlDotNet for Unity" を利用します。YAML は編集しやすいので好きです。このアセットを使っての必要なデータを YAML ファイルとして保存するあたりの実装はめんどいだけで難しくないです。

セーブデータで扱う項目のプロパティを持たせたクラスを YAML で保存するようにしたら、次はセーブデータを読み込んだときに項目を UI やモデルの位置に反映させるあたりを実装します。この実装もめんどいだけで難しくないです。知ってることのコーディングは基本めんどいだけです。

これらが実装できたら、最後にタイトル画面の「続きから」ボタンが押されたときに最新データが読み込まれるようにします。セーブデータがないときには「続きから」ボタンが押されないようにもします。
ファイルのセーブとロードのダイアログは System.Windows.Forms の OpenFileDialog を使いました。

これで、プロジェクトファイルのセーブとロードがとりあえず実装できました。
次回はモーションの記録と再生、あと可能なら mp4 出力の実装にも着手したいです。

次回の更新: 金曜日の 20時

satofumi 2020/11/02 20:00

VR コントローラでモデルを動かすあたり

今回はモデルになりきって手や頭を動かして、そのモーションをミラーで確認するあたりを実装していきます。

実現したいことを列挙すると

・コントローラのリセットに定義したボタンを押したときに、自分(ヘッドセットの視点)をモデルの位置に移動させる。
・撮影するカメラマンの位置にミラーを配置して自分の振る舞いを確認できるようにする。

です。


それでは実装していきます。

まず、モデルの手足を動かすには Animator Controller に IK Pass を設定して、Animator の SetIKPositionWeight(), SetIKRotationWeight(), SetIKPosition(), SetIKRotation() で左右の手の位置を設定します。
この手の位置を計算には、ルームスケールにおける手の位置とシーン内で移動させたモデルの位置で座標変換する必要があって、ぶっちゃけ面倒でした。数学、いや算数に詳しくなりたいです。

でも、できました。


Steam VR Plugin が描画した手の位置とずれてるけど、とりあえず気にしないことにします。何事も妥協が大事だと私は信じています。

あと、モデルの頭の位置にヘッドセットを移動させると目の前に頭の中身が見えてしまうので、ヘッドセットのカメラには頭を表示しないようにしました。


モデルの頭の位置からの視点。おっぱい。

次は、自分のモーションを確認するためのミラーをカメラマンの位置に配置します。
ミラーに関しては下記サイトを参考にしました。
UnityとHTC Viveで鏡を作る方法

で、ミラーを配置したときの様子はこんな感じです。

ミラーには枠を表示した方がいいかもですけど、そのうちやります。

さて、今回はここまでにします。
次回はモーションの記録と再生まわりをしたいのですが、先にプロジェクト管理まわりの実装をするかもしれません。テストの度に「シーン配置ボタン、モデルの位置変更ボタンを押す」とかやるのはめんどうなので。

次回の投稿: 水曜日の 20時

satofumi 2020/10/30 20:00

モデルの位置を変更できるようにする

シーン(背景)のアセットが配置できるようになったので、次は PV 撮影におけるモデルとカメラマンの位置を指定するあたりの実装をしていきます。

最終的な仕様としては、

・タイムラインで位置を指定することで、モデルやカメラマンの移動も表現できるようにする。
・モデルの位置と角度の指定はドラッグで行えるようにする。
・シーンを眺める角度を右ドラッグでぐりぐり変更できる。

ということを考えているのですが、とりあえず実装を簡単にするために妥協します。
妥協するとこんな感じです。

・ボタンを押した後のクリック位置にモデルやカメラマンを配置する。
・モデルとカメラマンは互いの方向を向く。

我ながら良い妥協だと思います。うっとりです。


では実装していきます。
まずはパネルを2枚配置します。上のパネルにはカメラマンがモデルをどう見えるかのプレビュー表示を行い、下のパネルにはシーンを真上から見下ろした描画を行います。そして、下のパネルのクリックした位置にモデルが配置されるようにします。

この UI において、カーソル位置がシーンのどの座標に相当するかを返すメソッドを作り、なんやかんやすると実装完了です。見下ろしカメラの投影モードは Orthographic にしたので算数の苦手な私でも座標変換が簡単に行えます。えっへん!


中央にいたモデルを少し右上に移動させてみた。

作っていて思ったことは

・ホイール操作で下パネルの描画範囲を拡大縮小したい。
・カメラマンの位置変更もそのうち実装する。

です。
でもまぁ、ここまで動作すれば良いことにします。今作っても後から作り直すかもしれないので、細かい作り込みは各機能を全体的に作ってからまたやります。

次は VR 空間で手を降ったときに、それを保存して再生できるあたりを実装しようと思います。今後もがんばります。

次回の更新: 月曜日の 20時

satofumi 2020/10/28 20:00

背景シーンの配置とタイトル画面の作成

今回は背景を選んで配置できるようにするあたりです。
ちょうど数日前に Unity のセールで買った「メガバンドル・ジャパン」バンドルに使えそうなアセットがあったので利用することにします。いくつか候補があったのですが、とりあえずは学校の教室と団地の2つのアセットを利用します。

そして、何も考えずにそれぞれのデモシーンを Prefab にして、ボタン押下に応じてそれぞれのシーンが配置されるようにしたものが以下の画像になります。


すごく良いですね。背景が配置されるだけで進捗がぐっと進んだような錯覚に浸れます。最高です。
そして、私の理解が不足しているせいで全体的に暗いとか、調整不足でモデルが地面から浮いているとか、そういうことはとりあえず後回しにします。後回しにできることは後回しにすべきなのです。私は開発には妥協が大事だと信じています。

そして、団地については SteamVR の Teleporting クラスを使えるようにして、VR コントローラでテレポートして移動してみたんですけど探検してるみたいでワクワクしました。良いですね。


さて、次はタイトル画面の作成です。
どう考えてもタイトル画面みたいな必要かどうかわからないものの作成は後回しにすべきなんですが、どうするか考えてたら「考えるのと作るのはだいたい同じだし、作っちゃうか!」って思ったので作っちゃいました。

このタイトル画面では "Rounded UI Pack" なるアセットを利用しています。
そして Unity の多言語対応の機能である Localization Tools を使ってみて日本語表示にしたものがこれです。

Unity 便利ですね。大好きです。
リリースまでにはタイトルを決めたり背景画像を変更したいとは思っているのですが、それは後回しです。未来の私に期待します。

こんな感じで今後も未来の私にタスクを残しながらの開発をしていきたいです。
がんばります!

次回の更新: 金曜日の 20時

satofumi 2020/10/26 20:00

スカートをつかめるようにする

まずは、VR コントローラでスカートを掴んで揺らせるようにします。
調べてみると、スカートの揺れは Dynamic Bone というアセットで実現されているようです。大丈夫、Dynamic Bone は Humble Unity Bundle 2019 に含まれていたので持ってます! ありがとう、Humble さん。

で、Dynamic Bone を Unity で表示するとこんな感じです。

Unity でモデルを動かすとスカートが揺れるのが確認できました。
いいですね、揺れるスカートにはロマンもたゆたっているように思います。

スカートが Dynamic Bone で揺れていることがわかったので、スカートを揺らせるようにしていきます。具体的には DynamicBone.cs にボーン位置のオブジェクトを返すメソッドと位置を更新するメソッドを追加して、コントローラで「握る」操作をしたときに、ボーンがコントローラに吸い付くようにしました。

コントローラにスカートが吸い付いた様子です。

良い感じだと思います。ただ、よく見るまでもなく傘のように広がったボーンの1つの方向しか位置を変更できていません。
これについては、同じ高さにあるボーンを連結したかのような動作をするクラスを追加して対処しました。このクラスでは、ボーンの横同士の距離をなるべく保つように位置を設定します。

これにより、スカートっぽい挙動になったと思います。良い感じです。

最終的にはこんな感じになりました。

手の位置がスカートに接していないのですが、これについては後回しにして別の実装を進めようと思います。開発初期なので「立ち止まってこだわる」より「妥協して先に進む」を優先したいのです。まずリリースできる状態にしたいのです。

次回はモデルの背景になる建物を配置していこうと思います。
引き続き、がんばって妥協して完成を目指します。

次回の投稿: 水曜日の 20時

月別アーカイブ

限定特典から探す

記事を検索