#Live2D
以前noteでも解説したんですけど、
note.com/himono_vtuber/…
人間の顔にはパースがついているので、斜めの顔を作るときはそれを考慮しないと不自然になっちゃうんですよね
(パースを考慮しない単純な斜め変形「4隅の形状を自動生成」で顔面崩壊して泣いた人は多いと思います)

続く Image
これの解決方法はざっくり言えばパーツを斜めにずらすことです
この辺はnoteで既に言ったことなので詳しくはそっち見てほしいんですけど
実はこの製法、大きな弱点がいくつかあるんですよね

続く ImageImage
1つ目は他の部位との整合性が崩れること
顔と違い体はあまり動かさないのでパースはかけないですよね。すると顔と体でパースのかかり具合が変わり、ただ斜め横を向かせたはずが奥側に物凄く首を傾けているように見えます。
体にパースをかけると腰辺りで同じ現象が起きます Image
2つ目はトラッキング時にカメラの前の自分(分かりやすいように演者と呼称)と違う動きをすること

極端な例でいうと、横に90度向かせるとY軸とZ軸が逆転現象を起こします。
この逆転現象は徐々に起こっているので、高可動域であれば90度まで向かせていなくても少なからず起こっています

続く Image
手打ちアニメーションであればそんなに不都合は生じないのですが、トラッキングの場合この逆転現象のせいで横を向いた時に演者と全く違う動きをしてしまうので違和感がすごいです
この映像、モデルは横向いて首を「左右に」振っていますが、実際は横向いて首を「上下に」振っています
(↑は古いモデルだからクオリティ低くてごめんね)

大きな問題となるのが今言った2つ。

あとは些細なことですが、常日頃モデリングの際にパーツの高さを揃えることで歪みをなくしているのに
顔だけはパースがかかるのでパーツの高さが思いっきりずれるのがなんか凄い気持ち悪くて嫌でした() Image
この辺の問題はLive2D90度横向かせたい界隈(別名筋肉界隈)では前から言われており、Y軸Z軸を徐々に逆転させることで解決できます。

手っ取り早いのは直接変形でなんとかすることですが、パラメータ複数付けの必要があるので
ただでさえ高可動域で構造が入り組んでるのに恐ろしい事になるのは明白です Image
構造が入り組む=ミスや歪みが生じやすい
なのでなるべくシンプルな作りでY軸Z軸逆転を起こせないかと考え、物理演算で上手く制御できないかと色々試した所上手くいったのでこのツイートをしています
(なんとここまで前置きです)
では実際どうすればいいのか。
まずモデリングは通常通りパースを掛けて行います。
そして、トラッキング時に物理演算で少しZ軸をー方向に動かして整合性を取ります。
(こうやって見ると、上向いてるときは頭を後ろに傾けてるんだから横向いたら首が動くのは当たり前ですね) ImageImage
もう一つ。横を向いて首を振った時、モデリング時は上の図のようになりますが、トラッキング時は下の図ようにしたいです。
これは、物理演算で角度Yを少し+方向に動かすことで解決します
(首を振った時に頭が画面奥方向に傾いているので上を向く、と考えれば辻褄が合いますね) ImageImage
「物理演算で少し動かす」と簡単に言いましたが、実際にはトラッキングで動かすパラメータは物理演算で動かせません。(物理演算に組み込んだ時点で物理演算専用となりトラッキングでは一切動かなくなる)

ではどうするか。角度XYZを「トラッキング用」と「物理演算用」に分離させてしまうのです Image
詳しく説明するとこんな感じです。トラッキング用XYZには何も付けず、物理演算用XYZで全てをモデリングします。その後物理演算でトラッキング用と物理演算用を紐付けて追従させます。

(この時点で初心者には意味不明だと思いますが、これは超上級者向けなのでお許しください) Image
先程の図解を再掲します。「トラッキング時に物理演算で少しZ軸をー(マイナス)方向に動かして整合性を取る」と言いましたが、これを先程分離したパラメータに当てはめてみるとこうなります。 Image
図にするのは簡単。でもこれ実際にやろうと思うとめっちゃ大変です。
「トラッキング用XとYがどっちも+方向に動いている」という条件の時【だけ(ここ重要)」】「物理演算用Zをマイナスに動かす」という動きをさせつつ、
トラッキング用Zを動かした時も普通に物理演算用Zを動かさないといけません
【だけ】が重要と述べたのは、Live2Dの物理演算は振り子状なので普通にやったら「逆方向にも動く」んですよ。つまり逆方向に動かさないためにすごくややこしい事をやる必要があります。
◆トラッキング用XとYがどっちも+方向に動いているという条件の時だけ物理演算用Zをマイナスに動かす
 なんかこれは大変そうなので、とりあえず
◆トラッキング用Zを動かした時に物理演算用Zを動かす
 こっちを先にやりましょう

(だんだん説明したいことが多すぎて文字数足らず細切れになってきた)
やり方は簡単
・入力をトラッキング用Z、出力を物理演算用Zに指定
・種別を角度、影響度50くらいに(後で入力を増やすので余裕もたせる)
・振り子を極端に揺れない値に設定
・トラッキング用Zと物理演算用Zが同じ動きをするように倍率を弄る

これでトラッキング用Zと物理演算用Zの紐付けが出来ました
この単純な追従はありとあらゆるとろで使えるので覚えておいて損はないです。入力もしくは出力を反転させると反対方向に動かすことも出来ます 物理演算の一部反転が使えないFacerigでめっちゃ使います。
では問題の動きにいきましょう
「トラッキング用XとYがどっちも+方向に動いているという条件の時だけ物理演算用Zをマイナスに動かす」

まずこの文章の前半を

・トラッキング用Xが+方向に動くとき【だけ】+方向に動く
・トラッキング用Yが+方向に動くとき【だけ】+方向に動く

こう分離します。
【だけ】がついているのでさっきの単純な追従は使えませんね。
なので、この命令専用の新しいパラメータを作ります。

分かりやすいよう、末尾に「+方向に動くときだけ+方向に動く」を縮めて「++」と付けています

+方向にだけ動かしたいので最小は0です
最大はなんでも良いですが最大は0です Image
そして、パラメータ用Xと角度++を先程と同じように追従させます

倍率以外は同じ数値です(倍率の違いは最大値の違い)が、
角度++は最小値が0なのでマイナス方向には動きません。「パラメータ用Xが+方向に動くときだけ+方向に動く」パラメータが完成です

Yも同じように作ります
◆トラッキング用XとYがどっちも+方向に動いているという条件の時だけ物理演算用Zをマイナスに動かす

この文章の前半部分の命令が作れました。

いよいよ後半の文章で物理演算Zを動かしたいのですが、

「トラッキング用XとYがどっちも+方向に動いている」
「物理演算用Zをマイナスに動かす」
よく見ると文章の前後でプラスマイナスが逆転していますね。
これはすなわち、物理演算エディタ上では「反転」をしなければならないという意味です。

ですが!!Facerigでは物理演算の一部反転が使えません!!そしてこれはFacerig用モデルです!

困った!!
なので、

「トラッキング用XとYがどっちも+方向に動いているときだけマイナス方向に動く」

というパラメータをもう一つ間に挟んであげなければいけません。

私がFacerig用モデルを作りたくない理由の一つがこれです。(他にもクリッピングの制限とか色々あるけど)
ということで、新たな命令用パラメータを作ります。
名前はこじつけですが、「Z→↑」です(説明難しいから理由は図を見て)

このパラメータは、「マイナス方向に動く」という命令だけを送りたいので、最大値を0にします
最小値は多分なんでもいい 私は-1にした
もうここまでくると勘で作ってる ImageImage
そしたらさっき作った角度X++・角度Y++とZ→↑を紐付けましょう

ちょっと言語化難しいのでゆっくりいきますね
まず角度++だけを
種別「角度」影響度「50%」で入力し、
出力に倍率1.0でZ→↑を入れましょう
するとあら不思議、パラメータをデフォルト値にしてても振り子が傾いた状態になります Image
これはなぜか。
バグか仕様か分からないんですが、種別角度で入れた入力パラメータは、実際の数値は関係なく、
「真ん中が0」と認識されるんですね。

たった今入力で入れた角度++は最小値0のデフォルト値0なので、

実際の数値は0なのに、「マイナスに振り切っている」と認識されてしまうんです Image
ではここにさらに角度Y++を種別角度影響度50%で入力するとどうなるか。
こうなります。
角度Yも「マイナスに振り切っている」扱いされて振り子が更に傾き、
Z→↑がマイナス方向に振り切ってしまいました Image
この状態で試しにパラメータ用Xとパラメータ用Yを動かしてみましょう。どちらを動かしてもZ→↑が動きますね。

パラメータ用X▶角度X++▶Z→↑

もしくは

パラメータ用Y▶角度Y++▶Z→↑

という順番で命令が届いているのが分かりますね。
複雑な事やりすぎて自分でも頭痛いですが、
ここで今やっている事を数字に置き換えてみます。

角度X++・角度Y++の最大値は1です。

今Z→↑は最小値-1に振り切っています

角度X++を最大値まで動かす(+1)と、Z→↑(現在-1)は

(-1)+(+1)=0

になります。

※数学めっちゃ苦手だから式の書き方は適当
では角度X++と角度Y++両方を最大値まで動かすと、

(-1)+(+1)+(+1)=1

になります。
でもZ→↑は最大値0なので、
実際には+1の命令が入っているのにパラメータは0で止まっています。
動画で見ると分かりやすいですね。
じゃあですよ、ここで角度X++・角度Y++の入力を「反転」したらどうなると思います?

パット見はZ→↑は「0」で止まっているように見えますよね。
でもこれ、内部的には「+1」に振り切ってます。
(「-1」に振り切ってる状態を反転したのでそうなってる) Image
入力を反転した時、Z→↑は「+1」に振り切っていますが、最大値が0なので0で止まっています。

角度X++を「+1」に動かすと、Z→↑には「-1」の命令が伝わります(入力反転してるからね)

(+1)+(-1)=0

0のままなのでZ→↑は動きません
でも、角度X++と角度Y++を同時に入力すると

(+1)+(-1)+(-1)=-1

結果は-1となり
Z→↑はマイナス方向に動きます

角度X++と角度Y++を同時に入力したときだけZ→↑がマイナス方向に動きます

角度X++はパラメータ用Xを+に動かした時
角度Y++はパラメータ用Yを+に動かした時
に動きます

そう、つまり
「トラッキング用XとYがどっちも+方向に動いているときだけマイナス方向に動く」最強パラメータ
「Z→↑」が完成してしまいました!!!!!!

うおおおおおおお!!

…なお実際は色々弄ってたらまぐれで出来ました
後から言語化したらややこしすぎて頭抱えてますすみません
山場は超えたのでちゃちゃっとトラッキング用X・Yと物理演算用X・Yも紐付けちゃいましょう
やり方はこれと全く一緒
それが終わったら
いよいよ物理演算用ZにZ→↑を入力しましょう 影響度は10%にしときます

◆トラッキング用XY両方が+方向に動いている時だけ物理演算用Zをマイナスに動かす
◆トラッキング用Zを動かした時に物理演算用Zを動かす

両方の動きができています!!
順調です!!

と思いきや!!
なんということでしょう
Z→↑を入力に入れたせいで、「入力に入れたパラメータは数値関係なく真ん中が0と認識される」法則が発揮され、
デフォルト状態で物理演算用Zが+方向に傾いてしまいました つまりデフォルトでモデルの首が傾いてしまっています

私は一旦ここで詰みかけました Image
でもよく考えてください
これはあくまでも「→↑」方向に顔を向けた時のZ軸の処理です

実際には、あと3方向の処理が必要なはずです Image
もう気力ないんで図解はしませんが、
この4箇所のうち、Z→↑を含めた2箇所が「Z軸をマイナスに動かす」処理です

残り2箇所が「Z軸をプラスに動かす」処理です

つまり4箇所合わせるとプラマイゼロになります

なんということでしょう
物理演算用Zの傾きが消えました Image
これも原理は一緒です

「トラッキング用XとZが同時に動いている時に物理演算用Yを動かしたい」なので

Zを分離させてZ++を作り
さっきのX++と組み合わせてY→↑に送り、
物理演算用Yを動かす

という処理を順番にしていけばいいのです
結果、ZとYの処理含めたらこれだけのパラメータと物理演算が出来ました
(実際には使ってないパラメータもありますが)

我ながらメッチャキモイですが、スキニング使うとこんくらいの数あっという間に超えちゃう気がするので「死ぬほど重いモデル」にはなってないと思います…多分… ImageImage
では、全ての処理を施した状態で動かしてみましょう

本当は!!!ここで!!!実際のモデルを見せたいんですけど!!!!
モデルの公開許可を貰ってないので今お見せすることは出来ません(本当にごめんなさい)

なのでパラメータだけお見せします
こんな感じで、XYZが複雑に動きます
ここまでめげずに読んでくれた方はこう思ったでしょう

「こんな面倒くさい事するなら直接変形させたほうが早いんとちゃう?」

確かにこの方法はめちゃくちゃ大変なので
初心者にはまず無理ですし
物理演算苦手な人も無理だと思います

でもこの方法には明確なメリットが2つあります
まず一つは「物理演算は使いまわし出来る」という事

もちろん私は今後これを改良しながら使い回せますし、
極端に言えば今ここで物理演算設定データを配布すれば世界中の人が使い回せます

(もしかしたら今後配布するかもしれませんが
昨日作ったばっかでバグが怖いんで今はやめときます)
もう一つは「揺れもの系の動きをシビアに管理できる事」です

髪やイヤリングなどの揺れものは全て「物理演算用XYZ」に紐付けます

こうすることで微妙な傾きや左右の揺れを感知出来、
よりリアルに動かすことが出来ます

直接変形ではこうはいきません
あともう一個あったわ、単純にXYZ作るのが楽です。いつもの方法で良いんで。
多分90度回転モデルもシンプルに作れるし、
これを使えば180度モデルも可能かもしれない Image
解説は以上です
ちょっとみんなに原理を説明したくて始めたら
夜通し7時間Live2Dの訳解んない情報を呟きまくるヤバい女になってしまいました TL汚しすみません 頭の中言語化するのって難しいね!

かなり難しい話になってしまいましたが、分かる人に分かって参考になれば幸いです
このスレッドを一言でまとめると「Live2Dはプログラミングもどきも出来ちゃうヤバいツールなので可能性無限大だよ!」です

私自身はプログラミング未経験だし高校時代テストで0点とったくらい数学苦手なので、もっと効率化出来る部分もあると思います
なので、「こういう複雑な制御も物理演算で出来ちゃうよ」という部分をつよつよな人たちが応用させていったら
トラッキング用Live2Dモデルはもっと進化するんじゃないかなーと思います!!
起きたら伸びてた ありがとうございます!
重要な補足なんですけどこの方法(というか物理演算制御全般)使うとトラッキングソフトに付いてる「風」機能が使えません。顔ガッタガタになると思います。
風で動かせる物理演算パラメータを選択出来たら解決するのでアプデ期待ですね
あとやっぱりもっと効率化出来ると思うのでこういうの強い人任せた…
これはFacerig用なのでアレですがVtubestudio用だったら一部反転が使えるのでもっとシンプルな構造で済むと思います

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with 乾物ひもの(Kanbutsu Himono)🐟Live2Dモデラー (VTuberは休止中)

乾物ひもの(Kanbutsu Himono)🐟Live2Dモデラー (VTuberは休止中) Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @himono_vtuber

Jul 15, 2021
でもらーめんは食べる!美味しそう!
色々辛いトッピング頼めます 小袋で付いてきます
8番らーめんなので8種類の唐辛子を入れた「鬼辛」×5 (1個は既に入れた)

今まで2辛が最高なのでドキドキ
むしゃくしゃしてるから全部入れてやった
Read 4 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Don't want to be a Premium member but still want to support us?

Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Or Donate anonymously using crypto!

Ethereum

0xfe58350B80634f60Fa6Dc149a72b4DFbc17D341E copy

Bitcoin

3ATGMxNzCUFzxpMCHL5sWSt4DVtS8UqXpi copy

Thank you for your support!

Follow Us!

:(