前編からの続き。
モーション書き出したはいいが、全然動いてくれねーんすよ状態。
う〜ん、前回からCOLLADAの解釈からして怪しかったもんねえ。
今回もドイヒ。
なんじゃこの変形状態はというね
どうも変なんで、試しにCOLLADAファイルをSceneKitのネイティブファイルであるSceneファイル(拡張子.scn)に変換してみます。
ナビゲーションエリアでaoi.dae項目を選んでおいて、Editor>Convert to SceneKit scene file format(.scn)メニューを選択。
複製(デュプリケート:Duplicate)するか、そのまま変換(コンバート:Convert)か聞かれるんで、とりあえず元ファイルを残す複製の方で。
うりゃ!
うーん、複製されたsceneファイル開いてAOI_arm選んだら真っ黒になってしまった。
やっぱ、なんかおかしい。
こんな時はscntoolだ!
scntool
scntoolはXcodeのバンドルの中に入ってる、COLLADAやSceneファイル間の変換用コマンドラインツールっす。バンドルわからん人は「見た目が大事」ね。
↓scntoolの解説
https://gist.github.com/matux/4a30c4b4b29d636fe6847b6a3234bc4f
こいつはターミナルから使います。
ターミナル
ターミナルはアイコンをダブルクリックで起動する通常のMacアプリ。アプリケーションフォルダのユーティリティフォルダに入ってます。
Launchpadだと「その他」の中ね。
起動するとこんなウィンドウが開きます。
ゆーても、私は環境設定でHomebrewプロファイルを
カスタマイズしてるんでそのまんまじゃないけど
ただ文字を打ち込み、それに対応して文字が表示されるだけのウィンドウ。
ま、一応マウスでの文字セレクトやコピー、ペーストには対応してくれてますが、基本キーボードからの入力のみを受け付けて、文字のみを表示する。
40年ほど前、マウスのない時代は、みんなこんな感じでキーボードから色々文字を使ってコンピュータに命令してたわけだ。マウスがないならトラックパッドを使えばよくってよ。
scntoolは、ここからでないと使えない。
そういうのをコマンドラインツールって言います。
コマンドラインツール
利用するにあたっては、コマンドラインツール(今回ならscntool)自身のファイルの場所を、ファイルパスで指定する必要があったりして結構面倒っす。
ファイルパス
ファイルパスはこの前紹介したURLの祖先みたいなもんで、Macだと先頭のスキーム部file:が省かれて、その次の // が / になるだけでそれほど違いはありません。
今回のscntoolはXcodeバンドル内にあるんで、例えばXcodeがアプリケーションフォルダに置かれてる場合、scntoolのファイルパスは
/Applications/Xcode.app/Contents/Developer/usr/bin/scntool
となります。
とても長い。
よく使うコマンドラインツール群は、決まったフォルダに集められてて、そのフォルダを、ツールの名前だけ書かれた場合に検索する場所としてあらかじめ指定してるので、コマンド(ラインツール)名だけ書けば実行できるようになってんだけど、scntoolの置かれてる場所は、そこには含まれてないで、フルに書かないとダメなんですな。
ただし、もうちょっとお手軽な方法として
xcrun scntool
と打ち込むやり方があります。
xcrunもコマンドラインツールで、これ自体はよく使うツール群が置かれてる場所にあって名前書くだけでOK。で、スペースを挟んで、その後に続くコマンドラインツール(今回ならscntoolね)をXcodeのバンドルから探して実行してくれる。
私はこれを使ってる。
チューことで、scntoolを実際にターミナルで使ってみましょう。
scntoolによるCOLLADAファイルの変換
まず、aoi.daeファイルのあるaoiフォルダをカレントディレクトリにするためにcdコマンド使います。
カレントディレクトリ
こいつは、ツールを検索するフォルダと同じで、ファイル名だけ書かれた時に、検索するフォルダのことっす。
昔はフォルダと言わずディレクトリって言ってた。
ツールを検索するフォルダとは別に1つだけ、cdコマンドで指定できる。
cd
カレントディレクトリを設定するには、ターミナルで
cd /Users/kunii/Desktop/mmd/mmd/art.scnassets/aoi/
てな風に、cdの後にスペース入れてからカレントにしたいフォルダのファイルパスを書きます。今書いたのは、私のマシンでのaoiフォルダのファイルパス。
こうしてaoiフォルダをカレントディレクトリにしておくと、aoi.daeって書くだけで、aoiフォルダの中にあるaoi.daeというファイルを指定したことになって、長いファイルパスを書かなくて済む。
と言っても、自分のaoiフォルダのファイルパスなんてパッと思いつかんよね。
ということで、簡単な指定方法教えます。
まずターミナルで「c」キー、「d」キー、スペースキーと打ち込んでcdとカーソルの間があいてる状態にしましょう。
この状態でaoiフォルダをターミナルのウィンドウにドロップ。
これでaoiフォルダのパスが表示されるので、そのままenterキーを打ち込んで実行。これでaoiフォルダがカレントディレクトリに指定されるので、この長ったらしい文字列を打ち込む必要がなくなる。
もちろん、ドラッグ&ドロップなんかせずに全部キーボードから入力してもOK。
ここら辺興味のある人は「mac ターミナル」で検索だ。
あとは
xcrun scntool --convert aoi.dae --format scn --output x.scn --asset-catalog-path /Users/kunii/Desktop/mmd/mmd/art.scnassets/aoi/ --force-y-up --verbose
と入力してenterキーで実行。
--convert aoi.dae
はカレントディレクトリのaoi.daeってファイルを変換(コンバート:convert)希望って意味。ここでaoi.daeのフルパス書けば、上のcd処理は必要ないけど長くなるしね。
--format scn
はsceneファイル形式(フォーマット:format)に変換してねという意味。
--output x.scn
は変換した出力(アウトプット:output)ファイルはx.scnて名前にするよって意味。
--asset-catalog-path /Users/kunii/Desktop/mmd/mmd/art.scnassets/aoi/
は、テクスチャファイルといった資産群(アセットカタログ:asset catalog)のあるフォルダのパス(path)の指定。今回ならaoi.daeと同じ階層なんで . でもいいかと思ったんだけど /(スラッシュ)からのフル記述のパスが必要でした。
注意)「.」はカレントディレクトリて意味になるが、今回は通じなかった。
aoi.daeで使う資産、つまりテクスチャファイルは、aoi.daeと同階層にあるんで、これは、カレントディレクトリのことになります。なので--asset-catalog-pathの後ろに指定するファイルパスは
pwd
と入力してenterキー打つことで調べることができます。
pwd
現在のカレントディレクトを表示せよという命令。
つまり表示されるのは、さっきのcd で指定したパスなんですけどね。
--force-y-up
は例の「見た目が大事」で話したBlenderはz軸を上にする問題への対応。必ずy軸を上下軸にせよという指定。SceneファイルはSecneKit Catalogフォルダに入ってても、補正の対象外なので。
--verbose
は、冗長(バボース:verbose)なメッセージを依頼。
とにかく、事細かに今なにやってるか伝えろって指示です。これを指定することで、何のトラブルがわかるかもしれないわけっす。
で、うりゃっと実行。
冗長なメッセージを依頼したんで、ブワーとメッセージが流れてく。終わったところで上にスクロールしていくと…
あ〜、もうねえ、これっぽい。
ボーン名が文字化けしてる。
で、ターゲットが見つからないと…
やっちゃたねと。
でも一応の変換はしてくれてた。アニメーションしないけど
MMDは日本生まれなんで、日本語使うのになんの遠慮もないんですが、アメリカ生まれのXcodeやscntoolは日本語読めないんすよ。本来UTF-8なんで、読めないにせよ問題なく作業できそうなんだけど、やっぱ理想と現実は違うっすな。
これが原因かなっと…
どうしよこれ、ねえ、どうしたらいい?
Blender戻ってアウトライナーで手動でボーン名を英語に直す?
頭抱えつつBlenderのMMDタブ画面よくみたら、Translationってボタンがあるじゃなーい。
MMDタブ画面
MMDタブはmmd_toolsアドオンによって提供されるコントロール画面っす。3Dビューの左にあります。
ビンゴでした。
指定したパートのオブジェクト名を日本語から英語に変換してくれるっぽい。
とりあえず変換辞書は内部版(Internal Dictionary)を指定して、Types、Modesの項目はshiftキー押しながらのマウスクリックで全選択、下の3つの項目も全部チェック入れてOKボタンクリック。
注意)この内部版の変換辞書はmmd_toolsフォルダ内のtranslations.pyというpythonファイルに直接書き込まれてました。Blenderのアドオンはpythonで書けるんですな。で、pythonファイルなんでプログラムが読めるんですが、どうもtranslations.pyと同じ階層にtranslations.csvて名前のファイルを置けば、外部提供辞書として利用してくれるらしい。で、そこらへん踏まえて検索して以下のリポジトリ見つけますた。
https://github.com/Hogarth-MMD/mmd_tools_translation
ここで提供されるtranslations.csvをtranslations.pyと同じ階層に置くと、より多くの日本語を英語に変換してくれます。もし変換しきれない日本語のボーン名なんかがつけられてた場合は、このtranslations.csvに「対象の日本語, その日本語に対応する英語」の順で行を追加してやればいいみたい。
何個か変換できなかったよーとエラーレポートされたけど、大半はできたっぽい。
とりあえず、これで再度COLLADAを再出力してXcodeでRunだ!
うりゃ!
動きましたー。
注意)とにかく極力日本語は避ける方向が正解っぽい。これ以外に、MMDのファイルによってはメッシュ名やアーマチュア名に日本語使ってて、それが悪さして動かない場合もあった。ハッカドールなんかのMMDがこれ。
で、前回から見えてた半透明のカプセル、物理計算用の剛体(リジッドボディ:rigidbody)。
こいつは、物体同士の衝突による反発などを計算して動作させるためのもんで、MMDでは髪なんかを揺らすのに使ってます。なんだけど、今のところ役に立たないので見えないようにしときます。
アウトライナービューでAOIの下にいるrigidbodiesってのがそれなんで、SCNNodeとして読み込んだAOIノードをwithName:"rigidbodies"で検索すれば見つかるはず。
見つかったら、removeFromParentNodeメッセージで親離れしてもらいます。
removeFromParentNodeメッセージ
登録の場合、親となるSCNNodeにaddChildNodeメッセージを送るんですが、その登録された親から離れる場合は、子供側のSCNNodeにこのメッセージを送ります。
class ViewController: UIViewController { ・・・ override func viewDidLoad() { ・・・ guard let mmd = mmdscene.rootNode.childNode( withName: "AOI", recursively: true) else { return } if let rigidbodies = mmd.childNode( withName: "rigidbodies", recursively: true) { rigidbodies.removeFromParentNode() }
これでパーペキ。
サンプル:
http://tetera.jp/xcc/book-sample/mmd-motion.zip
ところで、さっきのMMDタブにある運動をインポートするボタンは、アウトライナービューでAOI項目を選んでるとクリックできるんだが、こいつは世に出回ってるミックミックダンスのモーションデータファイル(拡張子.vmd)を読み込むためのもんです。
MMDモーションデータファイル
例えば「WebGLでいきますぜい」で紹介したthree.jsサイトからダウンロードできるthree.js-masterのexamples/models/mmd/vmdsに入ってるモーションデータファイルのうち、MMDモデル用のモーションファイルwavefile_v2.vmdを読みこまして、こいつをCOLLADAで出力してARで使うと〜
↓three.jsサイト
こうなります。
左側は、同じモーションを初音ミクモデルに埋め込んだもの
このモデルもthree.js-masterに入ってる
サンプル:
http://tetera.jp/xcc/book-sample/mmd-dance.zip
イエェエェェスッ!
総統!歩けます!!
物理演算できてないから髪が体に食い込むとか、揺れないとかはあるし、モーフィングっていう機能もサポートできてないんで、まばたき一つしないけど、まずはめでたい。Blender、COLLADA、SceneKitで剛体運動やモーフィングをどう扱うかとか、そういうのはもうちょっと単純なサンプル作って調べてかないとね。
とりあえずはダンスダンスダンス!
ということで、次回は油圧ショベルに戻ります。