サブルーチン駅前4時29分集合

プログラミングと散歩と数学に興味のある男のブログです。基本的に知識は浅いです。

【Blender】男顔進捗

Blenderで顔(一応若めの男性想定)で作っているのですが、なかなかうまくいきません。イラストを重ねてそれと合うように作っているのですが、何となく頭が長いような気がします。多分、アニメ風のイラストではかなり頭が長めに描かれているか、髪の毛に相当のボリュームをもたせているような気がします。髪の毛抜きの状態でモデリングすると、笑っちゃうくらい頭が長くなるので、なんか直感と違って調整が難しいんですよね。コーンヘッドみたいになって違和感が出てしまいます。f:id:zenkashiki011:20220125022207p:plain ↑今時点での進捗です。なんか頭長くない?…何回も見てるとわからないですが

進歩と「顕」

おはようございます。たねろうです。

1年くらい前からBlenderで人体を作っています。Youtubeにある英語の動画を見ながらちまちまと作っているのですが、最初の1体は非常に時間がかかりました。僕が飽き性なこともあり、本当に少しずつしかやっていなかったので半年ぐらいリアルでかかりました。「これは、大学卒業までにまともにアニメを作るのは厳しいかなあ…」と思うくらい果てしない時間がかかったのですが、2体目は1週間で作ることができました。そして、今3体目を作っているのですが、胴体部を一晩で作ることができるようになっていました。

Blenderで勉強してるときは、「こんなん覚えられるかよ…」とか「こんな手順多くて時間かかって無理ぽ…」とか思うのですが、何回も繰り返していくと短い時間でできるようになっていくので楽しいですね。

親指のウェイトの塗り方とボーンの曲げ方がわかりません、だれか助けてください

おはようございます。たねろうです。今日はBlenderの話です。

最近手のモデリングだけを集中的にやっているのですが、悩みが一つ。

親指のウェイトの塗り方がわかりません。正確に言うと、親指の一番付け根のところのボーンに関わるウェイトの塗り方がよくわからないのです。当然ここが塗れないと握りこぶしが作れなかったり剣を持たせたりすることができないので、非常に大切な部分なのですが…。

f:id:zenkashiki011:20211218144417p:plain

今は↑のように塗っています。一見そこそこ上手に動きそうな気がしますが、曲げると…

f:id:zenkashiki011:20211218144538p:plain

f:id:zenkashiki011:20211218144830p:plain

はい、あぼんです。↑の画像では、親指のボーンをグローバルのy軸(緑線)に沿って左側にくるように曲げていますが、ウェイトが乗っている部分が手の平より下に沈み込んでしまっています。当然親指を曲げたからと言って親指の付け根が陥没することは現実世界ではありません。何かが間違っているはずです。

そこで、ボーンの曲げ方を変えてみました。自分の親指を観察してみると、握りこぶしを作るように親指を曲げる際に親指は上から見ると小指側に、側面から見ると手のひら側に移動しています。よって、グローバル座標のZ軸とX軸をその方向に曲げてみると…

f:id:zenkashiki011:20211218150014p:plain

親指の付け根の膨らんだ部分はよさそうです。しかし

f:id:zenkashiki011:20211218150107p:plain

なんか人差し指側の手の側面のあたりがキモい感じになってしまいます。

実は、最初にやったやり方だとこの問題は発生しないんですね。

f:id:zenkashiki011:20211218150743p:plain

y軸のみに沿って曲げた場合上のようにいい感じになります。

したがって、①親指のつけ根を犠牲に側面が整う か ②側面を犠牲に親指の付け根が整う この二律背反が存在していることになります。現実世界では両方とも実現しているので、何か違う方法があるはずなのですが…。

そして、この分野に関しては何故か情報があまりありません。YoutubeGoogleで英語で検索しても、核心に迫るような情報はあまり出てきません。親指以外の4本の指に関してはたくさん情報が出てくるんですけどね…。みんなにとっては何でもない作業なのでしょうか?

自分の中の理屈として、「親指のボーンを現実世界の骨の動きにエミュレートすればうまくはずである。上二つはそのような動きを実現するような回転を行っているが、うまくいっていない。ということは、上二つ以外に望むような位置に移動するような回転の組(x,y,z)が存在するはずだろう」という考えを今持っています。ただ、理想の回転を実現するような回転の解(x,y,z)が何通りあるのかが知識不足がわからないのでモヤモヤしています。クオータニオンとかに詳しかったらもうちょっとわかるんでしょうけどね…。

とりあえず今は解剖学の動画とかで親指の回転の方向とかを調べています。

自分の中で解決策が見つかったら改めてご報告しようと思います。 キャー!

ラグランジュの未定乗数法についてよくわからないまま使っている

{おことわり}冒頭で説明するラグランジュの未定乗数法の概要は、学部2年時点でまともに説明を聞いていない文系が授業での扱いをもとになんとな~くで説明しているものです。数学的・経済学的正確さはたいへん犠牲になっています。「その技法をまともに理解する機会がないまま使っていてモヤモヤする」という趣旨の記事ですので、ご容赦ください。

 おはようございます。もうすぐ冬至なので日の短さを日々楽しんでいます。たねろうです。

 学部の授業で最近よく聞く単語に「ラグランジュの未定乗数法」があります。これは予算の制約がある状況で効用を最大化する問題を解くときに出てくる技法らしく、以下のような数式で表される問題を解くことができます。

\displaystyle{
\begin{gather}
    \max_{x_1,x_2}~ u(x_1,x_2) \\
    s.t.~~ p_1x_1+p_2x_2=Y
\end{gather}

}

この方程式に対して、制約条件の部分にλをかけて最大化する式に足し、

\displaystyle{
\begin{gather}
    L=u(x_1,x_2)+\lambda (p_1x_1+p_2x_2-Y) \\
\end{gather}
}

その関数に対して偏微分を変数分だけして=0にした方程式を解けば解が出るというわけです。

\displaystyle{
\begin{gather}
    \frac{\partial L}{\partial x_1}     =0 \\
    \frac{\partial L}{\partial x_2}     =0 \\
    \frac{\partial L}{\partial \lambda} =0
\end{gather}

}

 …という理解をしているのですが、実はこの技法に関して、僕は学部2年生時点で正式に習ってはいません。価格理論の授業などで「こうやると楽に計算できるから、こうやっといて」と言われるのみです。なぜこの方法で問題が解ける理由はもちろん知りませんし、+λと-λの違いはあるのかなど定式化の方法についてもよく知りません。授業によっては制約条件がもっと複雑な条件であるときもあるのですが、その時はなんとなくわちゃわちゃっと教授が式を立ててしまうのでよくわからずじまいです。

 基本的にうちの学部の学生がとる数学の授業は簡単な微積(sin,cos,ex微積など)と線形代数(連立方程式の解の存在条件くらいまで)しかないので、確かに多変数関数の理論については何とも微妙な立ち位置になってしまうのですよね。一部の人向けに多変数関数の理論の授業はあったのですが、ラグランジュ乗数法の理論にたどり着く前に終わってしまいましたし、文系にはなんか怖くてとりにくい授業でした。実際とってみるとそんなに辛い講義ではなかったですが…

 しかし、一応数学好きな僕としては全然自明じゃない方法をそれとして使い続けるのはちょっともやっとするところがあります。というか、この技法を初めて知った時「なんでこれで求まるんだよ」という不安すらありました。

 確かに学部の教程を考えると多変数関数の理論をラグランジュ未定乗数法に到達するくらいまで文系の学生に教えるというのもかなり大変な話なので、その辺に関しては「大学院とかに行く人は勉強してネ」というくらいにとどめるしかないんでしょうね。

 普通になんでこれで解けるのか、こんなエレガントな方法を導き出せる理論はどんなものなのかという興味自体もあるので、どっかのタイミングで勉強してみたいなー、と思っています。

 というわけで、今日も僕は宿題の効用最大化問題をカリカリとラグランジュの未定乗数法の式をなんとなくで立てるのでした…。早く納得して使えるようになりたい。  

エッジワースボックスをLaTeXで表示する方法

おはようございます。最近は専ら昼夜逆転しているたねろうです。

学部が盛大にバレそうな話題ですが、皆さん、エッジワースボックス描いてますか!

エッジワースボックスとは、一般均衡理論などでよく登場するx軸とy軸をそれぞれ2つ、逆方向にとった図のことです。説明だけだと多分わからないと思いますが、↓の図のやつです。経済学部生なら見たことがあるのではないでしょうか。

f:id:zenkashiki011:20211210164541p:plain

1か月くらい前にレポートでこの図を描く機会があったのですが、描き方がわからない!!!

非常に特殊なグラフなので、LaTeXだと当然すぐには描き方が見つかりません。Google先生に聞いても、日本語だとやり方がなかなか出てきません。結局レポートの問題を解く時間をグラフの書き方を検索する時間が大きく上回ってしまいました。別に手書きのやつをスキャンしてもOKだったのですが、なんとなくLaTeXで書きたくなってしまい、時間をとられました。

そこで、未来の経済学部生の時間の節約と備忘録のために、Latexでの簡単な出し方を記しておきます。

執筆にあたり、一部のコードなどThomas de Graaff氏の"Drawing Edgeworth boxes with LaTeX"のページを参考にしました。ありがとうございました。より詳細な情報をお求めの方はご参照ください。 thomasdegraaff.nl

コード

↓のコードを入れるとその下の画像のように出力されます。

\documentclass[dvipdfmx]{jsarticle}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{amsmath}

\begin{document}


\def\XMAX{3} %x軸の最大値
\def\YMAX{3} %y軸の最大値
\def\U{1} %効用の値
\def\Calpha{0.5} %コブダグラス関数の指数
\def\Cbeta{0.5} %別のコブダグラス関数の指数

\begin{tikzpicture}
    \begin{axis}[
            restrict y to domain=0:\YMAX,
            samples = 1000,
            xmin = 0, xmax = \XMAX, %x軸の幅を決める
            ymin = 0, ymax = \YMAX, %y軸の幅を決める
            xlabel=$x_{1A}$,
            ylabel=$x_{1B}$,
            axis y line=left, %y軸を左に寄せる
            axis x line=bottom, %x軸を下に寄せる
            y axis line style={->}, %軸の先端を矢印にする
            x axis line style={->}  %軸の先端を矢印にする
        ]

        % オレンジ色の曲線の式を表示
        \addplot[orange,samples = 1000]{\U^(1/(1-\Calpha))/x^(\Calpha/(1-\Calpha))};

        %点を打つ
        \node[label={180:{($\bar{x}_{1A},\bar{x}_{1B}$)}},circle,fill,inner sep=2pt] at (axis cs:2,1) {};

        %右下がりの点線を表示
        \addplot[domain=0.5:2.5,dotted]{-x+3};

        % 右上がりの青色の線を表示
        \addplot[blue,domain=0.5:2.5]{x};

    \end{axis}

    %x軸が左方向に伸び、y軸が下方向に伸びるように設定
    \begin{axis}[
            restrict y to domain=0:\YMAX,
            xlabel=$x_{2A}$,
            ylabel=$x_{2B}$,
            xmin = 0, xmax = \XMAX,
            ymin = 0, ymax = \YMAX,
            axis y line=right, %y軸を右に寄せる
            axis x line=top, %x軸を上に寄せる
            x dir=reverse, %軸の向きを反対にする
            y dir=reverse, %軸の向きを反対にする
            y axis line style={->},
            x axis line style={->}
        ]

        % 緑色の曲線の式を表示
        \addplot[green,samples = 1000]{\U^(1/(1-\Cbeta))/x^(\Cbeta/(1-\Cbeta))};

    \end{axis}
\end{tikzpicture}

\end{document}

f:id:zenkashiki011:20211210165446p:plain

このグラフは、まず普通の向きの軸でオレンジ色の曲線のグラフを描いたあと、そのグラフの上に逆向きにしたx軸とy軸とその軸の向きにしたがって描いた緑色の曲線のグラフを重ねて描いています。オレンジ色の曲線と緑色の曲線は関数として同じですが、軸の向きが逆なので180°回転しています。

使い方

一つ目の\begin{axis}~\end{axis}内にaddplotで指定したグラフは普通の方向に、2つ目の\begin{axis}~\end{axis}内に指定したグラフは180°逆方向に描画されます。

曲線の式は、30行目などのaddplotコマンドの{}内に{f(x)}の形で書きます。今回の例では、コブダグラス型の効用関数を入れています。陰関数の場合は必ず陽関数に直す必要があります。

例えば、コブダグラス型効用関数は通常、以下の(1)のように表されます。これは陰関数の形です。

\displaystyle{
x^{\alpha}_{a} x^{1-\alpha}_{b}=\bar{U}\tag{1}
}

{}内に入れる際は(2)の形に変形する必要があります。これは\displaystyle{
x _ {b}=(x _ {a}の式)
}の形なので、陽関数です。

\displaystyle{
x_{b}=\frac{\bar{U}^{\frac{1}{1-\alpha}}}{x_{a}^{\frac{\alpha}{1-\alpha}}}\tag{2}
}


addplotの{}内はこの形で式を書いてあります。この形ではαが式にたくさん出てくるので、値の変更を簡便にするために\defを使い変数を定義しています。αの値を変更したいときは、12行目の{}内の数字を変更すれば簡単に変更できます。 {}内にxを入れれば、y=xのグラフが描画できますし、いろいろな関数が表示可能です。まあ、エッジワースボックスならコブダグラス関数の出番が多いと思います。

x軸やy軸の最大値も、9,10行目の{}内の数字を変えて\XMAXと\YMAXの値を変更することで変更可能です。


みなさんもぜひこれを使ってグリグリとエッジワースしてみてください。
ああ、均衡均衡♡

ウェイトペイントは青くても油断するな

 こんにちは。蚊に刺されやすすぎて、夏にはいつも周囲の人に感謝されているたねろうです。

 

 今回はBlenderの話を少しします。

 この前ウェイトペイントを使って作業をしていたのですが、何故か青い(=ウェイトがないはずの)部分がボーンに追従していました。それも、わずかにではなく、割とちゃんと動いていました。あれ?と思い、Nボタンで右上に出てくるところ→[Item]→[Vertex Weight]を見ると、0.03ぐらいの値になっていました。

 

 この値でそんなに動くかねと思ったのですが、きちんと0にしたら直りました。びっくり。遠いボーンにうっかり追従している場合は、思ったより動きが大きくなることもあるのですね…。Blenderのせいにするところでした。

初人体モデリング、完成(出来はひどい)

 こんにちは。関東は雨がザァザァ降っています。雨が降っても降らなくても家からは出ないたねろうです。

 

 今回はBlenderの記事です。やっと、やっと人体モデリングの一体目が完成いたしました。英語のYoutubeを見ながら、えっちらおっちらやりました。マジで1年以上かかりました。

 だけど、なんか違う。いろいろと形がおかしい。モデリング初心者の私として、どこから手をつければよいかすらわかりません。なんか見れば見るほど、どこもおかしいような気がしてきます。

 まあ、解剖学の勉強をしながら、ゆっくりやります。早くアニメーションに移りたい…

 

f:id:zenkashiki011:20210703032447p:plain

(致命的にひどいわけではないが、なんか足りない)