OSC 心拍計アバターセットアップガイド

OSC HeartRateSenderに連動して動くアバターのセットアップ方法のガイドです。VRChat SDK Avatar3.0規格でセットアップ済みのアバターを前提にしています。

 

基本的にはAvatar3.0のExpressionParameterを使ったアバターギミックとセットアップ方法はおなじになります。ラジアルでのシェイプキー操作方法|みかんねここ|noteのような、RadialPuppetとExpressionParameterのFloatを使うAvatar3.0カスタマイズ記事は参考になるでしょう

 

ここでは、具体例として火事屋さんのアバターU10素体版を例にセットアップをしていきます。なお、完成したアバターについてもpackageに含んでますので、参考にしてみてください

booth.pm

基本の仕組み

OSCとVRChatのAvatar3.0は概ね以下の流れで動きます。

  1. OSC HeartRateSenderはOSCで心拍数をVRChatに送ります
  2. VRChatは受け取った値を、アバターのExpressionParameterに格納します(ExpressionParameterはVRChat内同一インスタンスの相手にも同期されます)
  3. ExpressionParameterに基づいてアバターのFX layerがアニメーションを実行します
  4. アニメーションが適用されて、心拍数表示やドキドキする動きがアバターに反映されます

このステップ、あなたがアバターに組み込む必要な作業は、2.ExpressionParameterの設定と、3.FX layerのアニメーション設定、4.アバター見た目の設定です。*1

 

アバターの見た目のセットアップ

まずアバターをアップロード前or後の状態まで持っていきましょう。そこから心拍数表示を追加していきます。

 

アバターの心拍数表示対応化キットのunity.packageはここに用意しましたので、プロジェクトにインポートしてください。

omega.booth.pm

f:id:o_mega:20220324230402p:plain

OSCHeartRate_AvatarKit.packageにはすぐ使えるよう

  • 数値表示シェーダー
  • 数値表示モデル/テクスチャ
  • 数値表示アニメーション
  • ハートマークモデル
  • ハートマークアニメーション
  • セットアップ済みのU10素体版のサンプルScene*2

などが入っています。とはいえアバターセットアップはみなさんがする必要があります。早速やっていきます。

IndicatorsのprefabをD&Dして

f:id:o_mega:20220324010126p:plain

アバターの配下へD&Dします。

f:id:o_mega:20220324021351p:plain

unpack prefabもして編集可能にしておきましょう

f:id:o_mega:20220324225320p:plain

出来ました

f:id:o_mega:20220324033242p:plain

prefabのIndicatorsには、ハートアイコン(HeartIcon)と心拍数表示(Indicator1~4)4つが入ってます。初めての人はそのまま先へ行きましょう。

 

要らない表示パネルやハートマークはtransformのscaleを0にして見えなくします。より万全を期すなら、アバターの身体の中に埋め込んでも良いです

f:id:o_mega:20220324032923p:plain

見た目の整理が完了しました。この例では、足元にあったIndicator3,4のscaleを0にして見えなくしています。見た目はこれでいいでしょう

f:id:o_mega:20220324032536p:plain

 

こだわりたい人へ

Indicators/RootからIndicator1~4、HeartIconをアバターのArmatureに乗せて、位置やサイズ調整すると良いでしょう。このあたりはアバターの着せ替え、帽子やアクセサリーを付けるのと要領は同じです。

頭上に乗せたいときは頭(Head)ボーンに乗せてもいいですが、頭の動きに敏感に反応しすぎてやかましいかもしれません。そういう時は位置は頭上にしながら、ボーンは腰(Hips)や胸(Chest)に乗せるのもいいでしょう。サンプルアバターAはまさにこの作りになっていて、心拍数は頭上に設定していますがボーン上は腰(Hips)に乗っています。

下の例ではIndicator1を顔(Head)に、HeartIconとIndicator4を胸(Chest)に乗せています

f:id:o_mega:20220326012251p:plain

アニメーションの見た目確認

アニメーションが適用された時の挙動を確認します。

f:id:o_mega:20220324034029p:plain

Animationフォルダに入ってるアニメーション3つを選択し、アバターへD&Dします。こうするとアニメーションをプレビューできるようになります

f:id:o_mega:20220324034544p:plain

アバターを選択(1)して、Animationウインドウ(2)から確認したいアニメーションを選びます。タイムラインをドラッグしたり(3)、再生ボタンを押して見て、動きを確認してみましょう。

  • HR_IconBeat、HR_IconBeat2はハートアイコン2パターン
  • HR_Indicatorアニメーションは心拍数のデジタル表示

です。ハートアイコンのアニメは後でAnimationControllerに設定するとき、好きな方を選択してください

 

ExpressionParameterの設定

OSC HeartRateSenderアプリから送られる心拍数を格納するExpressionParameterを設定します。ExpressionParameterの名前は、OSC HeartRateSendersドキュメントページにあるように

  • HeartRate, Int 
  • HeartRateFloat01(ゼロイチ), Float
  • HeartRateZone, Float

の3つがあります。これを受け取れるようにアバターに設定をしましょう。

アバターを選択し、VRC AvatarDescriptorコンポーネントのExpressions枠を見ます。すでに独自のParamtersが設定してあれば、それをダブルクリックしてParameter設定を開きます

f:id:o_mega:20220324035407p:plain

U10素体版の場合は、Parameterが予め設定されていましたので、それに上記のParameterを書き足します。

f:id:o_mega:20220324035614p:plain

書き足しました。Int,Floatのtype指定を忘れずに、Savedのチェックは外しておきます。

f:id:o_mega:20220324035911p:plain

これでExpressionParameterの設定は完了です

 

ExpressionParameterが初期状態で空のアバターの場合

ExpressionParameterが設定されてないとこう

f:id:o_mega:20220324040125p:plain

この場合はCustomizeボタンをポチっとな

f:id:o_mega:20220324040621p:plain

 

では、ExpressionParameterを新規に作りましょう。右クリックからCreate - VRChat - Avatar - ExpressionParameters

f:id:o_mega:20220324040236p:plain

出来たExpressionParametersをアバターへD&DすればOK。あとは、上のParameter追加を行ってください

f:id:o_mega:20220324040409p:plain

FX layerの設定

FX layerにアニメーションの設定をし、ExpressionParameterの数値を元にアバターへ反映させる設定を組み込みます。

アバターのVRC AvatarDescriptorコンポーネントのPlayerable LayersのFXをダブルクリックして

f:id:o_mega:20220324043005p:plain

AnimationControllerを開きます

f:id:o_mega:20220324043129p:plain

Parameterの追加

Parametersタブをクリック。次に右の+ボタンを押して、先のExpressionParameter同様にIntで「HeartRate」、Floatで「HeartRateFloat01」「HeartRateZone」を追加します。

f:id:o_mega:20220324043331p:plain

追加しました

f:id:o_mega:20220324045439p:plain

アニメーションを組み込む

Layersタブをクリック。+ボタンを押してレイヤーを追加します。

f:id:o_mega:20220324043822p:plain

歯車マークをクリックして、Weightを必ず1にします(忘れがち)

レイヤー名はHeartRateIndicatorとでもしましょう。Animationsから作り置きのアニメーション、HR_Indicator.animをControllerへD&Dします。

f:id:o_mega:20220324044027p:plain

D&DしたHR_Indicator Stateをインスペクタで見ます。

MotionTimeのParameterをチェックし、ドロップダウンからHeartRate01を選びます。これで、ExpressionParameterのHeartRateFloat01の値に応じて、HR_Indicatorアニメーションを動かすことで、心拍数がデジタル表示されるようになりました。

ついでに、WriteDefaultは外しておきましょう

f:id:o_mega:20220324045533p:plain

 

もう一つ、ハートアイコンのアニメも組み込みましょう。レイヤーを追加しWeightを1に。名前はHeartIconBeatとしました

f:id:o_mega:20220324044916p:plain

HR_IconBeatかHR_IconBeat2、好きな方をControllerへD&D

f:id:o_mega:20220324044812p:plain

同じくHR_IconBeat(2)のStateをインスペクタで見ます。

SpeedMultiplierのParameterをチェック。Speedを4.25*3にする。multiplierはHeartRateFloat01を指定します

これでHeartRateFloat01の値に応じて、HR_IconBeatのアニメーション速度が早くなったり遅くなったりします

f:id:o_mega:20220324045734p:plain

以上で完了です。

普段同様にアバターをアップロードしてVRChat内で確認しましょう

テスト機能を使って、VRC内で動作を確認する

VRChatとOSCHeartRateSenderを起動します。

アバターを着替え、アクションメニュー設定でOSC Enableになっていることを確認します。HeartRateSenderの「OSC接続ボタン」を押した後、「(テスト)ランダムな心拍を送る」をぽちぽち押してみましょう。押すたびにランダムな心拍数が送られ、アバターの挙動チェックが出来ます

f:id:o_mega:20220324050927p:plain

デスクトップモードでアクションメニューを開くにはRキーを使います。OSCが送られて来ていれば、こんなOSC Debug画面が見れるはず

f:id:o_mega:20220324050807p:plain

Parameterが伝わっていれば、Debug画面ではここでExpressionParameterが書き換わるのが見えるはずです。

f:id:o_mega:20220324051304p:plain

もしOSCはVRCまで送信できているのに、アニメーションが動かない場合は、アクションメニューのOSC ResetConfigを一回操作してから、心拍送信をもう一度やってみましょう。それでもダメならUnityへ戻ってアバターの確認を。

問題なければ、心拍数表示とハートアイコンがそれらしく動くはずです。

 

その他

セットアップサンプル

f:id:o_mega:20220326012006p:plain

パッケージ同梱のU10HeartRate.sceneには心拍OSCアニメーションがセットアップ済みのU10素体が2体入っています。

  • サンプルA(画像右)、頭上にでかでかと心拍数とアイコン、左手手首に心拍数表示が入ってます。ハートアイコンはドクンドクンとした動き(HR_IconBeat)
  • サンプルB(画像左)、目の下と背中に心拍数、胸にアイコン、左手手首に心拍数表示が入ってます。ハートアイコンは点滅(HR_IconBeat2)

セットアップの参考やアイデア出しにどうぞ

これらは検証アバターワールドにも置いてあります

数字シェーダー(Unlit/numbertex)

ブタジエンさんの数字表示シェーダーをベースに改変したものになります。

f:id:o_mega:20220326123701p:plain

  • Valueの数値が3桁表示になる
  • Value5以下の時「???」表示になる

あたりが主な改変ポイントです。

f:id:o_mega:20220326124044p:plain

数字テクスチャに手を入れる場合は、下から並んでいることに注意してください。WrapModeはclamp、FilterはPoint(No filter)にするとパキッとハッキリした絵になり、オススメです

f:id:o_mega:20220326124208p:plain

FAQ

Q.アバター更新して、OSCは受信できてるのに、アニメーションが動かない

ExpressionParameterを変更した場合、VRChatのアバターOSC設定が更新されないことがあるようです。アクションメニューからConfig - OSC - ResetConfigをしてみてください*4

f:id:o_mega:20220326235705p:plain

Q.心拍数が少し(±2ぐらい)ズレる

A.残念ながら、現在の0~1のFloatアニメーションを使う方式では仕様です

Q.心拍数で条件分岐を書いたが、数値調整や他の人の心拍数に合わせるとアバター上げ直しが大変〜

A.心拍数は個人差があります。その対策として、HeartRateZoneパラメータを用意してありますので、このパラメータを元に条件分岐を書きましょう。HeartRateZone値は、OSCHeartRateSenderアプリ側で最大/最小心拍数の調整が効きます

Q.他の心拍数OSCツールでもこのアバターやpackageを使いたい

A.どうぞどうぞ、使えます。

現状のセットアップのままでも、mkc1370さんのmiband-heartrate-oscとパラメータ互換性があります*5。サンプルアバター含め、miband-heartrate-oscアプリでも同様に使えるはずです

github.com

vard88508さんのvrc-osc-miband-hrmとはパラメータ名が異なっていますが、仕組み的には同じです。アバター側でパラメータ名を揃えれば*6同じようにセットアップできます

github.com

*1:参考に、RadialPuppetを使うギミックの場合は、1.OSC送信の変わりにExpressionMenuを作る必要があります。逆を言うと、ExpressionMenuの操作をOSC送信が代行している、とも言えますね

*2:別途packageを入手してください

*3:なんで中途半端な数値なのかというと、HR_IconBeatアニメは1サイクル1秒 = BPM60なため。HeartRateFloat01は0.0f~1.0fが心拍0~255に当てているので、1.0f再生時にBPM255になるようにする = 255/60 = 4.25

*4:おそらく、C:\Users\ユーザ名\AppData\LocalLow\VRChat\VRChat\OSC\usr_xxxx\Avatars\avtr_xxxx.json ファイルが残っている様子?最近VRC内からReset操作ができるようになって助かりました

*5:同じHeartRateFloat01パラメータを使っています

*6:パラメータ名HeartRateFloat01の代わりにHeratRate2を指定する

OSC HeartRateSendersドキュメントページ

OSC HeartRateSender

開発: おめが (@Omegamega)
市販のBluetooth心拍計の心拍数情報を、OSCプロトコルを経由して、VRChatへ通知するツールです。

omega.booth.pm

要件

使い方

f:id:o_mega:20220227040228p:plain

  1. 心拍計をセットアップして電源を入れ装着する。VRChatを起動する
    1. (bluetoothペアリングは不要です)
    2. VRChatアクションメニュー(メニュー長押しorキーボードR)から、OSC Enableを選択しておく
  2. OSC HeartRateSenderを起動する
  3. 「BLE心拍計に接続する」ボタンを押す
  4. 数秒待つと接続が確立して、デバイス名と心拍数が表示される
  5. 「VRC OSCに接続する」ボタンを押す
  6. VRChatに心拍数が送信される(VRC内ではOSC Debugで確認可能)

参考動画

 

心拍計がない場合は、「VRC OSCに接続する」ボタンを押した後、
「ランダムな心拍数を送る」ボタンでVRChatへの送信テストをすることが出来ます。
アバターアニメーションテスト等に使えます

bluetoothLE

接続方式にbluetoothLE(bluetooth4.0)を利用しています。
bluethooth3(bluetooth Classic)以下とは互換性がありません。必要に応じてbluetooth4.0以降のドングルを購入してPCに追加してください

 

bluetooth心拍計の選択について

BT接続して心拍を取れてスマホ連携できるスマートウォッチはたくさんありますが、BLEの心拍プロトコルを実装してないことが多く、残念ながら使えない可能性が高いです。
スポーツモードを謳い、stravaやruntastic、wahooなどのスマホアプリ連携(リアルタイム)を売りにしていれば使える可能性があります*1。デバイスで問題なく使えたものがあればリストに追記しますので、教えてくれるとありがたいです

◎動作確認済み

○たぶん可能

  • Wahoo TICKR/TICKRx/TICKRfit
  • Polar Verity Sense/H10/OH1
  • CatEye HR-12
  • Garmin HRM-Dual
  • Coospo/XOSS/iGSPORT等のアームバンド型心拍センサーまたは胸ストラップ型心拍センサー

筋電位・胸ストラップ型の方が一回り安いですが、装着が面倒/ベルト耐久性に難があるためおすすめしません。光学式・アームバンド型が楽でおすすめです。

✕たぶん非対応

残念ながらBTスマートウォッチの多くはBLEでの心拍送信を機能がないことが多いです。対応機種を見つけましたら、お知らせください

✕非対応(動作しないことを確認済み)

  • Xioami Mi band4,5

Mi bandシリーズは独自のプロトコルがあるようですが現時点では、このアプリは非対応です。Mi bandをお持ちの方は、mkc1370さんの実装例がありますのでそちらをどうぞ

 

単にBLE心拍計の動作チェックをしたい場合、スマホがあればWhaoo fitnessアプリがおすすめです

https://jp.wahoofitness.com/fitness-apps

 

アプリから送るOSCデータについて

本アプリでは3つのAvatarParameterを送信しています。
これらのパラメータをAvatar3.0のExpressionParameter、FXレイヤーなどで処理することにより、アバターの表示を変化させたりできます。

単に通知されていること、挙動を確認したい場合は、VRChatのアクションメニューからOSC Debugをオンにすることでパラメータを確認することができます。「ランダムな心拍数を送る」ボタンも使えるでしょう

/avatar/parameters/HeartRate, Int

Int型の心拍数です。0~256。本人の体質や年齢、運動負荷や個人差によりますが、概ね45~200ぐらいの範囲に収まるはずです

/avatar/parameters/HeartRateFloat01, Float

Float型の心拍数です。心拍数の0~256を0.0f~1.0fに割り当てています。Animation StateのMotionTimeやSpeedに使うことを想定しています。
アナログメーターの針が動くアニメーション等と組み合わせることで、心拍に応じて動かすことができるはずです。

心拍表示サンプルアバター(U10素体版)では、このパラメータを使って心拍数の表示と、心臓風キューブモデルのアニメーションをさせています

/avatar/parameters/HeartRateZone, Float

HeartRateZone領域でクロップされた心拍数です。
HeartRateZone設定が60~120の時、心拍数が60なら0.0f、心拍数が90なら0.5f、心拍数が120なら1.0fを返します。

人間の心拍数は本人の年齢や体質で異なります。運動負荷や緊張状態に応じて、割と細かい範囲で上下するため、使う人に応じてアバターの挙動が変わる心拍数帯は調整したい所です。
ですが、その調整をアバターに乗せるのはいささか面倒ですから、ツール側で対応可能にするためのパラメータがこれになります。

HeartRateZoneは「その人の安静時心拍数(50~80)」から「その人の最大心拍数(220-年齢)」を設定することを想定しています。(ユーザー年齢20歳~40歳を想定し、初期値は60~180としています)

 

スポーツでは心拍計を使って運動負荷を調整する「心拍トレーニング」と呼ばれる手法があります。これを参考に個人の年齢/体質に寄らない形で、「がんばり」「運動の負荷/つらさ」を表現する指標として導入しました。

心拍トレーニングの一例としてガーミンでは心拍数のゾーンをこういう分類になっています。

が、VRCで激しい運動をと言っても、狭い部屋を使う運動ですから、おそらくガーミンの指標ではゾーン3~4あたりが上限になろうと思います

最大心拍180(年齢20~40歳想定)の場合、108~125がゾーン2、126~144がゾーン3(有酸素)、145~162がゾーン4(無酸素)。OSC送信されるHeartRateZone値では、0.40~0.54がゾーン2、0.55~0.70がゾーン3、0.71~0,85がゾーン4となります。

 

これを元に、アバターギミックはHeartRateZone、0.4(ちょっとした運動、緊張)~0.7(有酸素運動の限界)のしきい値を条件に動くように組むと
良い感じに振る舞い、ユーザーも心拍ゾーン設定だけで心拍調整が効くはずです。

 

別の使い方として0近くで、睡眠、または睡眠に近いリラックス状態をトリガーにすることもできるでしょう、多分。

 

心拍表示サンプルアバター(U10素体版)では0.4~(赤オレンジ)、0.55~(青紫)、0.7~(緑青)のそれぞれのゾーンで身体からパーティクルが出るようになってます。

対応済みpublicアバター

ここに心拍表示サンプルアバター(U10素体版)があります。このアバターは製作者の火事屋さんの許可の元public化をしています

https://vrchat.com/home/world/wrld_eea39796-5836-4099-98da-4815e16696bd

 

機能としては主に2つ

  • HeartRateFloar01を元に心拍数を表示
    • ±2程度誤差が出ますが現状仕様です
  • HeartRateZoneを元にパーティクルを表示
    • 0.4~(ゾーン設定が初期値の場合、心拍108)で赤パーティクル
    • 0.55~(心拍126)で青紫パーティクル
    • 0.7~(心拍144)で緑パーティクル

パーティクルのみ、アクションメニューよりオンオフできます

FAQ

Q.心拍計がそもそもちゃんと動くのか、PCと繋がるのかが分からない。心拍計のみ、心拍計とPCの接続できるか調べたい

A.スマートフォン(iPhone/Android)があればWahoo fitnessアプリで、心拍計のペアリング/動作確認が出来ます

WindowsPCからは設定の「bluetoothバイスとその他のデバイス」を開き、検出可能か確認します(ペアリングの必要はありません)

f:id:o_mega:20220227162552p:plain

バイス追加を押して、心拍計が出現するようであれば接続可能です


Q.bluetoothに接続が切れた時に、再接続したい

A.現時点で再接続する手段がありません。本アプリを再起動して接続しなおしてください
(VRChatの再起動は必要ありません)

Q.OSCの接続が切れたときに、再接続したい

A.「VRC OSCに接続する」ボタンを押してください。OSCは再起動なしに再接続できます

Q.心拍計を複数持っていて、使う心拍計を選びたい/別の心拍計に接続してしまう

A.申し訳ないですが、現時点で選択UIがありません。
先に接続されるかどうかは現時点ではランダムなため、接続時に表示されるデバイス名を確認の上、違う心拍計に接続した場合はアプリを再起動して、改めて接続を試してください。
使わないデバイスをオフにできるならオフにしましょう

Q.心拍数の数値が、VRChat内アバター表記やOSC HeartRateSenderで少し(±2程度)ズレて表示されてしまう

A.現状では仕様です。

現状のHeartRateFloar01パラメータを使っている場合、ExpressionParameterからAnimationを経由し、更にシェーダーで処理させている都合、誤差が出やすくなってしまっています。これについては工夫の余地があると思います。

また、現状のExpressionParameterのFloat値の同期について、公式ドキュメントによると8bit(minifloat)しかないため、符号を除いた128段分しか解像度がありません。上記同様、このあたりも精度が必要であれば改善の余地がありそうです。

Q.設定を初期値に戻したい

A. C:\Users\ユーザ名\AppData\Local\OSCHeartRateSender\OSCHeartRateSender_Url_ほにゃらら\1.0.0.0\user.config にある設定ファイルを削除してから、アプリを起動してください。

または以下の設定値を参考にどうぞ

  • LocalPort 0
  • RemoteAddress 127.0.0.1
  • RemotePort 9000

免責事項、問い合わせ

当アプリを使用して発生した問題や損害について、開発者のおめがは一切責任を負いません。自己責任の元、ご利用ください
その他、問い合わせは、私おめが(VRChat Omegamega / Twitter:@Omegamega / booth https://omega.booth.pm/)までどうぞ。

バージョン履歴

  • 20220304 初版(だいたい動くしリリースしちゃおうぜ)
  • 20220319 ハートレートゾーン、接続ポート情報などの設定を保存するようになりました

ソースコード権利情報

Rug.Osc
Copyright (C) 2013 Phill Tew (peatew@gmail.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

*1:webアプリのstravaへの連携を謳うデバイスは、予想に反して取れない可能性があります

Avatar3.0の仕組み解説

VRChatのAvatar3.0の、主にエンジニア向けの、仕組みから理解したい人むけ解説。OSCも来たからついでに*1

公式ドキュメントはここ。できるだけ間違いがないよう書いているつもりだが、ミスっていたら教えて欲しい

Avatar2.0時代

Unityで3Dモデルを動かすにはAnimatorとAnimationを使うのが良い、というセオリーに則り、アバターには決め打ちの固定のAnimatorが入っていて、それでもって表情やらEmoteやらGesture(ハンドサイン)やらを出していた。

ユーザーの自由度としては、AnimatorにセットするAnimationのみを編集できる。ので、自由度としては限界が出てくる。

例えば

  • 目パチを制御する方法がない
  • アイテムの出し入れが出来ない
  • それらの状態を同期したり/保存する方法がない
  • Gesture/Emoteより複雑な制御ができない

といった問題、拡張性の乏しさが目につくようになった。*2

という所で、出てきたのがAvatar3.0だったわけです。*3

Avatar3.0の基本思想

ということで、Avatar3.0の思想はこれらの問題点、制限を減らすことを意識して設計されているようだ。

f:id:o_mega:20220220225047p:plain

具体的に一番大きいのは、アバターのAnimatorが編集可能になったこと。これにより、複雑な制御が自由に作れるようになる。UnityのAnimator標準機能でAnimationを合成したり条件分岐してAnimationを再生すれば良い。

次にExpressionParameter。これは前述の同期できない問題に対する回答。基本的にはParameter変数を入れておく場所。同期して欲しいパラメーターをここに書くと、すべてのクライアントに同期され、前述のAnimatorを動かす。ついでにローカル保存もできる。OSCで入出力できるのもここ。*4

最後はExpressionMenuだ。ExpressionMenuはExpressionParameterをVRChat内から編集する手段だ。オンオフが設定できるToggle、0~1の無段階スライダ(Radial)、2軸4軸のPuppet、多段メニューを実現するSubmenuなどが設定できる。

 

基本的にはこの3つを把握していれば良い、はずだ。*5

AnimatorとPlayableLayer

公式ドキュメントはここ

まずちょっとややこしいのだが、UnityのAnimatorのLayerと、Avatar3.0のPlayableLayerは別モノなので注意。

f:id:o_mega:20220220204637p:plain

UnityのAnimatorにあるLayer

f:id:o_mega:20220220204745p:plain

Avatar3.0のAvatarDescriptorにあるPlayableLayerの設定(実体はAnimator)

全部乗せのAnimatorを編集するのは大変だから?かAnimatorを分割し、用途と挙動別に5レイヤーに分けている。Base、Addictive、Action、Gesture、FX。

ボーンを動かす(無理やりポーズを変えるような)アニメについては、ヒューマノイドボーン(腕とか足とか)と非ヒューマノイドボーン(ケモ耳とかしっぽとか)でまた扱いが異なる

  • Base、基本的な挙動を入れる所。AFKとか椅子へ座るとか
  • Addictive、Baseに常時"加算で"追加される。ヒューマノイドボーンを動かしたいときに使うレイヤー。具体例としては呼吸で胸が上下するアニメ等。
  • Gesture、非ヒューマノイドのボーンを動かす時に使うレイヤー。transformのみ有効。具体例としてはケモ耳やしっぽを動かす等。
  • Action、発動時に"Overwrite"が強制されるレイヤー。Avatar2.0時代のEmoteアニメ、プレーヤートラッキングを無視して動くダンスとかを入れる用途
  • FX、その他を入れるレイヤー。重要。表情ブレンドシェイプはここ

と別れてる。

よくVRChatterがやりたい、「ジェスチャーで表情を変えたい」「アイテムの出し入れをしたい」であれば全部FXレイヤーに入れる、で良い。

f:id:o_mega:20220220200744p:plain

こんなの編集したくねえ筆頭のBaseLayerのテンプレート遷移図

そして、それらAnimatorのテンプレートは全部SDK3に最初から用意されている。

f:id:o_mega:20220220210634p:plain

VRCSDK3>Example3>Animation>Controllersにテンプレが入ってるのでコピペして使おう

また編集不要なレイヤーについては最初の画面のようにDefaultのままで良い。特にBaseなんかはAFKアニメを差し替えたい、ぐらいしか要望はないと思われる。普通触らなくて良し、AFKを差し替える場合でも用意されてるテンプレートをコピーして差し替えるのがいいだろう。

 

FXレイヤーを作る場合、ジェスチャー分岐遷移図が書かれているvrc_AvatarV3HandsLayerをコピってやる

f:id:o_mega:20220220211203p:plain

vrc_AvatarV3HandsLayerには両手ジェスチャーに応じてアニメを再生するシンプルな遷移図が用意されている

あとはここの各ステートに、SDK2の時同様の表情Animationを作って設定すれば良い。出来たFXレイヤーをVRC AvatarDescriptorのPlayableLayer-FXLayerにセットすれば、基本的には完成だ。

表情アニメの作成はUnityEditor手打ちでもいいが、自分はがとーしょこらさん作のVRCAvatarEditor betaを使っている。さっくりblendshapeで表情パターン作るのが早い

前の記事にも書いたが、このままだと表情がIdleにもどり切らなかったので表情を戻すアニメを作り、FXレイヤーの一番上に加えている(Idle上書きアニメの設定)(参考記事・Avatars3.0で表情が戻らない現象の直し方 決定版 - プラナリアのメモ)

f:id:o_mega:20220221002556p:plain

defaultにはすべての表情blendshapeを0にするAnimation(Idle上書き)が入ってる

 

アイテムの出し入れや、着せ替え等より複雑なことをしたい場合、作ったFXレイヤーに手を加える。Parameterをアイテムのオンオフ値なりを追加して、そのオンオフ値を見てアイテム出現/消失アニメを設定するという形になる

f:id:o_mega:20220220212235p:plain

AnimatorのParametersはここにある

アバターの挙動のややこしさを全部Animatorにぶつけ、それをある程度切り分けつつもユーザー編集可能にする、がAvatar3.0の基本設計思想と思われるので、UnityのAnimatorを理解するのがAvatar3.0を理解する一番のキモだと個人的には思う*6

VRC組み込みで存在するAnimatorParameter

公式ドキュメントはここ

Parameterの中にはExpressionParameterに書かなくても使えるパラメータがある。これはVRChatシステム側が提供してくれるパラメータで、例えばプレーヤーがコントローラやキーボードから行うジェスチャ操作などがそれに当たる。移動やプレーヤーがVRモードで遊んでいるか、3点トラッキングか4点かフルトラか、ジャンプ状態か、など色々な状態が取れる。

Animatorプラスアルファ

以上のAnimatorの機能でだいたい機能は足りるのだが、それだけでは実現できないものがちょっとある。それらを補助するのが以下のコンポーネント群で、これはAnimatorStateに追加する形で使う

その一つが、特定Animation中だけ目パチを止めたり、口パクを止めたりといったもので、これはVRCAnimatorTrackingControlからできる。

f:id:o_mega:20220220224315p:plain

VRCAnimatorTrackingControlはAnimatorのステートからAdd Behaivourする

前記事でも書いたが、Trackingにするとトラッキング(口パク等)かVRCシステム(目パチ)を優先、AnimationにするとAnimationで定義された動きを優先するようになる。口を閉じたアニメや、目を閉じたアニメではそれぞれAnimationを選択しておくと良い

公式ドキュメントはここ(の一部)

ExpressionParameter 

上で作成したFXレイヤーAnimatorにはカスタムすればいろんなParameterが追加されているはずだ。これを同期して、他のプレーヤーにも見えるようにするのが、ExpressionParameter

f:id:o_mega:20220220213750p:plain

プロジェクトウィンドウを右クリックして新規作成できる

といってもそんな複雑なことはなく、FXレイヤーに作ったParameterの名前とtypeを書き並べればOk。savedにチェックをつければワールド移動やVRChatを再起動しても残る。

f:id:o_mega:20220220214153p:plain

Add/DeleteとかUI違うと一瞬ビビるよね?

ちなみにOSC経由で操作できるパラメータもコレ

ExpressionMenu

公式ドキュメントはここ

上で作成したExpressionParameterをVRC内から変更する方法。

新規作成する方法はExpressionParameterと同じ。あんまり複雑ではないのでポチポチ触ってみるのが早いと思われる。メニューにControlsを追加ボタンやらラジアルを設定し、上のExpressionParameterのどの値を操作するかを設定する

f:id:o_mega:20220220215318p:plain

UIを選んで、対応するExpressionParameterの名前と型を書いていく

まとめ

とにかく重要なのがAnimatorの理解、特にFXレイヤーを作れるかどうかがキモ。とはいえ、普通に使う分、SDK2相当のセットアップにはSDK内のvrc_AvatarV3HandLayerのコピペでよい。先を作ってみたくなったら、その改造から始めるのが良いと思う。

最初にFXレイヤーを設定できれば、後は、そこで使うParamatersをExpressionParameterに列挙し、ExpressionMenuにUIを並べて同様にParameter名を並べればだいたい*7作れると思う

  1. AvatarDescriptorを付けた+ViewPoint設定しただけのアバター
  2. そこにvrc_AvatarV3HandsLayerをコピって、FXレイヤーに設定する。それぞれのジェスチャーに顔アニメを設定、Idle表情を上書きするAnimationLayerを追加する

というのを実際に手順にしたのが下の記事なわけです

VRChatアバター3.0を雑セットアップするオレオレワークフロー2022版最新版 - おめが?日記_(2)

*1:betaに来た

*2:目パチ制御については元怒さん作のNoBlinkSetter(公開終了につきケーキさんのガイド記事をリンクしています)、Emoteを使ってたInventryシステムなどが過去あった。が、いづれもAnimatorを多段で重ねた際に動くトリッキーな仕様に基づくもので、黒魔術的です。

*3:ただ、この2020/8の紹介記事で書かれているように、3.0でやろうとしていることの一部しか実装されていない。OSCとSoon™のPhysicsBone含めてもまだ追加が予定されている?ようだ

*4:これは推測だが、今後予定されてるアバターコライダーも判定が情報がここに飛んできそう?

*5:はずだ。というのはVRC公式ドキュメントにあるように幾つかすでに知られたバグがあったり、UnityAnimatorコンポーネントの怪しい挙動などはそれはそれとしてあるため、バッドノウハウが不要になったわけではない。適時聞いてググって調べる必要はまだまだある

*6:が、公式ドキュメントにも度々書いてあるやんけ

*7:表情が戻らないとかの怪しい挙動を除けば

VRChatアバター3.0を雑セットアップするオレオレワークフロー2022/8月版

あくまで自己流で。メモ書き程度に。

SDK2相当程度かつ、SDK3 Avatar3.0であれこれ遊ぶ*1にの十分なベースシャーシを作る感じで。

  • Avatar3.0アバターとして着用できる
  • SDK2相当以上の表情が使える(FXレイヤーのセットアップ)
  • PhysBone対応 [2022/08/09追記]
  • SPS-i対応[2022/08/09追記]
  • VRChat CreatorConpanion(VCC)を使う[2022/12/17追記]

 

今回例に使うアバター

booth.pm

です。正確にはUnity2018 & SDK2時代にカスタムしたこうめちゃん。

既存のAvatarを新プロジェクトへ持ち出す

SDK2からの移行したい場合、VRMからセットアップする場合

既存のプロジェクトがあるなら、そのシーンごとExport packageして新しいプロジェクトに持っていくと楽。古いプロジェクトはバックアップも兼ねるし、Unityエディタバージョンを上げるときでも安心、不要なデータを(あまり)持ち出さなくて済む。

アバターが1体だけなら、そのアバターをprefab化してそれをexportしてもよい

VRMの場合は新しいプロジェクトにそのままUniVRMとVRMを突っ込めば良いはず。その後、VRM関連のコンポーネントを削除しておく

f:id:o_mega:20220210040155p:plain

Export packageするときに注意するのは、VRCSDKを外すこと。チェックを外してexportに含めない。他に不要なモノがわかれば外して、余計なものの持ち出しが減る

f:id:o_mega:20220210040622p:plain

Packageが出力されるので、旧プロジェクトは閉じてよし。新プロジェクトでImportできて、シーンが見れればOK

アバターの基本セットアップ

VRChat CreatorConpanion経由で新規プロジェクトを作る

[2022/08/09追記]

vcc.docs.vrchat.com

5月にVRChat開発者向けのCreatorConpanionがbeta始まった。これはUnityにおけるUnityHubのようなものを、VRChat専用にした感じのものだ。VRChatのワールド/アバタープロジェクトをまとめて管理したり、SDKのバージョンアップやUdonSharp、ClientSimulatorなどの一括インポートやアップデート更新を自動化してくれる。新規プロジェクトを作ったり、既存プロジェクトをVCC管理へ移行する(migrate)機能もある

今回はこれで新規プロジェクトを作ってみる。

と言っても複雑なとはなく、左メニューのProjects - newを選び、TemplatesからAvatarを選択、プロジェクト名とフォルダ決めるだけだ

あとは、OpenProjectを選べばUnityEditorが開いていつものように始められる

従来の方法で、新規プロジェクトを作る(非推奨)

VCCを使わないでプロジェクトを作るならいつもの通りだ

VRChat公式の示すCurrentVersionのUnityで新規プロジェクトを作る。VRCSDK3を公式からインポート。DynamicBoneやシェーダーなどの必要なものもインポートしておく*2

[2022/12/27追記]

VRChat 2022.3.1p2 の警告(warning)にあるように、VRChatはunitypackageでのSDK配布を辞め、VCCでの更新に一本化する予定にある。そのため、従来方法での新規プロジェクトは早々に使えなくなるハズだ。

VCCから新規プロジェクトを作るようにしよう。

 

[2022/08/09追記]

自分は試してないが、DynamicBoneを持ってない場合は、後述するPhysBone設定をDynamicBone使ってるprefabから生成してくれるツールもあるようす。

SDK2用アバターを買っていて、新たにAvatar3.0仕様で仕立て直したい時、とかには有用そう

booth.pm

何はともあれDescriptor

AvatarDescriptorを付ける。

SDK2からImportした場合は、Missingになってるコンポーネントがあるので削除。VRMから来た場合はVRM関連のコンポーネントを削除したり、素のFBXモデルを持ってきた場合はリグ設定がHumanoidになってるか確認しよう

f:id:o_mega:20220210041350p:plain

 

ViewPoint、LipSync、EyeLook、Eyelidsの設定

ViewPointはEditを押してScene上でぐりぐりするだけ。SDK2なりのセットアップがあればそれをコピペする、SDK2より操作しやすくなった…。基本的には目と目の間、鼻筋に埋め込むように設定する。が、頭が極端に大きいデフォルメキャラだとそれより奥に押し込む方が姿勢が自然になるかもしれない。

 

LipSyncは、おそらく日本語圏の販売アバターはVisemeBlendShapeを選べば良さそう。アバターの顔のMeshを設定すればだいたい勝手に設定される…?されなかったらソレらしいシェイプで埋める。それでもなければ代用して埋める。「最低限、sil、aa、thを作るだけでもそれなりにしゃべって見えるようになります」らしい

EyeLookのMovementは性格付け程度の話なので一旦デフォで良い。落ち着きCalm←→活動的Excited / 内気Shy←→自信家Confident。ボーン設定があればEyeBoneを入れ、移動制限が欲しい場合はRorationStatesを決める。目のボーンがないアバターもそれなりにあるのでない場合はそのまま無視して良い*3

f:id:o_mega:20220210041611p:plain

EyeLidsはまぶたと目パチ。Mesh指定して、目を閉じてる時のBlendshapeを指定すると目パチが動くようになる

 

これでとりあえず動いてアバターとして着用できるようになる。VRC SDKウインドウ→Builder→Build&Publish。モデル検証ならこれで十分。Welcome to VRChat

クソ大変表情FXレイヤーを作る

Avatar3.0の一番の大変ポイント。PlayableLayerを設定してジェスチャー操作と表情アニメを紐付ける。AnimatorをいじってFXLayerを作り、表情アニメーションを設定する。

ここでは楽をするために、SDK3に付属するHandLayerテンプレートをコピって改造し、FXLayerとして使う。FXLayerはボーンの動き(transform)を伴わない、あらゆる変更を突っ込め、と公式も言ってる。ので、表情だけでなく、パーツの出し入れ、マテリアル変更とかいわゆるVRChatterが一番やりたがるものはFXLayerに入る、で良い。

 

FXLayerの土台準備

便利なテンプレート素材として、VRCSDK/Example3/Animation/vrc_AvatarHandLayerが提供されているのでコピる*4。このHandlayerにはジェスチャーであれこれアニメさせるのに、便利なステート/遷移図がもう出来てるのだ名前はFXLayerとかにする

 

f:id:o_mega:20220210043225p:plain

このFXLayerをAvatarDescriptorのPlayableLayersのFXに設定

f:id:o_mega:20220210043855p:plain

表情アニメを作る

がとーしょこらさん作VRCAvatarEditorを使って表情アニメを作っている。というのも複数SkinnedMeshRendererのblendshapeをあわせてレビューしつつ確認できるのが便利。

gatosyocora.booth.pm

f:id:o_mega:20220210043606p:plain

Blendshapeをいじって表情を作ったら、Filenameを決めてCreateAnimFileすると表情アニメファイルが出来る。下のチェックは外しておいた方が良いかもしれない。Layerへの設定は後で手作業設定するため。

ちなみに、このVRCAvatarEditorにはMeshRendererのProbeAnchorをまとめる機能*5もあるので、ついでにやっておくと良し

FXLayerにアニメを設定する

上で作ったFXLayer Animatorを開く。Animatorウインドウを見る*6

LeftHandLayer、RightHandLayerのステートFist、Open…それぞれに上で作ったアニメをそれぞれ設定していく。それぞれのステートをクリックした後、インスペクタでAnimationをドロップして設定する。表情が不要なステートはそのままで良い*7

f:id:o_mega:20220210044224p:plain

それぞれのステートを見ていく。

[2022/08/17追記]

Write Defaultsはオフにしよう。公式でも紆余曲折あったが、Write Defaultsは表情がそれぞれのクライアントで一致しない可能性が出てくる設定となった。*8でより問題が拡大する可能性があるようだ

Add BehaivourしてVRC AnimatorTrackingControlを付ける。目パチをオフにしたい表情では、TrackingControlでAnimationをチェック。リップシンク切りたい場合はMouth&Jawを同様にAnimationをチェックすれば良い*9

f:id:o_mega:20220210044352p:plain

表情戻すアニメ対応、あるいはWriteDefaultsオフ問題

これでできたか、と検証したら「表情戻らない問題」が起きたので、対策を入れる。これはWriteDefaultオフによるものだ。対策はこの記事が分かりやすい。

inplanaria.hatenablog.com

FXLayer Animatorにレイヤー追加して、Weightを1に。VRCAvatarEditorで無表情アニメを作って、上のレイヤーに設定、WriteDefaultオフ。レイヤーの一番上に持ってくる

f:id:o_mega:20220212164003p:plain

 

理屈としては、優先度最小(Animatorエディタで一番上に並んでる)のレイヤーで無表情アニメを流し続ける、ようす。Left Hand/Right Handレイヤーで表情アニメが流れればそちらが優先され、表情アニメが解除されれば優先度最小アニメが実行されて元に戻る。

より詳しい説明を読みたい人は同じ作者のこの記事を読もう*10

inplanaria.hatenablog.com

PhysBone対応

[2022/08/09追記]

PhysBoneが4月に来ていた。ババーン。

PhysBone(PB)とはDynamicBoneの置き換えだ。DynamicBoneより動作が軽く、触ったり触られたりできるし、ビヨーンと伸ばして固定とか、さらにその状態をExpressionParameterやOSCでいろいろできる。すごい。

 

強気のVRChat運営はいきなりDynamicBoneを全部止めていて*11、DynamicBoneを含むアバターは自動的にPBへ変換される、何もしなくとも動くといえば動く。まあその動き方はDynamicBoneと結構違ったりするけども。

なのでDynamicBoneそのままでもアバターアップロードはできるか、そうはそうと現代的にしたい。VRC SDKにはありがたいことにPB自動変換ツールが付属するのでそれを使おう。

 

アバターヒエラルキーで選んだ状態にして、メニューからVRChat SDK - Utilities - Convert DynamicBones To PhysBonesを選ぶ

「DynamicBone全部消してPhysBoneにするよ。それっぽいパラメータにはするけど動きは一致はしないよ。この操作は戻せないよ」と言われるので、Proceedする

と、するとDynamicBoneがPhysBonesに置き換わります。やったね。

とはいえ、結構味付けが異なるので、しっぽとかが無限にびよびよして止まらなかったり、スカートが貫通したり…、とかは各自設定値頑張ってほしい

 

 

設定値の参考はしぐにゃもさんのブログがgifアニメ付きでとてもわかり易い。幽狐さんかわいい

signyamo.blog

 

PB新機能。手っ取り早く触ったり掴んだり固定したりするなら、Radiusを0より大きくすると接触できるようになる。Allow Grabingで手で掴めるように、Allow Posingで掴んでからトリガーで固定できるようになる。髪の毛に寝癖とか付けたい人はPosingをオンにしよう

 

ちなみに、DynamicBoneからPhysBone移行に伴い、PCでの揺れものの制限がかなりゆるくなっている。DBからPBに移行するだけで、AvatarPerformanceが上がるケースもある様子

また、制限は厳しいもののPhysBoneはQuestでも有効。Questでも揺れものが楽しめるようになったぞ。対応アバターはまだ少ないと思われるが、いろいろ工夫する余地があるかもね

SPS-i対応

[2022/08/09追記]

これまた4月になされた告知

(おめががダイジェストで意訳)

Unityの次バージョン(2020)ではSPS-iのシェーダーバリアントが必要です。今回のSDKからSPS-i対応シェーダーバリアントをコンパイルようにしました。Unityバージョンに必要な処置はこれだけではないですが、重要なステップです

 

リエーターへ。SDKを更新してください。そうしないと今後のUnityバージョンアップで、コンテンツが壊れてしまいます。

再アップロードが必要です。SDKをビルドした後にシェーダーエラーが出る場合は、SPS-iをサポートしてないシェーダーが原因です

とのことでUnity2020へ生き残るために必要な対応だ

ざっくりいうと、

  • シェーダーをSPS-i対応のものに更新する
  • SDKを最新にする
  • アップロードし直す

をする必要がある

 

さて、問題は自分の使ってるシェーダーはSPS-i対応かどうかだが、それはシェーダー配布元を当たろう。

 

 

VRChat内で大きなシェアを誇る、ユニティちゃんシェーダーことUTS。他のシェーダーに遅れること、6月にSPS-i対応のv2.0.9がリリースされた。ユニティちゃんのページでは、更新が遅れているのか2022/8月現在、一つ前のv2.0.8が最新になっているため、注意しよう。SPS-i対応版はv2.0.9だ。これをダウンロードして、プロジェクトに取り込めば良い

github.com

 

開発な活発で最近話題になりやすいシェーダーとしてはlilToonがある。lilToonにはUTSからのかなり精度のよいマテリアルコンバータが提供されているので、UTSからいっそ乗り換えるのも一つだ。

booth.pm

 

他にもUnlit_WF_Shader、poiyomiなど、VRChatコミュニティ寄りのシェーダーも開発が活発で早くからSPS-i対応をしており、この辺も心配はない。

github.com

www.poiyomi.com

 

もちろんUnityビルトインやSDKのシェーダー、VRChat/Mobile、Standardなどは気にしなくてよいだろう。SDKを最新にしてアバター/ワールドをアップロードし直そう

完成

完成だと思います

f:id:o_mega:20220210040039p:plain

できたと思ったら、SDK2にはあったこうめちゃんの耳としっぽが表情連動しないやん… ということで、それはまた別で頑張る必要があることがわかった!

 

それはさておき、2.0時代のセットアップに近い、素に近いAvatar3.0がセットアップできたはずだ。プレーンなFXレイヤーのセットアップができたので、この上に持ち物の出し入れやVRCLens/VirtualLensの様な拡張、最近話題のOSC連携、Contact含むAvatarDynamicsの導入もできるようになった。Unity2020のカタストロフィックなアップデートにも多分、耐えられるであろう。よしよし

*1:カメラ拡張とかモノを出し入れしたりとかする

*2:と、SDK2プロジェクトのDynamicBone設定を引き継げて便利

*3:こうめちゃんには目のボーンはなかった

*4:Unity上だとCtrl+Dで複製が出来る

*5:MeshのProbeAnchorの位置がバラバラだと、ワールドのLightProbeから拾う光がMeshごとに変わってしまい、パーツごとに明るさが違う現象が起きる。よくあるのが場所によって顔とボディの明るさが違うケース

*6:Animationではなく

*7:初期設定されているproxy~.animはVRC内のデフォルトアニメーションが適用される設定

*8:今後実装予定のHide by Distance機能によって同期されなくなる話があったが、8/16のDeveloperUpdateで方針転換/仕様変更がありWrite Defaults オンでも一応問題はなくなった。Developer Update - 16 August 2022 - Community Updates - VRChat Ask。とはいえ、最近のドキュメントでは Avatars 3.0 WriteDefaultsはオフが推奨されている

*9:Trackingにすると、フルトラやリップシンクなどのユーザー操作や、目パチのようなVRCシステム機能で動く。Animationにすると、アニメーションデータで上書きされる。という理解で良い

*10:なんでこんなクソややこしい機能があるのか、というのは恐らくUnity側が便利だろうと実装してみたが実際はややこしくなってしまい、なまじ使われているので消せない機能になっているようす?なのでUnity側も困ってるしVRC運営も困ってる機能と思われる。Lose-lose-lose悲しいね…

*11:一応、ローカルだけPhysBoneの代わりにDynamicBoneを使う設定はあるが

テトテコネクトとダンス音ゲーと譜面UI

ダンスゲーがDanceDanceRevolution(コナミ98年、以下DDR)でヒットしてから、センシング技術が進歩しダンスゲーもそのセンサーの進化に合わせて色々とリリースされた。ということでその辺の独自研究を書きつつ、テトテコネクトの話をしよう

DDR、ボタンが少なく譜面はシンプルだった

DDRはコントローラスイッチをデカくして踏ませることでコントローラを装着せず、プレーヤーに踊らせることに成功した。スイッチは左/後/前/右の4箇所*1

床スイッチということで上半身の踊りを取ることはできないが、それでもボックスステップのようなステップがある程度再現でき、軸足と重心移動が大切なのはダンスを思わせるには十分な"それらしさ"が作れたと言ってもよいだろう。高難易度譜面が地団駄となったとしても

譜面UIとしてはコナミビーマニ特許通り、ノーツが上下へスクロールするものだった。譜面のX軸がボタン、Y軸が時間に対応するのは、ピアノロールに近く非常にわかりやすい。一方で後/前というボタン配置がX軸に揃えられてしまい、直感的でない問題があったが、まあ後のことを考えれば十分シンプルだろう。

youtu.be

 

コントローラを手に持っているが、ポーズが重要という点ではサンバDEアミーゴ(セガ99年)も全身ダンスゲームに含めてもよいかもしれない。

マラカスコントローラをそれぞれの手に持ち、左手/右手に加え、振る時の掲げた位置(高い/中央/低い)も判定される(2x3の6箇所)。

こちらはコナミ特許を回避する都合か、中央から外へ向けてノーツがスクロールするタイプである。この譜面UIは同じセガのMaimai(セガ2015年)へ継承されている

youtu.be

 

接触センサーで全身ダンス、ビーマニ式譜面ながら振り付け動画を流したPPP

コントローラを身に着けない全身ダンスゲーとしては、DanceManiaX(コナミ00年、以下DMX) *2ParaParaParadise(コナミ00年、以下PPP)が初めてではないだろうか。

赤外線センサーを使い、特定の場所を遮るとボタンがオンになる。要はDDRの踏みスイッチを赤外線レーザーセンサー *3 に置き換えた仕様だ。レーザー判定はDMXが(左/右)x(上/下)の4箇所、PPPは左/左前/前/右前/右の5箇所。そこを手なり足なりで遮るとノーツ判定が走る/ボタンが押されたことになる

譜面UIはビーマニシリーズということもあり、スクロール方向切替機能が増えたりはしたものの、そのままDDRの仕様を継承している。X軸にノーツ種別を並べ、Y軸を時間軸として、ノーツが流れてくる。DDRと違い、特にPPPは前後ボタンに相当するものがないことで比較的混乱は減った気がしなくもない*4

 

ただここで、PPPは先進的なことをしている。譜面UIの背景に、avexと組んだ実写のパラパラムービーを流しており、その通りに踊れればゲームでも高得点が概ね取れる、という所だ。今までのダンス音ゲーは楽曲を共有することはあれど、振り付けが一致することはなかった*5

youtu.be

ダンスゲームといつつダンスらしくなかったダンス音ゲームと、実際に全身を動かす現実のダンスがやっと繋がった。

しかしこの後ダンス音ゲーは冬の時代を迎える。そもそもの音ゲーを乱発しすぎたコナミは、シリーズ継続困難な音ゲーを順次終了。音ゲーの中でもニッチ枠だったダンス音ゲーDDR以外は途絶えてしまう*6

 

いや、ちょっと待って。足のDDRと手のDMX/PPP、これ組み合わせたら全身ダンスになりませんか?なります。ということで韓国AmuseWorld社はシンプルに合体させたようなダンスゲーEZ2Dancer(AmuseWorld 2000年)があった。

今調べるとそこそこ続編が出てることから人気があったようだが、残念ながら当時韓国音ゲーが国内に入ることはかなり難しかったようで、最盛期でも5台程度しか国内になかったと聞く。結局筐体を見ることもプレイすることも譜面UIがどうなってるかもわからなかったが、現代ではプレイ動画を上げてくれるありがたい方がいることで遂に全貌がわかった

youtu.be

3方向にアレンジされたDDRフット・スイッチと、DMX同様に突き出した赤外線センサー受光部が合体した、愚直なわかりやすい筐体。譜面UIもDDRに手ノーツを追加しただけのシンプルな仕様だった。これはなかなかプレイが混乱しそうだ。

 

しかしこの時点でなんとなく先の問題が見えてくる。

そう、まずビーマニ特許式*7の譜面では全身の動きを適切に表現する方法がなかった。PPPのノーツでは手の位置は取れても、パラパラの振り付けを表現できていない。あくまで公式振り付けをすると、概ねノーツが取れるという状態で、ノーツを見ながら踊るとお手本ムービーの振り付けとは別の動きになってしまう。譜面が読めた所で手と足両方同時に譜面に合わせて動かすのは人類には至難の技ということだ*8。譜面UIの進化で、見た瞬間に振り付けがわかるような譜面は出来るのか?進化した所で人類の手足は付いてくるのか?…

逆転の発想、振り付けが先行したJustDanceと、譜面の諦め

Just Dance(Ubisoft2009年Wii) 国内ではJust Dance Wii(任天堂2011年Wii)。トラッキングをある程度?いやかなり諦めてはいるものの、全身で踊るゲームはこれがエポックメイクではないだろうか?なんと言っても現行でもシリーズ継続しているし。同様のゲーム体験は国内ではおどるメイドインワリオ(任天堂2010年Wii)が初出と思われる

ゲームのコントローラからゲームを組立る従来とは逆向きに、現実のダンスにゲーム判定を持ち込んだのが革新だ。センシングは今から思えば豪快に諦め、Wiiリモコンを手に、映像のポーズに合わせてそれっぽく構える/振る。Wii版を遊んでいないので、なんとも言えないが、この設計ではかなり判定はゆるく作らざるを得ないだろう。メイドインワリオでは判定を諦め来れなかったか、タイミングよく振る点を重視した作りだった。

youtu.be

調べる前はてっきり、おどるメイドインワリオ(2010年)が初出かと思ったがJustDanceの方が早かったのが意外だった。JustDanceのWikipedia情報によるとRayman_Raving_Rabbidsシリーズでミニゲームとして実装したものがブラッシュアップされ、その結果JustDanceとして1本の作品になった。それでも初代は20人程度のチームで開発され、やはり開発中は売れ行きはあまり良くないだろうと思われていたのは興味深い

ゲーム操作ではなくダンスが主、というのはセンシングだけでなく譜面UIにも現れている。そう、譜面UIは補助程度にすっぱりと諦めて、実写のダンスPVをそのまま流している。PPPの再来だ、だが主従は逆転している。振り付けが主、譜面は補助。あくまでスコア判定付きダンスムービーである

その結果、譜面から先の動きを理解するのは難しくなった…というより、そもそも画面比率で言っても譜面UIはヒント程度の扱い。そもそも譜面が表示できても全身を表現するのは無理があるよね、ならいっそダンスムービーでいいじゃないか。

譜面UIで先の動きの指示を出す試みは、ヒント以上は諦めた。無理。そういう割り切りだ。

 

しかし、この「譜面UIから、先のノーツがわからない」問題に対してJustDanceは、別のアプローチで解決を試みている。振り付けの単純化としつこくループを多用している点だ。初見でプレイしても振り付けが繰り替えされるので、途中から覚えていくことができ、初見プレイであってもループの最後の方ではまあまあ踊れて気持ちよく終われる。

家庭用の長いプレイ時間だからできることでもあるが、譜面UIは諦め、振り付けから体験をカバーするという思想は清々しい

 

ダンスムービーと譜面をオーバーラップさせた、DanceEvolution

2010年になるとBox360に、Kinectという全身トラッキングバイスが登場する。そもそもこの時期はWii sports(2006年) のヒットを受け、家庭で体感ゲームが遊べる、というノリのコンセプトゲームが出尽くし一段落した時期でもある。いや、それでも、ご家庭に全身モーキャプデバイスを送りつけようとはMicrosoftイカれてやがる!日本の家はそんなに広くないぞ!*9ローンチタイトルとしてDanceEvolution*10(コナミ2010年XBox360)がリリースされる。以下ダンエボ

手の位置、足のステップ、ポーズ(シルエット)、更には手拍子、発声もノーツとして設定できるようになった。Kinectセンサー全部盛り仕様である。*11

譜面UIは予告ノーツがCGダンサーに重なって出現する。…とここまで書くと、タッチパネル音ゲー押忍!闘え!応援団(任天堂2005年DS)も参考にしてそうではある。更にたどるとXY平面とZ時間軸を持つ音ゲーとしては、テクニティクス(アリカ2001年PS2)ミュージックガンガン(タイトー2009年)といった例もあった。この点ではJustDanceのダンスPVそのままよりは1手先の動きが見えるようになった。またただ、ノーツ密度が高まると画面がごちゃごちゃする問題も抱えてしまう。

抱えていたが、ダンエボもそこは諦め、音ゲーマーの反射スピードと学習力に期待した。されちゃった*12。JustDanceのヒントUIと比べ、CGダンサーと予告ノーツが同じ場所に出てくれるので、少なくとも画面の見る場所で困ることがないのはそんなに悪くない。その先のノーツはわかんないけども。そしてどっちにしろ、そんなスピードでノーツが出ても人間は追従できない。じゃあ、繰り返して覚えるしかないやんけ!すべての音ゲー覚えゲーに通じる

実際ダンエボは初見で気持ちよく踊るのは確実に無理だ。しかし音ゲーマーはそこに難しい譜面があるとチャレンジしてしまうし、繰り返して習得してしまう*13

youtu.be

当時は革新的だなあと思ったのだが*14、今思えばJustDanceのWiiコントローラでは出来なかった全身センシングをKinectでキャプチャーできるようになった、そしてそれを実写ムービーではなくイケてるCGビジュアルでブラッシュアップする、というコンセプトのタイトルに見える。

PPPからYesterday、Night of Fireavexパラパラ曲が続投して収録されており、もちろん振り付けもそのまま使ってクリアができる所は、PPPプレーヤーとしては嬉しい限り。一方で、他譜面の振り付けはコナミらしく?難易度がバリバリ高い物が多い。JustDanceと違い当初からアーケード化を想定していたのか、1曲の長さもJustDanceより大幅に短くなってしまい、短い曲を繰り返し遊んで、激しい振り付けをじっくり身につけるゲーマー向けスタイルという印象になった。このスタイルはコソ練習が難しいAC版でも共通しており、公式が練習用に振り付けムービーをyoutubeにアップロードしてくる次第であった*15

 

以前から、というより初代DDRの時点でダンスコンピレーションアルバムDanceManiaとタイアップして曲を用意していた。ダンエボでは全身ダンスゲーとなったことで、PV等に公式振り付けがあるときにそのまま公式振り付けをゲームに持ち込むことが可能になった。ダンエボ・アーケード版ではこれを大いに活かし、振り付け習得済みなコア楽曲ファンを逆にゲームに取り込む流れを作り出した。

youtu.be

ボーカロイドブーム、踊ってみたブームから、ダンエボへ振り付けが収録されるケースもあった。ルカルカ★ナイトフィーバー*16、ハッピーシンセサイザー*17などがある

コアなインディーズ原曲ファンを取り込む流れには、すでに昨今珍しくはないが合わせて振り付けごとゲーム化されたのは面白い。

www.youtube.com

譜面をルーチンに刻み、トレーニングツールに向かったDanceCentral

DanceCentral(XBox360 EA2011年)以下ダンセンは、北米ではKinectローンチで2010年、国内では2011年にリリースされている。ダンエボと同じXbox360+Kinectで全身ダンスゲー、となると近寄ったシステムになりそうな予想をしてしまうが、これまた全然違うゲームとして成立したのは興味深い

ダンスの動きを1小節ごとに区切ったダンスルーチンとし、それぞれのダンスルーチンには名前とイラストが付く。これが画面に右に予告として流れてきてダンスを行う。そう、ダンスルーチンが学べるのだ。

youtu.be

初代ダンセンが特に素晴らしいのは、それぞれの楽曲にbreakdownモードがある点。本編楽曲を踊る前に、使うダンスルーチンのみ繰り返し練習させられる。更に本編の一部のみ通し練習や、失敗した場合は再生速度を下げての練習もある 

youtu.be

初心者譜面ではシンプルな4~6個のルーチンを繰り返す習得しやすい振り付け、上級譜面ではそこに+3~5個の新たなルーチンを追加して複雑、スタイリッシュにしている。

このあたりは1楽曲1振り付けしかなく、判定箇所の数でしか難易度付けが変えられなかったJustDance/ダンエボ系と大きな違いとなっている。上の楽曲、PokerFaceについても難易度別で別の振り付けがある

youtu.be

JustDance/ダンエボが「判定付きダンスムービー」だったのに対し、ダンセンは「ダンスを小節単位でバラして組み直す、ルーチントレーナー」という立ち位置。ダンス動画ではなくダンストレーニング講座をゲーム化したという塩梅だ。ダンセンでルーチンを学べば、後は覚えたルーチンを適当につないでくだけで現実でもそれっぽくダンスができるようになる。

ただテキトーに遊んで気持ちよくなるゲームのためだけにそこまでカバーする必要があるのかはさておき、ダンスゲーで教育的なタイトルに仕上がってるのはすごい。マジで。ダンエボみたいな変則的/ダイナミックなダンスルーチンはさすがにないものの、4つ打ちリズムで適当に踊れるレパートリーが身につくゲームだ。

 

余談だがDanceCentralはOculusQuest/OculusRiftPC版が出ている。丁寧なルーチン学習は残念ながらなくなってしまったものの、VRらしくダンスクラブの臨場感やバトル相手の動きがよく見えるようになった。低速練習やフレーズ繰り返し機能などシステマチックなトレーニングモードが追加されている

完全に脱線だが、メニュー操作もVRゲーの中ではぶっ飛んだ、しかし世界観にマッチしたUIになっていてプレイをオススメしたい。みんなもスマホをバキバキにしよう

youtu.be

振り付け自由の復権、DanceRush Stardom

さて、JustDanceからここまで、ダンスの動きをどうゲームへ落とし込むか、という「ダンスムーヴ至上主義」的なスタイルが続いた。これに「ダンスゲーはノーツさえ取れれば、それ以外は自由に動いていいんだぜ!」という思想を復権させてきたのが、元祖DDRの後釜を狙うDanceRush Stardom(コナミ2018)だ

www.nicovideo.jp

そもそもDDRの頃から、とりあえずボタン押せればあとは好き勝手に踊ろうぜ、という通称パフォーマンスプレイがあった。他のゲームで例えると、ビーマニプレイ中に後ろを向く「ふりむき」や、敢えて腕をクロスさせて演奏する、後ろ向きで演奏する、などというスーパープレイ/縛りプレイがあり、そこから派生しつつダンス特有のキレや演出を足す感じだろうか。昨今のRTAや動画実況では特にプレイ成果に関係ない、トリッキーな見せプレイを合間に入れたりする風潮があるが、それをダンスゲーでやる、という見方でも良い。

www.nicovideo.jp

 

お手本ダンスムービーを見て自分の動きを同化させるダンスは、盆踊りやパラパラの例にあるように*18シンクロ感を味わうには良いが、ダンスにクリエイティビティを発揮したい人たちには堅苦しい

逆に、自由度を高めるには、動きを束縛しきれないが、そこそこ束縛されるゲーム判定を用意すればいい。それがボタンというハードウエア制限で偶然にも達成されていたのが初代DDRだったと言える。

そのため、ダンスステージはDDR並の大型フットパネルに、譜面UIは奥行き付きDDRスタイル*19であるが、バッサリと奥行き判定を捨て、横軸さえあっていれば踏み判定はOKとなっている。これが高い自由度を生み、ダンサーは自由に前後移動が出来ることで、シャッフルダンスの奇妙な浮遊感をそのまま持ち込むことが出来る

youtu.be

一方で、この自由度がダンス初心者、特にシャッフルダンスという見慣れない踊りを初めてする側にとっては相応に難しかったようで、ダンスラのリリース後は公式から練習動画や筐体で遊べんで学べる練習譜面、お手本プレイが続々筐体向けに配信されている。このあたりは早い段階でほしかった所だが、動画共有が前提の時代ということもありファンメイドの攻略/ダンス練習動画も多数出てきている

youtu.be

youtu.be

 

「お手本ムービーとシンクロする楽しさ、わかりやすさ」と「アレンジできる自由度、深さ」はパッと見、相反してしまう。そして自由度を追い求めると、最終的にステージ(場)と音楽があればあればよく、そうなるともはやゲームである必要性もなくなっていく…動き回れる床と音楽があればいいのでは…、となるとダンス音ゲーがゲームである理由が薄くなっていく…難しい問題だ

テトテコネクトはシンクロするダンスゲーの総まとめ

テトテコネクト(タイトー2021)は初見で見ると、パートナーキャラクターと行うタッチパネル音ゲー…、つまりはMaimaiや押忍!戦え!応援団を大型化した印象になるだろう。そこにパートナーキャラクターがいて、目の前でダンスをしてシンクロできる、と。

 

がやってみると結構感触が違う。単なるタッチパネル音ゲー、にしてはちゃんとパートナーの振り付けが付けられていて、マネして踊れるように譜面が作られている。

さらに、難易度ごとに譜面と振り付けが異なる。が、特徴的な譜面は残し、片手のみの譜面にする、連打を簡略化するなど、場面場面での簡易化/高難易度化の処理に手間が掛かってる

youtu.be

ダンエボで振り付けが採用されたハッピーシンセサイザーも、テトテで採用されおりUltimate難易度なら振り付け通りに踊ることが出来る。

あれ?これダンスゲーじゃん!!

youtu.be

譜面ごとに振り付けをバラして難易度調整するのは、ダンセンでやってたそれとほぼ同じ戦略だ。こうしてみると、タッチパネル音ゲーというよりダンセン、ダンエボの後継としての性格が強い。

「お手本ムービーとシンクロする楽しさ、わかりやすさ」をタッチパネルゲーとしての見た目とプレイを提供することで敷居を下げ、難易度別に振り付けを作ることでゼロからだんだん譜面と振り付けを覚えられるにする。このダンスゲーの最終地点は振り付け通りに踊ることで、それは「パートナーと同じ動きをする」という分かりやすいゴールと理解させる。そのパートナーは選択/エディットでき、ついでに他IPとのコラボもしやすい*20*21。すげえ、全部乗せか?!

 

…と、テトテコネクトには昨今のダンス音ゲーをまとめ上げたような作り込みを感じた。

*1:一時期存在したSoloシリーズは斜め前が追加され6箇所。ダブルは一旦脇へ置く

*2:DMXあんまり説明ないじゃん!とか言われても、めっちゃ自分が遊んだタイトルなので上げるよ。手ぶつけると痛かったよ。ところでPS2DMXまだですか?

*3:最近の自動ドアの検知機構と同じ。チュウニズム(2015年セガ)のエアーストリングスも同種の機構

*4:DMXは上下で別スクロール表示をさせるオプションもあった。今思えばサンバDEアミーゴのプレーヤーとかにはプレイしやすかったんだろうか?

*5:故にDDRではパフォーマーが独自の振り付けを編み出したりできたという見方もできる

*6:正確には国内DDRは2006年のExtremeで一度終了してリブートしている

*7:「スイッチ判定」を表すノーツが、時間軸に沿って動く。ノーツが基準線に来た所で押す

*8:ドラムマニアあったやんけ?まあ、それはそれってことで

*9:しかもWindowsで使えるサイコー

*10:英語版タイトルDanceMasters

*11:ついでに自撮りまでするし、リプレイで再生してくる。パジャマで踊ってるときに、それは勘弁してくれ

*12:コナミは人類の性能に期待しがちじゃないですか?(偏見)

*13:脱落しなければ

*14:そして判定が割り切ってるなあと

*15:ところで360版の追加楽曲DLCはまだですか?

*16:元振り付け【こずえ】ルカルカ★ナイトフィーバーを踊ってみた【らめらめよ!】 - ニコニコ動画

*17:元振り付け【踊ってみた】ハッピーシンセサイザ【めろちん】 - ニコニコ動画

*18:または昔のクラブもそうかもしれない

*19:SoundVoltex風、CHUNITHM風というのが分かる人にはわかりやすいか。というか、タッチ範囲が足パネルになったチュウニズム?

*20:いわゆるアバター3Dモデルを納品してもらえばコラボ出来る。んんん、なんか揺れものの動きがVRMっぽい気もするな?というか相馬みやこの肘のウエイトの乗り方とかもなんか見覚えがあるような…?

*21:プレイ時は初音ミクコラボが進行中だった

この自転車がほしい2022

まあ買うか買わないかは別として。

夏ぐらいから布教活動をしたら、友人2人にロードバイクを買わせることに成功したりしつつ、友人たちとツーリング機運が高まってたりで自転車熱が再燃している。周りが新車を買ったりnew gearしていると自分も欲しくなるものなので、引っ越しで手放したローラーの置き換えとしてグロータックGT-Roller F3.2を買ったりした。

が、それはそれとして新車は気になるじゃん?妄想妄想

 

今の自転車構成

普段使いユーティリティロードTNI 7005-mk2(5800)

2014年末に組んだのがベース。当時数少ない格安アルミフレームセットこと、みんな大好き激安アルミフレームのTNI 7005-mk2に、当時の105こと5800構成。初期構成から変わったのは、28Hの手組みホイールを入れてるあたり。

乗り心地がアホみたいに硬く、強く踏むと足が痛むだけで進まない、足を止めると進まないという分かりやすい問題はあるものの、高ケイデンスで回してるかぎりはよく走り、スポーツバイク然とした走り感は乗ってて楽しいバイクだ。初めてのブルベやらサーキットエンデューロレース、箱根ヒルクラやらにも投入した。

通勤用に使ってるうち、リアキャリアとパニアバックを付けると買い物に便利ということに気づき、買い出しの機会が増えた2020年のコロナ以降は20L+40Lパニアを基本装備にしてしまっている。米袋(5kg)や牛乳パックやらを満載してもスムーズに走れるのは楽しい。公園キャンプに各種道具積んで走るのもいい。まあただキャンプ道具を満載するにフロントの積載量がほしい

そもそも7005-mk2にはキャリアダボ穴がないために、VIVAクイックエンドアダプターとgrungeキャリアダボ付きシートクランプを経由してリアキャリアを付けてる。フロントも同じようなノリで行けるかと思ったが、ダボなしのカーボンフォークはVIVAクイックエンドアダプターと相性が悪く、QRで組み付けると明らかにフロントの剛性感が弱くなりイマイチ。ということでフロントに荷物が積めないのが不満になっている

 

そろそろ8年だし、解体して5800コンポセットとして切り出し、別車に組み直しても面白いと思う、という次第。

ストレートに後継の役目を追わせるなら

  • 雑に使える金属フレーム?
  • リアキャリア装着可。フロントキャリアまたはフロントダボ付きフォークで積載量マシマシ
  • 踏み込んでも足を傷めない程度の、現代的な硬さのスポーツ仕様フレーム

あたりが欲しいところ

本気ロードMiracleBike MC566(6800mix)

2019年後半に組んだカーボンバイク。7005mk-2を普段使いようにするべく、本気ロードという使い分け枠、の3世代目。ポジションが出せなくて諦めたICAN Aero007(シマノ6800)、その後購入し壊してしまったMiracleBike MC565の後釜として購入*1。自家塗装の上、シマノ6800を中核にヒルクラ対応のための32TスプロケとRD-5800-GS、ひっそり更新された*2FD-5801、X-Cadeyパワークランク(R7000)等を混ぜた構成。いつのまにか5800が多くなって、STIとクランク右だけ6800なのか…

土台がヒルクラ用フレームということもあって、硬い乗り味だけれども7005-mk2のような突き上げる硬さはなく、強く踏み込むとグッと進む。それでいて7005-mk2より2周り軽く、奇妙なフワフワ感がある。振動吸収も7005-mk2と比べれば雲泥の差でスムーズ。7005-mk2で感じた弱点だけが解消された上位機という風体でたのしい。これが現代的なカーボンフレームなのかー

 

今出先ツーリングしてるのはコレだが、ミノウラのロード専用リアキャリアでパニアバッグ運用をするようになっている

現状不満はないのでこれはこのまま。あ、自家塗装の皮膜が弱くどんどんボロボロになってきてて、その問題はあるけどいい解決策がない*3

折りたたみサブCarryMe

折りたたみは過去2台所有していて、CarryMeの前は5LINKS2(165)だった。これはこれで面白い変形、癖のある自転車だったが、やはりそれでも嵩張る、重かった。より軽量ミニマム、いっそ自転車外でも試すか…ということで、同僚のキックボードマニアから中古キックボードを譲り受けたりした所、キックボードは自分に合わないことがわかった。ペダルとフリーが欲しい、つまりミニマム自転車だ*4

ということで白羽の矢が経ったのが、キックボード以上自転車未満なCarryMeだった。探していたら中古ショップでビッタリ欲しいカラーを見つけて即購入。

CarryMeのキャラクターははっきりしていて分かりやすい。小径ホイールからくる圧倒的な失速、15km/hぐらいの巡航がちょうどいいぐらいで全然速度が出ないし、ちょっとした距離で体力を食う。まあでも歩くよりも走るよりも早く、サドルという特等席で座って移動できる。最初は軽いハンドルが繊細に感じられるが、乗り続けてくるとバランスのいい剛性感が素直な操縦性とスポーティーさを引き出してることが分かる。確かに体力は使うし、ロードと比べればそりゃ遅いが走れるし、だいたいの癖は抑え込め、自分の足として信頼が寄せられる。折りたたみのステップも少なく、縦長コンパクトな折りたたみ形態。8kgを下回る十分な軽さ。

 

とまあかなり気に入ってるのだが、それはそうとやはり圧倒的に走行性能が足りない。まあ出先の街でちょっと散策とか、駐輪場がない玄関先に置かせてもらう…みたいな用途にはベストではあるけど、出先ツーリングするには厳しい。

んー、いや悪くはないけど、「走りたい」気持ちで出先を選べないというか、出かける用事があった上で持ってく、なら楽しいバイクというか。しかしかといってロードを輪行するのは面倒が過ぎる、という場面が出来たりしない?

  • 折りたたみでコンパクトだが、走行性能も欲しい

ということで要件をまとめると

  • 積載量重視の汎用バイク/カーゴ/グラベル/バーサタイル寄りのダボが多いやつ
  • 走行性のある折りたたみ

のどちらか、または両方。いや折りたたみのプライオリティは低いというか趣味性が高まっちゃう

4台保有は難しいので、7005-mk2を解体or手放した上で、上記のどちらか重視かなあ? 解体パーツを割り当てて、新車をバラ完すると安上がりかもしれない。そうじゃないかもしれない*5

概ねディスクブレーキになるだろうから、そうするとグロータックのEualブレーキとか付けてみたいねえ。

このバイクがほしい2022

Surly BigDummy

でかい。説明不要の積載量。ロングテールカーゴバイク

いやー、試してみたいよね?7005-mk2を解体して付けても良いが、Alfine8s内装変速とかでもっと低速向き仕様で作りたいと思うし、そうするとコンポを移植する意味がなくなり、7005-mk2を解体する理由がなくなる。その場合は7005-mk2はまるごと売却かなあ

26インチディスクホイールを手組みできるか?という問題はある

Allcity SpaceHorse/SuperProfessional

Sulry対抗クロモリ。塗装センスはこちらのほうが好みなので。

SpaceHorseはSurlyで言うLongHaulTracker系ツーリングバイク、SuperProfessionalはシングルスピード向けだがRDハンガーもあり何でもありアーバン系

組むとすると、7005-mk2を解体して5800をポン付け、Equalディスクブレーキあたりを付けたい。

RibbleCycles Gravel AL

安価なアルミフレーム。グラベル

最近知った欧州ブランド。アルミのフレームセットをお安く売ってるのはありがたい。カスタムペイントも対応。

Gravel ALだとフォークダボもあり、積載量的に安心。スタイルはGCR ALのほうがシュッとしてるけどフォークダボが無くてな…。Fuji Jariとかも対抗に出てしまうけど、7005-mk2解体でバラ完できる分こちらがお得。

DAVOS  D-309 ネオスポルティーフ/D-604 ネオランドナー

ダボマシマシグラベルバイク。

クロモリのネオランドナーがお買い得感あるけど、ぶっといカーボンフォークと細身のクロモリフレームはちょっとアンマッチのような気も。マッシヴなネオスポルティーフはカッコいいが、カーボンを普段使いするには気を使うかもしれない?

PacificCycles Reach

折りたたみ!走行性能重視!フレームセットあり!Carrymeと同じPacific社!

一応専用リアキャリアもあり、パニアを付けての普段使い出来なくもなさそう。ドロハン構成に出来るのは夢が広がる。5800ポン付けしたい。

ただ、そんな小さくはない…

Renault PremiumLight6

程よい折りたたみ、というだけだが、気になる。というか自動車会社ブランドでの自転車はだいたいどこかのOEMでよく見た形状になりがちだと思うのだが、ルノーはちょっと違うっぽいラインナップで謎。妙にグレード分けがあるし、敢えて変速機なし/走行性重視の軽量版を用意したり… と思ったら、GICが手がけているようだ

適当にググった感じダホンのOEMっぽい?PremiumLight6だとDove Plusが同等品かな。価格差がどう出ているのかは気になるところ。ダホンで14ならK3も対抗になるやん?とかは思いつつ、いやでもここはシングルスピードの軽量さを推したく…

*1:正しくはMC565をそのまま買い増ししようとしたが在庫がなく、後継のMC566 T700版を購入

*2:FD-5800のロングアーチ構造はこの世代のみだったらしい…謎

*3:再塗装もできるか怪しい

*4:番外編として立ち漕ぎ専用自転車、みたいなアイテムがkickstarterで一時期あったがプロジェクトが成立しなかったり、既存折りたたみほど洗練されてなかったので諦めた

*5:たぶんそうなる。予算オーバーの法則

光造形3Dプリンタ入門した

光造形とは

ここ最近安くなった光造形に手をだしてみた。最近安いLCD式光造形は液体のUVレジンをUVライトで固めて立体化する、3Dプリント方式の一つだ。というのも、LCD光造形はUVライト、解像度の高い液晶パネル、レジン容器(バット)、Z軸のリフトで大まかに構成されるため、メカ的にはFDMよりシンプル

自分はFDM式プリンタをすでに持っていたので光造形に手を出したが、3Dプリンタ初めてならFDMから始めたほうが良いだろう。今ならXyzPrinting社、FlashForge社、Creality社など確実性の高い機種が生き残っている

FDM

  • フィラメント(材料)がやすい
  • そこそこの大きさ(機種次第で2,3cm~25cm程度)が作りやすい
  • 耐熱性が低い
  • 最大解像度は0.1mm程度、最低厚みは2~3mm程度
  • プラのゴミくずが出る程度

光造形

  • UVレジン(材料)が高い(2倍程度)
  • 小さく細かいもの(機種次第で1cm以下~12cm程度)が作りやすい
  • 耐候性が低い
  • 最大解像度は0.01mm程度、最低厚みは0.2~0.5mm程度
  • 液体薬品管理、それらの洗浄、フィルタ処理、二次硬化(ポストキュア)、廃液処理が必要

と概ね、光造形は細かく精密な物、スケールモデルや装飾品には使えそうだがそれ以外はなかなか難しい。日用品を作ったり、おもちゃや実用物ならFDMがより向いている。メンテも簡単だ

が、まあ光造形がどんなもんかに興味もあったため購入

 

基本的には

はじめての3Dプリンター!造形準備と後片付けについて - やなか技術士事務所のホームページ

をお手本にして始めてみた。とても参考になりましたありがとうございます。

機種選定

前述のように、主要な造形の仕組みをUVレジン液とその硬化に頼っているため、わかりやすい性能/価格差は主に液晶パネルの解像度/サイズに出てくる。一昔前の家庭用光造形は、Z軸リフトの精度が出にくい、Z軸リフトが液晶を割ってしまう/設計不良、UV光源にムラがあり造形が均一でない、等など問題点があったようだが、今ではあまり聞かない

ざっと見てみると2Kモノクロ液晶機(造形サイズ12x8cm)が2~3万円台、4Kモノクロ液晶機(造形サイズ(造形サイズ18x12cm)が6万~という感じのようだった。Amazonを見ると、更に小さいFHDパネルやHDパネルのものもあるようだが、そこまでコストを下げる理由はない。逆に4K機はその分大量のレジン液を扱う必要が出てくるため、運用コストについては大は小を兼ねないだろう。

ということで、今回は2KモノクロのAnycubic Photon Monoを選択した。Elegoo Marsもほぼ同タイプの対抗機のようなのでそっちでも良かったかもしれない。あと、Amazonで買うと公式通販より高かった(失敗)

f:id:o_mega:20210616012233p:plain

アクセサリを揃える

本体には

が付属した。便利

追加で以下のものを買い足した。ニッパとスクレイパーで事足りるFDMとは大違い

水洗いレジンは光造形を試すきっかけになったレジンだ。水洗い以前は、アルコール洗浄が必要になり、IPAを家庭で使う必要があった。毒性も爆発性も揮発性もあるを家にドンドコ追加し、じゃぶじゃぶするのは気が引けるわけで、水洗いはそういう意味で革新的だ。

とはいえ水洗いできるようになっても、レジンアレルギーなどは警戒したい。そのため手袋を追加し、適時使い捨てるようにする

スクレーパーは使っていくうちに汚れていくが、樹脂ヘラ、金属ヘラともホームセンターやヨドバシで入手可能なようだ。光造形は何かと汚れて固着しがちなので、適時使い捨てて行くのが良さそう

プリセットで試す

本体同梱のキャリブレートマニュアルに従って、ビルドプレートの取り付け、キャリブレーションをする。終わったら、SKレジンをよく撹拌してからバットへ注ぎ、初回テスト出力

f:id:o_mega:20210616013118p:plainf:id:o_mega:20210616013125p:plain

本体付属のUSBメモリにテスト印刷データが入っていたので、そのまま使ったところ、ベッドから剥がしにくい以外は何事もなく成功した。すごい

いや嘘、途中でレジン液を追加してしまい、初回は失敗した。途中でレジン液を追加するのは、温度変化を招くためにNGらしい。上のは2回目

f:id:o_mega:20210616013521p:plain

造形と洗浄のワークフロー

ということで手持ちのSTLデータとかをあれこれしつつ、いろいろプリントを試す

 

f:id:o_mega:20210616014220p:plain

スライサーでSTLモデルを処理する

ここはFDMと対して変わらない。モデルをツール(うちの場合はPhoton Workshop)へロードして、必要に応じてサポートを追加し、スライス処理をして印刷データを用意する。

造形ベッドに造形物をそのまま固着させる形であればサポートは不要だが、その場合初期層はUV照射時間がことからかなり太ってしまう

それでだいたいの場合はサポートを付けるが、FDMと明確に異なるのがサポートの性質だ。FDMではサポートは上に乗せるフィラメントを最低限支えられればよかったが、光造形の場合はFEPフィルムからベリッと剥がしたときに引っ張りに耐える強度が要る。またサポートが偏った位置にあれば引っ張り時に位置がずれるリスクが高まるため、上下左右にバランスよくサポートを付けたい。オートサポートはあんまり賢くなかったので手付けでやってる

f:id:o_mega:20210616020910p:plain

レジン液をレジンバットに補充/かき混ぜる

レジン液をレジンバットに注ぐ。泡立たないように、レジン液はボトルの段階で優しく振って混ぜておく。すでにレジンバットに注いである場合は、樹脂ヘラでかき混ぜた方が良いかもしれない。使ってるSK水洗いレジンの場合、一日放置しただけでも色ムラができているのが分かる

レジン液は造形に十分な量あるのが望ましいようで、少なくなるとZ軸リフトが上がったときに造形物に泡が入ってしまう可能性があるようだ。結果的にレジン液は完全に使い切ることが難しい

泡穴が残っても、あとからレジン液を垂らし、UVライトで埋めるという手もあるようだ。ちょっと試した感じでは液体の扱いが難しくキレイに埋めるのは難しそう。パテの方がいいかもしれない

プリント

PhotonMonoプリンタを起動し、USBメモリを刺す。ビルドベッドが取り付けられているのを確認してカバーを掛け、Printメニューからプリントしたいモデルを選んで実行するだけ

f:id:o_mega:20210616014302p:plain
只管プリンタがレジン液にベッドを浸す、上げるを繰り返す。ちゃぷちゃぷするだけなので音は静かだ

一次洗浄とビルドプレートから剥がす

百均タッパー2つに水を張って、洗浄タンクにしておく。それぞれ一次用、二次用と分けた

f:id:o_mega:20210616014324p:plain

手袋をして造形物がくっついたビルドベッドをプリンタから外し、一次用タンクで筆を使いながらじゃぶじゃぶ洗う。レジンはとろみがあり、水洗い可とはいえ結構ぬめりが残る。また造形物だけでなく、ビルドベッド表面にもたっぷり付着した状態になったのを洗うため、プリント毎のレジン消費はそれなりにありそう。そして一次洗浄タンクはかなり汚れる

二次洗浄とサポート除去

サポート除去と二次洗浄、どちらを先にやるか。自分はとりま、サポート除去を先にすることにした。

というのも、サポートを取らないと筆洗いでは細かい所が洗いきれないから。超音波洗浄機を導入すればこの限りではないと思う。

サポートをプラニッパでパキパキと切断して取り除く。ポストキュア前だとレジンがまだ柔らかく折れにくい、白化もないためこの段階が良さそうな気がする。その後、筆で二次タンクでじゃぶじゃぶ洗浄。

f:id:o_mega:20210616014402p:plain

乾燥

サーキュレーターで風を当てて乾燥。現状よくわからないが、水洗いレジンは吸湿性があるらしいのでそうするとちゃんと乾かしたほうがいいのかもしれない

f:id:o_mega:20210616014424p:plain


ポストキュア(二次硬化)

手芸用のUVライトを買ったが高さが足りなかったので、100円均一アイテムでポストキュア箱を作った。タッパーにアルミホイルで遮光&反射で効率up狙い、あみあみ台座は排水溝のメッシュ

裏返しながら4分タイマーをまんべんなくあてて二次硬化させる

f:id:o_mega:20210616014343p:plain

以上でざっくり造形は完成。でよいと思う

メンテナンス

洗浄廃液処理

これもブログを参考に、日光浴/ポストキュアUVライトを当ててからストレーナーで濾して下水へ捨てる。

一次洗浄水は流石にビルドベッド周辺も洗ってるせいかレジンが濃いようで、湯葉みたいなものが多量に取れる。二次洗浄水はぼんやり油膜ぐらい。あとはベッドから剥がす時に割れたサポート片が混ざるぐらい

f:id:o_mega:20210616014438p:plain

どんどん汚れる。底にもレジン片がこびりつく。定期的に捨てるぐらいが良さそう


レジンバット洗浄

レジンバット洗浄は毎回しないといけないか…ぐらいに思っていたがそこまで不要だった。プリント前の撹拌をすれば問題なさそう。造形成功しつづけている限りあまり洗浄は不要という感触

ただ、長期間プリントしないなら、ボトルへ片付けたほうがよいだろう

f:id:o_mega:20210616013754p:plainf:id:o_mega:20210616013616p:plain

一方でプリント失敗した場合は確掃除が必要になる。造形失敗したパーツがFEPフィルムに固着しているので剥がして捨てる必要がある。剥がれ落ちた造形品がレジンに浮いてる可能性もあるだろう。樹脂ヘラでFEPフィルムを丁寧に撫でてゴミを剥がし、ストレーナーを通してレジンからゴミを除去する作業が必要になる。

 失敗だけでガッカリなのに、追加で掃除が必要というかなりの罰ゲームがある

 

f:id:o_mega:20210616013832p:plain

スライサからUSBの書き込みが完了する前にあせってUSBメモリを抜くと、スライスデータが破損するようで、気づかずに出力するとこのようにぶっ壊れ造形をされてしまうことが起きてしまった。レジンも大量消費するし、ベッドは固着して剥がしづらいし、洗浄タンクもバットもクソ汚れる。つらい…

パラメータ調整

正直よくわからんけど、プリセットでうまく行った。

概ねこの光造形で問題になるパラメータは、UVライトの照射時間ぐらいと思われる。SK水洗いレジンについては機種ごとの出力差はあるにしてもモノクロ機で2-3秒と公式が紹介しているのでこれを参考にした。PhotonWorkshopの初期値は2.0秒であり、これだと特に問題なく成形されるものの逆テーパー部がかなり太った。

照射を長くすればよりカッチリ固まるが、周辺部まで余計に固まることから太めになる。またXY平面に広いパーツは内部に応力がたまり割れやすくなる…らしい。逆に照射を短くするとだんだん柔らかくグニャグニャになるものの、周辺部の固まるがなく細く正確な造形になる。ただし、下げすぎるとベッドから造形物が墜落、レジンバッド内のゴミになる可能性が高くなる。

何度か試し、最終的に1.7秒程度に設定した。ただ、現状柔らかいことで反りが出ているような感触もあるので、この辺は詰めていくか、サポート設定の工夫が必要そうだ

硬化後の特性や塗装とか

硬化後のレジンはパリッとした硬さになった。ただ、靭性は低いようであっさり折れたり欠けるので、ガシガシ遊ぶタイプの模型にはキツイかな…。展示する模型にはベストマッチ。ヤスリをかけた感じ切削はしやすい。ラッカー塗料の乗りもいい

f:id:o_mega:20210616014833p:plain

サポートの付け方によるのか、結構歪むことがある。画像だと正方形の穴や後方カバー部が歪んでいる。精度があるのと歪むが両立しているのが不思議な気がするが、液体硬化はだいたいこういうものらしい

f:id:o_mega:20210616015424p:plain

感想

FDMと比べると格段に面倒になる。で得られるのが精度だけ、というのが思ったよりFDMより使い所が難しい。スケール模型を作ったりするにはメチャクチャいいんだけど、他の実用アイテムとかになると置き換えは厳しい感じ、という当初の予想だいたい通り

 

U10mk2デスクトップアーミー版を作る

ということで?日頃お世話になってた火事屋さんのU10mk2アバターを、デスクトップアーミー・バーゼラルドとミキシングして、それらしくしてみた。

U10mk2はアバター、VRChat、通りやすいイメージで言うとゲーム寄りのCG用途に作られているため、当然ながら3Dプリント適正はない。がそれなりにアバターとして使い込んでることでモデル形状はだいたい把握していたこと、フル再現ではなく部分再現とミキシングでやること、としてハードルは低めに。残りはblenderと気合で頑張って手を入れて、ガンガンプリントをして試作確認モデル修正をぐるぐる回して作る(プリントの練習を兼ねる)

blenderには3d print toolboxという公式プラグインがあってたので、多様体化はだいたいこれで解決している。閉じてないポリゴンに豪快に蓋をしてくれる

Photon WorkshopはFDMのスライサーと異なり、ポリゴンが交差している分には問題なかったので、そこの特性は積極的に活用した。一方でノーマルが間違ったポリゴンでは、プレビューでは表示されるがスライス時には消えるような怪しい挙動があったので注意が必要

blenderブーリアンモデファイアで穴あけ等をしたのだけど、どうも交差が複雑だったりすると上手くいかずにポリゴンが消える場面が起きてしまって、かなり手間取った。穴あけにいい方法があれば知りたい

 

ツールやプリント方法に依存しない問題点として、そもそも単純に縮小したものがリアルで実用的な模型になるとは限らないというのがある。U10mk2の足ブレードをそのまま出力すると0.5mm厚が生成されたり、腰の武器リングも1mmぐらいの輪っかが出来たり、パーツ同士の接合が1mmシャフトだったりしてしまう。すると普通に塗装したり組み立てるだけでパーツを破壊しがちだ。サポートから取り外せなかったり、そもそも途中脱落して造形失敗することも起きうる。空中に浮いてるパーツはそもそも造形できない。ので、おもちゃチックにわざと厚みを足したり、目立たないように裏に柱を追加したりの加工をしている。

他に今回の用途に合わせ、ジョイントパーツの接合用穴や、武器のグリップを追加などもする。ディテイルはそもそもノーマルマップで作られたディテイルは、ポリゴンだけが造形される3Dプリントでは作られない。またディテイルが造形できても、0.2mm以下の溝などスケール的に意味がなくなってしまうケースもある。必要に応じて作り直す/彫り込むのが正しいが、今回はスピード重視で楽しそうな所だけ施した

 

今回は顔パーツには手を入れなかったが、アバターによっては目のパーツを空中に浮かせる、目が陥没している、といったモデリングテクニックがしばしばあるため、それらを埋めたり違和感ないように修正したり、はたまたプリントサポートをどうするかといった工夫が必要なると思われる

光造形なら出来そうな気配がしたのでU10mk立体化を試してみた。思った以上に全体に手を入れる必要があった。大変だったが、なかなかいい所まで出来たのはよかった。喜んでもらえた

 

あと、久しぶりに模型塗料を触ったんだけど、クレオスのGXメタリックカラーシリーズが筆塗りでもキレイにギンギラになる、オススメ。一昔前のメタリックより格段に粒子が細かくてキレイ

f:id:o_mega:20210616023453p:plain