LoginSignup
1
1

mocopiの動作をUnityで再生時にテレポートさせない方法

Posted at

概要

mocopiで取得したデータをUnityで再生すると一瞬だけ原点(0,0)から開始しています。
また、mocopi でデータを取得を開始してもキャリブレーション時の位置が原点となるため、
モデルを置いた初期位置からずれてしまうことがあります。

なので、モデルの初期位置がモーションの初期位置となる方法をまとめます。

(モデルを原点(中心)に置いて開始していますが、テレポートしているのが分かります)

Macの場合、Automator という MacOS デフォルトのアプリを使用して Finder のクイックアクション から簡単に変換することもできます。
bvhReset&2fbx を選択すると 整形からFBXへの変換までやってくれます。
スクリーンショット 2024-01-15 17.10.54.png (2.7 MB)

手順

Python3 をインストールする

ここでは省略します

パッケージをインストールする

PCのグローバル環境に mcp-persor をインストールします

pip install mcp-persor

スクリプトを用意する

以下のスクリプトを保存します。
ここでは reset_position_and_rotation.py としています

スクリプト
from mcp_persor import BVHparser
import sys
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('file', type=str, help='input mocopi record file *.bvh')

args = parser.parse_args(sys.argv[sys.argv.index('--') + 1:])

bvhp = BVHparser(args.file)

# データのない箇所を削除
motion_df = bvhp.get_motion_df()
motion_df = motion_df[
    (motion_df['root_Xposition'] != 0) | (motion_df['root_Zposition'] != 0)
]

# 位置と回転をリセット
reset_channels = ['root_Xposition', 'root_Zposition', 'root_Yrotation']
for c in reset_channels:
    motion_df[c] = motion_df[c] - motion_df.iloc[0][c]

# dataframeを更新
bvhp.set_motion_df(motion_df)

new_file = f"{args.file[:-4]}-reset.{args.file[-3:]}"
bvhp.to_bvh(new_file)

# new_file を標準出力する
print(new_file)

BVHを整形する

以下のコマンドを実行すると 整形後のBVHファイルが生成されます

<script>reset_position_and_rotation.py のパスを
<bvh> は 変換するBHVファイルのパスに置き換えてください

Mac

python3 <script> -- <bvh>

Windows

python <script> -- <bvh>

より楽に変換する方法(Mac)

mocopiの動きをUnityで可視化する の BVH を FBX に変換する の項目をしている前提です

Automator.app を開き、クイックアクション を選択します
スクリーンショット 2024-01-15 17.27.55.png (1.5 MB)

ウィンドウ上部の項目を以下のように設定します

  • ワークフローが受け取る現在の項目: ファイルまたはフォルダ
  • 検索対象: Finder.app
  • 画像: 任意(クイックアクションのアイコンになります)
  • カラー: 任意(クイックアクションのアイコンになります)
スクリーンショット 2024-01-15 17.58.07.png (1.4 MB)

シェルスクリプトを実行 ブロックを2つ追加し、入力の引き渡し方法を 引数として にします。
以下のコードを貼り付けてください。
ただし
<reset-script>reset_position_and_rotation.py絶対パス
<convert-script> は mocopi_bvh_fbx_converter.py の絶対パス
<python3> は Python の本体のパスに置き換えてください。
Python 本体のパスは which python3 で分かります

一つ目

for file in "$@"; do
  if [[ "$file" == *.bvh || "$file" == *.BVH ]]; then
    <python3> <reset-script> -- "$file"
  fi
done

二つ目

for file in "$@"; do
  /Applications/Blender.app/Contents/MacOS/Blender -b -P <convert-script> -- "$file"
done

保存することで画像のようにクイックアクションとして使用できます。
保存場所はデフォルト(~/Library/Services/) にしてください。
スクリーンショット 2024-01-15 17.10.54.png (2.7 MB)

クイックアクション に表示されていない場合は
システム設定 > プライバシーとセキュリティ > Finder
で有効になっているかを確認してください。
スクリーンショット 2024-01-15 17.26.51.png (821.1 kB)

おわりに

最後までお読みいただきありがとうございました!
mcp-persor は自作パッケージなので不安定かもしれません。
よりよいものがあればお知らせください

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1