daruma3940の日記

理解や文章に間違い等あればどんなことでもご指摘お願いします

変分原理について

光はどのようなルートを通るのか(フェルマーの原理

フェルマーの原理とは

光は、到達時間が停留値になる経路を通る

という主張をしている原理です。詳しく見てゆきましょう。光の到達時間について考えるために光の進みにくさを表す関数$n(x)$を定義します。

$$ n(x) \equiv \frac{c}{v(x)} $$

ここで$v(x)$は物質を通り抜ける際の光の速度で、$c$が真空における光の速度です。この$n(x)$は真空に対して光が進みにくいかを表す関数であり今後$n(x)$を「屈折率」と呼ぶことにします。この進みにくさ$n(x)$を加味したうえで、光がある点Pから点Qまで通り抜けるの感じる距離は $$ L_{op}=\int_{P}^{Q} n(x) dl $$ と表現されます。「真空中でどれだけの距離を進んだのと同じ効果を持つか」と言い換えても良いかもしれません。光はこの値$L_{op}$が停留値つまり一階変分がゼロになるようなルートを通るということが分かっています。 $$ \delta L_{op} = \delta \int n(x) dl =0 $$

屈折率を変えた時の最短航路シミュレーションがあります。 これを見ると光は移動距離が極小となるような道筋を取るということがどういうことかはわかると思います。

また注意すべきこととしては極小だけではなく、光路長が極大となるようなルートも可能であるということを忘れてはいけません。$L_{op}$の関数形状が谷であろうが山であろうが鞍点であろうがそのような光の経路は許されます。とはいえ、$L_{op}$ の関数形状は一般に谷状の下に凸な関数形状であり、極大や鞍点というのはなかなか出てこないようです。(極大や鞍点というのはなかなか出てこないのになぜ極小ではなく停留値だということが分かったのか?謎ですね。極大や鞍点となるような光の経路はどのように見えるのか?これを調べるのは今後の課題とさせてください。

力学にもフェルマーの原理は存在するのか(変分原理)

それでは物体の運動もフェルマーの原理のように「なんらかの値」の停留値を取るように運動しているのでしょうか?この場合の光路長に対応するものは何なのでしょうか?? 「光路長$L_{op}$」は力学において「作用$S$」と呼ばれる量に対応します。「作用」が停留値を取るように物体は運動するということが先人たちにより判明しています。これを「変分原理」と呼びます。 $$ \delta S =0 $$ では「作用」とは何なのでしょうか。作用は「ラグランジアン」の時間積分です。 $$ S= \int L dt $$ じゃあラグランジアンってのは何なんだよ。ここが今回の話の肝です。古典力学においてラグランジアンは運動エネルギー$T$ ,位置エネルギー$V$を用いて $$ L = T-V $$ と表現されます。ここから先は「変分原理」をニュートンの運動方程式、シュレーディンガー方程式、マクスウェル方程式のバックグラウンドにある共通した原理だと考え、運動エネルギー$T$や位置エネルギー$V$の具体的な形を代入してみたり、場合によっては別の項をラグランジアンに加えたりしながら、そこから基礎方程式が本当に導かれるのかを確認していきます。 なお、ここで「作用」という言葉を用いましたが「作用・反作用の法則」の作用ではありません。またこの「変分原理」のことは一般に「最小作用の原理」と呼ばれるのですが、最小ではなく停留値です。 すべてがややこしいです。

①変分原理⇒ニュートンの運動方程式

ニュートンの運動方程式の場合の運動エネルギー$T$と位置エネルギー$V$の具体形を考えてゆきます。 今回は高校物理で良く出てくる例であるバネ定数$k$のバネにつながれた質量$m$の質点の運動が変分原理から出てくるか確かめたいと思います。この時の運動エネルギー$T$は$\frac{1}{2}m\dot{x}^2$、位置エネルギー$V$は$\frac{1}{2}kx^2$だったことを思い出してください。つまりラグランジアンは以下のようになります $$ L = T-V=\frac{1}{2}m\dot{x}^2 - \frac{1}{2}kx^2 $$

作用$S$は通常の関数(「値」を入力し「値」を出力するもの)とは異なり、「関数」を入力し「値」を出力する関数であり、これを汎関数と呼び、$S[x]$と書きます。汎関数の微分を行うために作用$S$の変分を考えるために経路の端(始点と終点)を固定したまま経路を一瞬微小に変化させることを考えます。,経路の始点の時刻を$t_1$終点の時刻を$t_2$、微小な変化$h$が加わる時刻を$\tau$を用いて以下のように表現しましょう。

$$ x(t) \to x(t) + h \delta(t-\tau) $$ ただし$\delta (\tau)$はデルタ関数です。$S[x]$に対する汎関数微分は以下のように表現されます。

$$ \frac{\delta S[x]}{\delta x (\tau)} =\lim_{h\rightarrow 0} \frac{S[x(t)+h\delta (t-\tau)]-S[(x)]}{h} $$

これを実際に行ってゆきましょう。

$$ S[x] = \int_{t_1}^{t_2} \left( \frac{1}{2}m\dot{x}^2 - \frac{1}{2}kx^2 \right) dt $$

より $$ S[x+h\delta] =\int_{t_1}^{t_2} \left[ \frac{1}{2}m(\dot{x}+h \dot{\delta})^2 -\frac{1}{2}k(x+h\delta)^2 \right]  dt $$ となります。この後の計算で$h$によって割り算されたのちに$h \rightarrow 0$の極限が取られることを考慮して$h$の一時まで展開します。

$$ S[x+h\delta] =S[x]+h \int dt \left[ m\dot{x}\,\dot{\delta}-k x\,\delta\right]+ O(h^2) $$ したがって

$$ \frac{S[x+h\delta]-S[x]}{h} =\int_{t_1}^{t_2} dt \left[ m\dot{x}\,\dot{\delta} -k x\,\delta \right] $$

ここで積の微分法則 $$d(fg)=gdf+fdg$$を積分した $$ \int d(fg)= [fg] =\int g df + \int f dg $$ を用いる(今後この手法を部分積分と呼びます)と

$$ m \int_{t_1}^{t_2} d( \delta \dot{x}) = m[ \delta \dot{x} ]_{t_1}^{t_2} =m\left( \int_{t_1}^{t_2} dt \dot{x}\,\dot{\delta} + \int_{t_1}^{t_2} dt \ddot{x}\,\delta \right) $$

となります。ここで端点は固定されているので境界項$\left[\delta \dot{x}\right]_{t_1}^{t_2}$はゼロになります。よって

$$ \int_{t_1}^{t_2} dt m \dot{x}\,\dot{\delta}=- \int_{t_1}^{t_2} dtm \ddot{x}\,\delta $$

となり $$ \frac{S[x+h\delta]-S[x]}{h}=\int^{t_2}_{t_1} dt \left[ - m\ddot{x}-k x\right]\delta(t-\tau) $$

と変形されます。デルタ関数は$t=\tau$のときのみ1になる関数なので

$$ \frac{\delta S}{\delta x(\tau)} =\int^{t_2}_{t_1} dt \left[ - m\ddot{x} -k x\right] \delta(t-\tau)=- m\ddot{x}(\tau)-k x(\tau) $$ また変分原理から $$ \frac{\delta S}{\delta x(\tau)} =- m\ddot{x}(\tau)-k x(\tau)=0 $$ なので

$$ m\ddot{x} = - kx $$

これにより高校物理で出てくる例であるバネ定数$k$のバネにつながれた質量$m$の質点の運動が変分原理から出てくることが確かめられました。


②変分原理⇒シュレーディンガー方程式

変分原理からそのままシュレーディンガー方程式を出しても良いのですが、今回はファインマンの経路積分を経由て導出したいと思います。

ファインマンの経路積分

粒子がある座標と位置$(x_0,t_0)$から別の位置$(x_1,t_1)$に遷移する確率の振幅はこの2つの位置が「非常に近い時」 $$ \bra{ x_1,t_1 }\ket{x_0,t_0} = \sqrt{\frac{m}{2 \pi i \hbar dt }} \exp( \frac{i}{\hbar} \int_{t_0}^{t_1} L dt) $$

に対応するということが分かっています。ここで出てきた$L$というのはこれまでの計算で出てきたラグランジアンであり、$\int_{t_0}^{t_1} L dt$は作用$S$です。これの証明は略します。

では位置$(x_0,t_0)$から別の位置$(x_1,t_1)$が近くないときはどうすればよいのでしょうか?間に点を挟み込んでゆくことで、微小に近い点を取り扱えばよい形にしてゆきます。完全性関係$\hat{I} =\int da \ket{a}\bra{a}$を上式に用いてゆきます。

$$ \bra{x_n,t_n}\ket{x_0,t_0} = (\frac{m}{2 \pi i \hbar dt })^{\frac{N-1}{2}} \int dx_{n-1} ... \int dx_1 \bra{ x_n,t_n }\ket{x_{n-1},t_{n-1}}... \bra{ x_1,t_1 }\ket{x_0,t_0} $$

これにより2つの位置が非常に近い時に使える式を使うことが可能になり、

$$ \bra{x_n,t_n}\ket{x_0,t_0} = (\frac{m}{2 \pi i \hbar dt })^{\frac{N-1}{2}} \int dx_{n-1} ... \int dx_1 \Pi^{N}_{n=1} \exp(\frac{i}{\hbar} \int_{t_n}^{t_{n-1}} L dt )=(\frac{m}{2 \pi i \hbar dt })^{\frac{N-1}{2}} \int dx_{n-1} ... \int dx_1 \exp(\frac{i}{\hbar} S ) $$

と遷移する確率の振幅を表現できます。この操作の意味を考えるとするなら「ありうる限りの$(x_0,t_0)$から$(x_1,t_1)$の間に挟まる点を考えてすべての間の点を通る経路を考えてその遷移確率振幅を足し上げている」ということであり、これが経路積分ということになります。

ここでこのファインマンの経路積分から微小時間発展要素を取り出すという回りくどいことをして経路積分がシュレーディンガー方程式を導き出すことが出来ることを示します。(これは本来ファインマンの経路積分形式がシュレーディンガーの波動関数形式と等価であることを示すものです。)

まずはファインマンの経路積分から微小時間発展要素を取り出します。 $$ \bra{x_N,t_N}\ket{x_1,t_1} = (\frac{m}{2 \pi i \hbar Δ t })^{\frac{1}{2}} \int dx_{N-1} exp \left[ (\frac{im}{2 \hbar} ) \frac{ (x_N -x_{N-1})^2 }{Δ t} - \frac{iV(x) Δ t}{\hbar} \right]\bra{ x_{N-1},t_{N-1} }\ket{x_1,t_1} $$

この式において$x_{N} \rightarrow x$、$x_{N-1} \rightarrow x - \xi$、$t_{N} \rightarrow t+ Δt$,$t_{N} \rightarrow t$と変数を置き直します。

$$ \bra{x,t+Δt}\ket{x_1,t_1} = (\frac{m}{2 \pi i \hbar Δ t })^{\frac{1}{2}} \int d\xi exp \left[ (\frac{im}{2\hbar} ) \frac{ \xi^2 }{Δ t} - \frac{iV(x) Δ t}{\hbar} \right] \bra{ x - \xi ,t }\ket{x_1,t_1} $$

$\xi$と$Δt$が微小であることを考慮し、$\bra{ x - \xi ,t }\ket{x_1,t_1}$と$\bra{x,t+Δt}\ket{x_1,t_1}$と$exp \left[ - \frac{iV(x) Δ t}{\hbar}\right]$をそれぞれに対してテーラー展開します。ただし$\int d\xi \xi exp(i \xi^2)$に比例する項は奇関数であり積分すると消えるので無視します。

$$ \bra{x,t}\ket{x_1,t_1} +Δt \frac{\partial}{\partial t} \bra{x,t}\ket{x_1,t_1}= (\frac{m}{2 \pi i \hbar Δ t })^{\frac{1}{2}} \int d\xi exp \left[ (\frac{im}{2\hbar} ) \frac{ \xi^2 }{Δ t} \right] (1 - \frac{iV(x) Δ t}{\hbar}+ ...) \left[ \bra{ x ,t }\ket{x_1,t_1} +\frac{\xi^2}{2} \frac{\partial^2}{\partial x^2} \bra{ x ,t }\ket{x_1,t_1} \right] $$

ここで$Δ t$の2次の項以降は微小すぎて無視するに値するとして式を変形します。 またガウス積分公式を使います。

$$ \int d\xi \xi^2 \exp(\frac{i m \xi^2}{2 \hbar Δt }) = \sqrt{2 \pi} (\frac{i\hbar Δt}{m})^{3/2} $$

すると上式は以下のようになります。

$$ Δt \frac{\partial}{\partial t} \bra{x,t}\ket{x_1,t_1} =(\frac{m}{2 \pi i \hbar Δ t })^{\frac{1}{2}} \sqrt{2 \pi} (\frac{i\hbar Δt}{m})^{3/2} \frac{1}{2} \frac{\partial^2}{\partial x^2} \bra{x,t}\ket{x_1,t_1} -\frac{i}{\hbar} Δt V\bra{x,t}\ket{x_1,t_1} $$

この式を変形することにより下式を得ます。これはシュレーディンガー方程式です。

$$ i \hbar \frac{\partial}{\partial t} \bra{x,t}\ket{x_1,t_1}=-\frac{\hbar^2}{2m} \frac{\partial^2}{\partial x^2} \bra{x,t}\ket{x_1,t_1}+V\bra{x,t}\ket{x_1,t_1} $$

この計算には変分原理が出てきませんでした。しかしあらゆる経路を考慮する計算の中でどのような経路が主に経路積分に寄与するのか評価してみると話が変わってきます。リーマン-ルベーグの補題というのがあります。 (坂本眞人 場の量子論Ⅱ 4.散乱行列の一般的性質とLSZ簡約方式 4.4 漸近条件と弱極限 4.4.4 リーマン-ルベーグの補題 p.85)

$$ \lim_{t\rightarrow \infty } \int_{a}^b dx f(x) \exp(itx) =0 $$

つまりexpの中身である位相の変化が激しい経路の経路積分のへ寄与はゼロになります。これはすなわち経路積分において位相の変化が緩やかなところつまり$\delta S \simeq 0$となるところの寄与が大きくなることを意味しています。もし$\delta S = 0$だけを抜き出してきた場合、これは「変分原理」が成立する経路のみからの影響を考慮するという意味であり、古典力学的な経路からの影響だけを考慮することになります。というような形で「変分原理」とのつながりを見ることが出来ます。 (普通は変分原理からシュレーディンガー方程式を導く場合、経路積分を使わずにもっと直接的に導出しますが経路積分が好きだったので寄り道してみました。)

(JJサクライ 現代の量子力学(上) 2章 量子ダイナミクス 2.6 プロパゲーターとファインマンの経路積分)

③変分原理 ⇒マクスウェル方程式

マクスウェル方程式を導くためのラグランジアンについて考えます。 前回までと違うのはマクスウェル方程式は$E(x,t)$のようなものを求める方程式、つまり座標と時間が引数になっている理論であるため、力学的変数が座標$x(t)$であった前回までとは違い空間的な密度のようににラグランジアンが計算されるということです。 この$\mathcal{L}$をラグランジアン密度と呼びます。 $$ S= \int dt \int dx \mathcal{L} $$

では具体的にラグランジアン密度を表してゆきましょう。 まず真空における電磁場のラグランジアン密度は以下のようになります。(坂本眞人場の量子論1 9.6 ゲージ場の作用積分 p.257) $$ \mathcal{L} =\frac{1}{2} (E^2 -B^2) $$ ここで一項目は電場のエネルギー密度、2項目は磁場のエネルギー密度です。 ここから真空におけるマクスウェル方程式を導いてゆきます。

ラグランジアンを見てわかるようにこのままE,Bを変数として、$\delta S/\delta E =0$、$\delta S/\delta B=0$、としても $E=0,B=0$という解しか存在しないことになります。 ここから先は電場E,磁場Bを生み出す源である電位(スカラーポテンシャル)$\phi(x,t)$とベクトルポテンシャル$A(x,t)$を用いて計算を進めてゆきます。

$$ E= - grad \phi - \partial_t A $$

$$ B=rot A $$ (砂川重信 理論電磁気学p.46)

ベクトル解析という数学の分野の知識を用いることで$div (rot A )=0$であることが分かるので磁場$B$について $$ div B=0 $$ が成り立ちます。また電場についても$rot (grad \phi)=0$と$rot A = B$を用いることで、$E=- \nabla \phi - \partial_t A$は以下のように変形できます。 $$ rot E + \partial_t B =0 $$

これらはラグランジアン密度からではなくスカラーポテンシャルとベクトルポテンシャルを用いた電場$E$と磁場$B$の定義から出てきていることに注意してください。4本あったマクスウェル方程式のうち2本が電場と磁場のくスカラーポテンシャルとベクトルポテンシャルを用いた表記から出てきているため、ラグランジアン密度からは残りの2つが出てくることを期待します。

場のオイラー=ラグランジュ方程式

これまでの変数は座標 $q(t)$ だった場合の作用は $$ S[q]=\int L(q,\dot q,t)\,dt $$

でした。何度でも言いますが場の理論では、変数が$x$ではなく $\phi(x)$ になります。その場合の作用は以下のように記述されます。

$$ S[\phi]=\int d^4x\,\mathcal{L}\bigl(\phi,\partial_\mu\phi\bigr) $$

ここで$d^4x = dt\,d^3x$です。これの変分を考えます。

$$ \phi(x) \rightarrow \phi(x) + \delta\phi(x) $$

この場合作用の変化は $$ \delta S=\int d^4x\left(\frac{\partial \mathcal{L}}{\partial \phi}\delta\phi+\frac{\partial \mathcal{L}}{\partial (\partial_\mu\phi)}\partial_\mu(\delta\phi)\right) $$

となります。第二項を部分積分します。

$$ \int d^4x \frac{\partial \mathcal{L}}{\partial (\partial_\mu\phi)}\partial_\mu(\delta\phi)=\int d^4x\partial_\mu\left(\frac{\partial \mathcal{L}}{\partial (\partial_\mu\phi)}\delta\phi\right)-\int d^4x\partial_\mu\left(\frac{\partial \mathcal{L}}{\partial (\partial_\mu\phi)}\right)\delta\phi $$

第一項は境界項であり、経路の始点と終点を固定した状態で取りうる経路を考えているという前提から境界項は消えます。つまり$\delta\phi|_{\text{境界}}=0$です。よって$\delta S$は以下のようにまとめることが出来ます。

$$ \delta S=\int d^4x\left[\frac{\partial \mathcal{L}}{\partial \phi}-\partial_\mu\left(\frac{\partial \mathcal{L}}{\partial (\partial_\mu\phi)}\right)\right]\delta\phi $$

変分原理$\delta S=0$が任意の $\delta\phi$ に対して成立するためには

$$ \boxed{\frac{\partial \mathcal{L}}{\partial \phi}-\partial_\mu\left(\frac{\partial \mathcal{L}}{\partial (\partial_\mu\phi)}\right)=0} $$

でなければなりません。この式はオイラー=ラグランジュ方程式と呼ばれます。 (坂本眞人 場の量子論 不変性と自由場を中心にして p.239)

真空におけるラグランジアン密度

まずは簡単な場合として真空(電荷密度$\rho=0$かつ電流密度$j=0$)の場合を考えましょう。この場合のラグランジアン密度は以下のようになります。

$$ \mathcal{L}=\frac{1}{2} (E^2 - B^2) $$

これの変分を計算してゆきます。

$$ E= - grad \phi - \partial_t A $$ $$ B=rot A $$ であり、すでにマクスウェル方程式の4つの式のうち $$ div B=0 $$ と $$ rot E + \partial_t B =0 $$ は$\phi$と$A$を用いることにより求めることが出来ていることを忘れないようにしましょう。


$\phi$で変分

$L$は$\phi$に直接依存せず、$E$を通して$\nabla \phi$の形でしか$L$に現れません。

$L$は$\phi$に直接依存しないので $$ \frac{\partial\mathcal L}{\partial\phi}=0 $$ であり$\nabla \phi$に関しては

$$ \frac{\partial \mathcal L}{\partial(\partial_i\phi)}=\frac{\partial \mathcal L}{\partial E_j}\frac{\partial E_j}{\partial(\partial_i\phi)} $$ であるのでこれを計算してゆきます。

$$ E= - grad \phi - \partial_t A $$

を成分表示すると、

$$ E_i=-\partial_i\phi-\partial_t A_i $$

なので

$$ \frac{\partial E_j}{\partial(\partial_i\phi)}=-\delta_{ij} $$

よって

$$ \frac{\partial \mathcal L}{\partial(\partial_i\phi)}=\frac{\partial \mathcal L}{\partial E_j}\frac{\partial E_j}{\partial(\partial_i\phi)}=E_j(-\delta_{ij}) $$

ここでオイラーラグランジュ方程式から

$$ \partial_i E_i=0 $$ つまり $$ \boxed{\nabla\cdot E=0} $$ であり、これは真空($\rho=0$)の場合のガウスの法則を導くことが出来たことになります。


$A$で変分

$E$と$B$を成分表示すると $$ E_i=-\partial_i\phi-\partial_t A_i $$

$$ B_i=\epsilon_{ijk}\partial_jA_k $$

となります。ここから分かることとしてラグランジアンは$A_i$には直接依存せず、$\partial_t A_i,\quad \partial_j A_i$という形で依存することとなります。なので $$ \frac{\partial \mathcal L}{\partial A_i}=0 $$ であり、オイラーラグランジュ方程式を計算するためには残りの $$ \frac{\partial\mathcal L}{\partial(\partial_tA_i)}=\frac{\partial\mathcal L}{\partial E_j}\frac{\partial E_j}{\partial(\partial_tA_i)} $$

$$ \frac{\partial\mathcal L}{\partial(\partial_jA_i)}=\frac{\partial\mathcal L}{\partial B_k}\frac{\partial B_k}{\partial(\partial_jA_i)} $$

を計算する必要があります。

$$ \frac{\partial\mathcal L}{\partial E_j}=E_j $$

$$ \frac{\partial\mathcal L}{\partial B_k}=-B_k $$

$$ \frac{\partial E_j}{\partial(\partial_t A_i)}=-\delta_{ij} $$

$$ \frac{\partial B_k}{\partial(\partial_jA_i)}=\epsilon_{kji} $$

であるので

$$ \frac{\partial\mathcal L}{\partial(\partial_tA_i)}=\frac{\partial\mathcal L}{\partial E_j}\frac{\partial E_j}{\partial(\partial_tA_i)}=E_j(-\delta_{ij}) $$

$$ \boxed{ \frac{\partial\mathcal L}{\partial(\partial_tA_i)}=-E_i } $$ また $$ \frac{\partial\mathcal L}{\partial(\partial_jA_i)}=\frac{\partial\mathcal L}{\partial B_k}\frac{\partial B_k}{\partial(\partial_jA_i)}=(-B_k)\epsilon_{kji} $$

$$ \boxed{\frac{\partial\mathcal L}{\partial(\partial_j A_i)}=-\,\epsilon_{kji}B_k} $$

これらをオイラーラグランジュ方程式に代入することにより $$ \frac{\partial \mathcal L}{\partial A_i} -\partial_t \left(\frac{\partial \mathcal L}{\partial(\partial_tA_i)}\right) -\partial_j\left(\frac{\partial \mathcal L}{\partial(\partial_jA_i)}\right)=0 $$

$$ \partial_tE_i+\epsilon_{kji}\partial_jB_k=0 $$ つまり $$ \boxed{ \nabla\times B=\partial_tE } $$ が得られます。 これによって真空(電荷密度$\rho=0$かつ電流密度$j=0$)の場合のマクスウェル方程式が導かれました。

(坂本眞人 場の量子論 不変性と自由場を中心にして p.257)


電荷密度$\rho$と電荷密度$j$が存在する場合

電荷密度$\rho$と電荷密度$j$が存在する場合、電磁場はそれらと相互作用するため、ラグランジアン密度に相互作用項を追加する必要があります。そのラグランジアン密度は以下のようになります。 $$ \mathcal L=\underbrace{\frac12(E^2-B^2)}_{\text{電磁場の自由ラグランジアン}}+\underbrace{(\rho\phi-j\cdot A)}_{\text{相互作用項}} $$

この相互作用項の影響で先ほどの計算でゼロとなっていた$\frac{\partial\mathcal L}{\partial\phi}$と$\frac{\partial\mathcal L}{\partial A_i}$は値を持つようになります。 $$ \frac{\partial \mathcal L}{\partial \phi}=\rho $$

$$ \frac{\partial \mathcal L}{\partial A_i}=- j_i $$

結果として $$ \boxed{\nabla\cdot E=\rho} $$

$$ \boxed{\nabla\times B=j+\partial_t E} $$

となり、変分原理からマクスウェル方程式を導くことが出来たました。


変分原理すごいぜ!

変分原理大好き!変分原理すごいぜ!みんなありがとう!でもさぁ実験でそれを確かめることもできない人間が数式をいじって変分原理から基本方程式を導き出したとしてもそれって陰謀論とどう違うんですか?(ぶち壊し)

(疑問)「確かに変分原理から古典や電磁気の方程式が出るが、そうなるように恣意的に作用を選んでいるだけなのでは」

半分はYESと言えます。なぜならラグランジアンや作用というのは光でいうところの「フェルマーの原理」と同じようなものを見つけるために作られた値であり、ラグランジアンが物理的に意味するところを考えてみても$T+V$であれば全エネルギーとして解釈ができるのですが、$T-V$であるためそのように解釈することが出来ません。つまり人為的な量です。しかし、もう半分はNOだとも言えます。なぜならラグランジアンは人為的に作られた量ではありますが、それに加えられる項に制限があり、それらの制限が物理の基本方程式を形作っていると解釈できるからです。 例えば

  • 不変性(空間並進対称性・時間並進対称性・回転対称性・相対論的不変性・ゲージ対称性など)
  • エルミート性
  • 局所性
  • 真空の存在
  • くりこみ可能性

といった制限があります。これらの制限を満たす形でラグランジアンを書こうとすると、その形はほとんど一意的に定まってしまいます。そして、その停留条件から導かれる方程式こそが、ニュートン方程式やマクスウェル方程式といった基本方程式になります。...ということが参考にしている文献である「坂本眞人 場の量子論」で主張されているのですが、深く理解できているとは言えないので今後の宿題とさせてください。 ( 坂本眞人 場の量子論 不変性と自由場を中心にして 9.3 作用積分の一般要請 p.244 p.263)

参考文献

  • メシア『量子力学 I』東京図書 (1971)
  • J J サクライ『現代の量子力学 上』吉岡書店 (1985)
  • 坂本眞人『場の量子論 不変性と自由場を中心にして』裳華房 (2014)
  • 前野昌弘『よくわかる特殊相対論』東京図書 (2024)
  • 砂川重信『理論電磁気学』紀伊國屋書店 (1999)
  • R P ファインマン『光と物質のふしぎな理論 私の量子電磁力学』岩波書店 (1987)

光路長の極値について

フェルマーの原理

フェルマーの原理とは

光は、到達時間が停留値になる経路を通る

という主張をしている原理です。詳しく見てゆきましょう。光の到達時間について考えるために光の進みにくさを表す関数$n(x)$を定義します。

$$ n(x) \equiv \frac{c}{v(x)} $$

ここで$v(x)$は物質を通り抜ける際の光の速度で、$c$が真空における光の速度です。この$n(x)$は真空に対して光が進みにくいかを表す関数であり今後$n(x)$を「屈折率」と呼ぶことにします。この進みにくさ$n(x)$を加味したうえで、光がある点Pから点Qまで通り抜けるの感じる距離は

$$ L_{op} = \int_{P}^{Q} n(x)\, dl $$

と表現されます。「真空中でどれだけの距離を進んだのと同じ効果を持つか」と言い換えても良いかもしれません。光はこの値 $L_{op}$ が停留値つまり一階変分がゼロになるようなルートを通るということが分かっています。 $$ \delta L_{op} = \delta \int n(x) dl =0 $$

屈折率を変えた時の最短航路シミュレーションがあります。これを見ると光は移動距離が極小となるような道筋を取るということがどういうことかはわかると思います。

注意すべきこととして光路長は「極小」だけではなく、「極大」や「鞍点」となるようなルートも可能であるということを忘れてはいけません。$L_{op}$の関数形状が谷であろうが山であろうが鞍点であろうがそのような光の経路は許されます。

光路長が極小となるような経路は説明などで見たことがあったのですが、極大や鞍点となるような光の経路とはどのような経路でどのように目に映るのかを見たことがありませんでした。これを今回取り扱ってゆこうと思います。

実験環境設定とレンダリング結果

「Blender」というフリーのレンダリングエンジンがあるのでそれを用いて光の経路をレンダリングしてみようと思います。

「光源とカメラ両方を鏡面球の中に入れたとき、球面から反射してカメラに入ってくる光の中にはは光路長の極大点もあるだろう」という考えのもと実験環境を作成します。球鏡面の中心を原点にし半径を$R$、カメラ位置を$(0,a,0)$、光源位置を$(0,-a,0)$に設定し、反射された光を見てみようと思います。

Blenderでの配置は下のような感じです。 カメラのFOVは広めに設定(球の頂点と底が視界に入るように)

パストレースにおける最大バウンス数は2(光源->ミラー->カメラの光を見たいので)

レンダリング結果

中心に点があるリング状の光がレンダリングされていることが分かります。

光路長を解析計算

球面上の点$P$を

$$ P=(R \sin \theta \sin \phi ,R \sin \theta \cos \phi ,R \cos \theta ) $$ とします。ここで$0<\theta<\pi$ 、$0<\phi <2\pi$です。 光路長を$L$とすると$L$は以下のようにあらわされます。

$$ L( \theta , \phi)
= \sqrt{|A-P|^2} + \sqrt{|P-B|^2} $$ $$ = \sqrt{(R \sin \theta \sin \phi)^2 +(R \sin \theta \cos \phi +a)^2 +(R \cos \theta)^2}
+ \sqrt{(R \sin \theta \sin \phi)^2 +(R \sin \theta \cos \phi - a)^2 +(R \cos \theta)^2}
$$ $$ = \sqrt{R^2 + a^2 +2aR\sin \theta \cos \phi} \quad + \sqrt{R^2+ a^2 -2aR\sin \theta \cos \phi}
$$

ここで計算を簡単にするために$X \equiv R^2 +a^2 (定数)$と$Y(\theta,\phi) \equiv 2aR \sin \theta \cos \phi$という変数を用意しておくと、 $$ L(Y) =\sqrt{X+Y} +\sqrt{X-Y} $$ となります。ここから光路長の微分を計算することで停留点を計算してゆきます。

光路長の停留値を計算

$\frac{\partial L}{\partial \theta} =0$と$\frac{\partial L}{\partial \phi} =0$をみたすような$\theta$と$\phi$を求めることで、光路長の停留値を満たすような光の経路を求めてゆきます。 $$ \frac{\partial Y}{\partial \theta}= 2aR \cos \theta cos \phi $$ $$ \frac{\partial Y}{\partial \phi}= -2aR \sin \theta sin \phi $$ $$\frac{\partial L}{\partial X} =\frac{1}{2} (X+Y)^{-1/2} +\frac{1}{2} (X-Y)^{-1/2}$$

$$ \frac{\partial L}{\partial Y} =\frac{1}{2} (X+Y)^{-1/2} -\frac{1}{2} (X-Y)^{-1/2} $$

$$ \frac{\partial X}{\partial \theta} =\frac{\partial X}{\partial \phi} =0 $$

より、 $$ \frac{\partial L}{\partial \theta} = \frac{\partial L}{\partial Y} \frac{\partial Y}{\partial \theta} = aR \cos \theta \cos \phi \left( (X+Y)^{-1/2} - (X-Y)^{-1/2}\right) $$ $$ \frac{\partial L}{\partial \phi} = \frac{\partial L}{\partial Y} \frac{\partial Y}{\partial \phi} = -aR \sin \theta \sin \phi \left( (X+Y)^{-1/2} - (X-Y)^{-1/2}\right) $$

よって $\frac{\partial L}{\partial \theta} =0$を満たすのは $$ \cos \theta =0, \cos \phi =0, Y=0 $$ $\frac{\partial L}{\partial \phi} =0$を満たすのは $$ \cos \theta =0, \sin \phi =0, Y=0 $$

となります。

これら2つを両方矛盾なく満たす$\theta$と$\phi$を求めてゆきます。

①$\cos \phi =0$のとき

$\phi=\pi/2もしくは$$3\pi/2$ この時$Y(\theta,\phi) \equiv 2aR \sin \theta \cos \phi$より$Y=0$となるのでLはXのみに依存し、$L=2\sqrt{R^2+a^2}$で定数になります。 これは$y=0$平面であり、$\theta$に依存しません。

② $\cos \theta =0$のとき

$\theta=\pi/2$です。この時$L=2\sqrt{R^2+a^2}$であり、これを満たすのは$\phi = \pi / 2$もしくは$3 \pi / 2 $になります。

③ $\sin \phi =0$のとき

$\phi=0もしくは$$\pi$ の時$Y= ±2aRsin\theta$ $\cos \theta =0$の時は$\theta=\pi/2$ $\sin \theta =0$の時は$Y=0$であるので天頂と真下だけです。

④$Y =0$のとき

$sin \theta=0$もしくは$\cos \phi=0$となりますが、$Y=0$かつ$\cos \phi=0$は既に考えてあるので、$sin \theta=0$の場合を考えます。この時$\theta=0,\pi$であり、$L=2\sqrt{R^2+a^2}$であり、これを満たすのは天頂と真下だけです。

これらのケース(重複がありましたが)をまとめると光路長が停留地となるのは - ライトからカメラまでまっすぐの経路($\cos \phi =0$) - $y=0$平面で反射する経路

となります。Blenderでレンダリングした結果と比較してみると「ライトからカメラまでまっすぐの経路」が画面中央の点で、 「$y=0$平面で反射する経路」が円環に対応することが分かります。この円環を画面に収めるためにFOVを大きめに設定していたというわけです。

停留地の安定性解析

ここからこれらの停留値の安定性解析をしてゆきます。我々が興味があるのは光路長の山もしくは鞍点であるので負の固有値を持つヘッシアンが出てきてくれることを祈りましょう。「ヘッシアンってなんだよ」と思われた方も安心してください。大昔数学でやったことのあるであろう「増減表」を2次元空間で書くだけです。ヘッシアンの計算には以下の情報が必要になります。

$$ \frac{\partial^2 L}{\partial \phi^2 }, \frac{\partial^2 L}{\partial \theta^2 }, \frac{\partial^2 L}{\partial \theta \partial \phi } $$

これを具体的に計算してゆきます。

$$ \frac{\partial^2 L}{\partial \phi^2 } =\frac{\partial}{\partial \phi } \left( \frac{\partial L}{\partial Y } \frac{\partial Y}{\partial \phi } \right) =\frac{\partial^2 L}{\partial Y^2 } (\frac{\partial Y}{\partial \phi })^2 + \frac{\partial L}{\partial Y } \frac{\partial^2 Y}{\partial \phi^2 } $$

$$ \frac{\partial^2 L}{\partial \theta^2 } =\frac{\partial}{\partial \theta } \left( \frac{\partial L}{\partial Y } \frac{\partial Y}{\partial \theta} \right) =\frac{\partial^2 L}{\partial Y^2 } (\frac{\partial Y}{\partial \theta })^2 +\frac{\partial L}{\partial Y } \frac{\partial^2 Y}{\partial \theta^2 } $$

$$ \frac{\partial^2 L}{\partial \phi \partial \theta } =\frac{\partial}{\partial \phi } \left( \frac{\partial L}{\partial Y } \frac{\partial Y}{\partial \theta} \right) =\frac{\partial^2L}{\partial Y^2 } \frac{\partial Y}{\partial \theta }\frac{\partial Y}{\partial \phi } +\frac{\partial L}{\partial Y } \frac{\partial^2 Y}{\partial \theta \partial \phi } $$

$$ \frac{\partial L}{\partial Y} = \frac{1}{2} (X+Y)^{-1/2} -\frac{1}{2} (X-Y)^{-1/2} $$

$$ \frac{\partial^2 L}{\partial Y^2} = -\frac{1}{4} (X+Y)^{-3/2} -\frac{1}{4} (X-Y)^{-3/2} $$

$$ \frac{\partial Y}{\partial \theta}= 2aR \cos \theta cos \phi $$ $$ \frac{\partial Y}{\partial \phi}= -2aR \sin \theta sin \phi $$ $$ \frac{\partial^2 Y}{\partial \theta^2}= -2aR \sin \theta cos \phi $$ $$ \frac{\partial^2 Y}{\partial \phi^2}= -2aR \sin \theta cos \phi $$ $$ \frac{\partial^2 Y}{\partial \theta \partial \phi } =\frac{\partial^2 Y}{\partial \phi \partial \theta } = -2aR \cos \theta \sin \phi $$ これらを組み合わせることで

$$ \frac{\partial^2 L}{\partial \phi^2 } = \left( - \frac{1}{4} (X+Y)^{-3/2} - \frac{1}{4} (X-Y)^{-3/2}\right) ( -2aR \sin \theta sin \phi )^2 \ +\left( \frac{1}{2} (X+Y)^{-1/2} - \frac{1}{2} (X-Y)^{-1/2}\right) \left( -2aR \sin \theta \cos \phi \right) $$

$$ \frac{\partial^2 L}{\partial \theta^2 } =\left(-\frac{1}{4} (X+Y)^{-3/2} -\frac{1}{4} (X-Y)^{-3/2}\right) (2aR \cos \theta cos \phi )^2 + \left(\frac{1}{2} (X+Y)^{-1/2} -\frac{1}{2} (X-Y)^{-1/2}\right) \left( -2aR \sin \theta cos \phi \right) $$

$$ \frac{\partial^2 L}{\partial \phi \partial \theta } =\frac{\partial}{\partial \phi } \left( \frac{\partial L}{\partial Y } \frac{\partial Y}{\partial \theta} \right) = \left(-\frac{1}{4} (X+Y)^{-3/2} -\frac{1}{4} (X-Y)^{-3/2}\right) \left( 2aR \cos \theta cos \phi \right) \left(-2aR \sin \theta sin \phi \right) + \left(\frac{1}{2} (X+Y)^{-1/2} - \frac{1}{2} (X-Y)^{-1/2}\right) \left(-2aR \cos \theta \sin \phi \right) $$ となります。

①$y=0$平面で反射する経路の時

$Y=0$であるので

$$ \frac{\partial L}{\partial Y} = \frac{1}{2} (X)^{-1/2} -\frac{1}{2} (X)^{-1/2}=0 $$

$$ \frac{\partial^2 L}{\partial Y^2} =-\frac{1}{4} (X)^{-3/2} -\frac{1}{4} (X)^{-3/2}<0 $$ であるため$\frac{\partial^2 L}{\partial \phi^2 }$は負。また$\cos \phi =0$であるため$\frac{\partial^2 L}{\partial \theta^2 }$はゼロ。$\frac{\partial^2 L}{\partial \phi \partial \theta }$もゼロ。

というわけでこの経路は光路長関数の山の稜線であるということがわかりました。

②ライトからカメラまでまっすぐの経路

この時$\theta=\pi/2$より$\sin \theta =1$,$\cos \theta =0$となります。また$\sin \phi=0$でもあるので、ここからすぐに $$ \frac{ \partial Y}{\partial \theta} = \frac{\partial Y}{\partial \phi}=\frac{ \partial^2 Y}{ \partial \theta \partial \phi }=0 $$

が求められます。これより $$ \frac{\partial^2 L}{\partial \phi^2 }=\frac{\partial L}{\partial Y } \frac{\partial^2 Y}{\partial \phi^2 } $$

$$ \frac{\partial^2 L}{ \partial \theta^2 } = \frac{ \partial L }{ \partial Y } \frac{ \partial^2 Y}{ \partial \theta^2 } $$

$$ \frac{ \partial^2 L}{ \partial \phi \partial \theta }=0 $$

です。

(A)$\phi =0$つまり$\cos \phi = 1$の時、

$$ Y=2aR、 \frac{\partial^2 Y}{\partial \phi^2 }= -2aR 、 \frac{\partial^2 Y}{\partial \theta^2 }=-2aR $$

となります。 $$ \frac{\partial^2 L}{\partial \theta^2 } =\frac{\partial^2 L}{\partial \phi^2 } $$ $$ =(2aR) \left(\frac{1}{2} (R^2+a^2+2aR)^{-1/2} -\frac{1}{2} (R^2+a^2-2aR)^{-1/2}\right) $$ であり、これは$(正) \times (正)$であるので正の値を取ります。 つまりこれは極小となる停留値です。

(B)$\phi =\pi$つまり$\cos \phi = -1$の時、

$$ Y=-2aR、 \frac{\partial^2 Y}{\partial \phi^2 }= 2aR 、 \frac{\partial^2 Y}{\partial \theta^2 }=2aR $$ となります。 $$ \frac{ \partial^2 L } {\partial \theta^2 } =\frac{ \partial^2 L}{ \partial \phi^2 } $$ $$ =(-2aR) \left( \frac{1}{2} (R^2 + a^2 -2aR)^{-1/2} - \frac{1}{2} (R^2+a^2+2aR)^{-1/2} \right) $$ であり、これは$(負) \times (負)$であるので正の値を取ります。 つまりこれも極小となる停留値です。

結果として光路長が停留値となるところを図におこしてみると以下のようになります。この結果はBlenderでのレンダリング結果を解析的に説明できていると考えられます。

まとめ

問題設定の対称性が強すぎたせいか稜線という形でしたが、光路長が山となるような経路を見ることが出来て満足です。また「Ray Tracing in One Weekend」というチュートリアルで作ったパストレーサーでも結果を再現できており、これも嬉しいです。

光の位相については全く考えていない議論なのでもし「そうはならんやろ」ということがあれば教えてください。

「自分用」liltoonSDFについての備忘録

liltoonSDFについての備忘録

(前提)

・SDFとは

Signed Distance Fieldの略

もともとはフォントなどで使われていたらしい手法だが 最近になってToon調の3Dモデルの影にも使われるようになったようだ

それまではアニメ顔の影については『ギルティギア Xrd』などで使われていた、法線転写という技術を使うことである程度固定の影を出せる技術が確立されていました。

しかし法線を編集するよりもテクスチャーマッピングを利用する方が処理負荷的にもメモリ的にも効率がよく、 キャラごとの法線編集コストもないのでより安定した影を出せるんじゃないかというところから生まれたのではないかと勝手に予想をしています。

そこで効率の良い影を生成するためにSDFアルゴリズムを使って影情報を持った複数枚のテクスチャーから生成したテクスチャーをマスクに利用することで、 固定したアニメ顔影を生成できるので、ライト角度ごとに閾値を持った影のマスクを作って顔にアニメキャラらしいルックを得られるということになります。

[引用元]

UE5 SDF Face Shadowマッピングでアニメ顔用の影を作ろう - Let's Enjoy Unreal Engine

ちなみにSVGなどのベクター画像を綺麗に見せるための方法としてMSDF(Multi-channel signed distance field)なるものもあるらしい

UnityでMSDFを使ったShaderによるベクター画像の描画について #Unity - Qiita

(基本概念)

Toon調の影をつける際に 法線情報から陰影をつけるのではなくテクスチャから影をつけることが出来るようになりたい。

(これまでに見かけた実装方法)

①リッチな実装

影情報を含んだテクスチャを複数枚用意しライトの方向を基にそれらを補完して影をつける。

nagakagachi.hatenablog.com

cgworld.jp

②実用的な実装方法

①の方法(影情報を含んだテクスチャを複数枚用意しライトの方向を基にそれらを合成する)ではテクスチャサイズが大きくなってしまうので それらを最初から合成しておき一枚のテクスチャにしそれだけをモデルに持たせるようにすることで軽量化する。 ただこれだけでは影の情報不足なのでテクスチャだけではなくライトによる影と組み合わせることでうまくそれなりに見せる。

unrealengine.hatenablog.com

(liltoonにおける実装方法)

liltoonにおいては②の実装方法(実用的な実装方法)が用いられているようだ。

(lil_common_frag.hlslの949~962行目を参照(commit 2b3aca0635c29749f19708983e872bb73edc4aef)) github.com

手続きの概略(ミスがあるかもしれません)

① SDFテクスチャからの影(sdf)の計算
  1. ワールド座標における(Skinned Mesh RendererのRoot Boneから見た)右方向(x-が右かは要確認)のベクトルの取得

  2. ライトがRoot Boneから見て右にある場合はshadowStrengthMaskのREDを使用 そうでない場合はGREENを使用

②ライトによる影(lnSDF)の計算
  1. ワールド座標におけるRoot Boneから見た手前方向ベクトルの取得

  2. ライトの向きベクトルと手前方向ベクトルの内積を取り影の強度を計算

③ライトの向きからくる影(lnSDF)+テクスチャを用いた影(sdf)の合成

この記事の内容を見直してみるとliltoonのSDFの処理とほぼ同じであり、作者の方はこの記事を参考にSDFを実装したのだと考えられる。

テクスチャの作り方

このツイートでは「顔の法線調整は必須」と書いてあるがソースコードを見る限りでは顔の法線情報を取得していないように見えるので法線調整は必要ないように思う。

youtu.be Get PERFECT Anime Face Shadows (Easier Way) in Blender

この動画の概要欄にSDFツールのリンクがあるらしい(未検証情報)

ボクセルモデルの作成(自分用) MagicalVoxcel→Blender→Unity

いつも忘れるので備忘録。

 

  • 手順

1:マジカルボクセルでモデリングする。

今回はこんな感じ。これをPLYで出力する。

2:頂点カラーからテクスチャを作成する。

 

2-1:Blenderでplyファイルを読み込む。ファイル→インポート→Standard PLY

(読み込んだ時は色がついていないが別にOK)

 

2-2:全頂点を選択し、Island Marginを0.05にしてUV展開する。

UVEditorでテクスチャを新規作成する。

 

 

2-3:マテリアルを新規作成し、ベースカラーを先ほど作成したテクスチャに。

 

 

現在は頂点カラー情報しかもっていないため、テクスチャに頂点カラーをベイクする。

 

 

2-4:レンダーエンジンをCyclesにしベイクタイプをディフューズ、影響の寄与をカラーのみにする。

 

 

2-5:シェーダーエディターで以下のようにつないでから、

Image Textureが選択(外枠が白くなる)された状態で、プロパティのBakeボタンを押す。

 

2-6:ベイクが終われば以下のようにシェーダーエディターでベースカラーをつなぎ直す。

(ちなみにベイク結果はこんな感じになっている。)

 

3:頂点をマージする

現在は同じ座標に複数の頂点が重なってしまっている状態なので頂点を距離でマージする。

(ちなみに頂点をマージしないと、モデルを動かした際に裏面が見えてしまったりして酷いことになる)

(ちなみに1つ前の手順で頂点カラーをテクスチャにベイクせず頂点をマージしてしまうと頂点が色情報を持っているためマージで色がぐちゃぐちゃになっていた。)

4:Humanoidリグをつける

今回はこんな感じ

5:ウェイトを作成する

今回は自動ウェイトでテキトウにやってしまう

 

(一応ポーズモードでウェイトの確認はする)

6:Blenderでfbxとして書き出しUnityでHumanoidとして読み込む

(省略)

7:テクスチャのMipMapを無効化する

このままだとボクセルの境界線が見えて不格好なのでテクスチャのMipMapをOFFにすることで境界線を見えないようにする。

 

(ちなみにMipMapをGenerateしているとこんな感じ。(よくよく見るとボクセルの境界線が見える))

 

・以上。

ADDRESS1 開発後記

ADDRESS1 開発後記

公開してからだいぶ時間が経ってしまったが、開発を振り返ろうと思う。

”Address1”とかいうタイトル

前作が「天国の一丁目」だったので次は「一番地」だなと思い、 番地と言えばメモリのアドレスだし、次回作タイトルは「メモリの一番地」にするか~

というのがこの作品の全てであり、あとはこのタイトルに合うようにシナリオを書いたりしただけ。

開発期間

本格的な開発を始めたのはこのツイートを見るに"2019-10-27"で

開発開始
開発開始

steam版の初公開が"2023-05-01"で キャラデザや大まかなシナリオの作成は自分のツイートを見る限り"2019-02-06"なので

キャラデザ
キャラデザ
開発期間は大体4年ぐらいか。まあ開発をしていなかった期間や、steam公開後に英語版を作ったりしていたので 正確な開発期間となるともっと曖昧な数字になる。

開発前から開発期間は4年ぐらいにしようと設定していた。 なぜ4年なのかは後述

薄暗い気持ち

正直言って薄暗い気持ちで開発を始めた。 megabitconvention02というのが2019年08月25日に開催されて、無謀にもこれに一度出店をしたことがあって。 私の作ったゲームのクオリティがあまりにも低かったのと集客がヘタクソで誰からも遊んで貰えなくて。 両隣のブースは凄く人気があるのにその間の自分のゲームは誰にも遊んでもらえなくて。 みんな私のゲームをチラッと見ては見なかったことにして素通りしてゆく。 もうひたすらボーっと11:00~16:30までひたすら暇をしていただけで。それだけでかなり精神的にキてしまったんですが、このイベントのあと公開されたメガビットコンベンション02のシューティングゲーム一挙レポート!と銘打った記事にさえ辛うじてシューティングゲームである自分のゲームは紹介されていなかった事が追い打ちになって。 megabitSTG.png

(いいかユズ、ホントのクソゲーってのは酷評されるんじゃなくて無視されるんだぜ。むしろ酷評なんてちゃんと遊んでくれている上に、自分のターゲット層以外にまで自分のゲームが行き届いているというスゲー事だからな。)

こういう舞台に立ってみて初めて、「大学の発表の場」と「商品発表の場」の違いを理解しましたね。 大学の発表は「そもそも周囲の人間が自分の話を聞いてくれるという大前提」があって、 こういう商品発表の場では「そもそも皆自分に対して興味も無く自分の話を聞くつもりもないので、何とかして自分の話は聞く価値があると説得しなければならない所から始まる」ということにあまりにも無自覚だった。

このイベントで隣のブースになった魔神少女STGというゲームを開発した「ひつじさん」という方にどれぐらいの期間開発をされていたのかうかがったところ「4年」という回答が帰ってきたので「自分もそれぐらい頑張れば同じ土俵に立てるのかな」という思いでADDRESS1の開発期間を4年と見積もった。 魔神少女STG

しかしこのイベント直後の時点では「もう2度とゲームなんて作りたくない」ぐらいの気持ちだった。

そのタイミングで「Hellsinker.」と出会ってもう一度だけ、開発をしてみようかなと思った。 しかしまあ、ADDRESS1の開発を始めたのはこのイベントで私を無下に扱った連中への復讐に近い思いからだった。

面白いゲームを作っている製作者のTwitterを見てみると人間性が最悪でガッカリしてしまうことが多いが ゲームや何かしらの作品を完成させるということは割と大変なことで何かしらの「拗らせ」や「悪意」や「名声欲」のような (いい意味でも悪い意味でも)強い感情が無いと難しいことではあるよなと今では思う。(異論は認められるものとする)

ゲームシステム

シューティングゲームにおける接近戦って楽しいしそれに重点を置いたSTGを作ろう!」ぐらいのアイディアで作った。

フリゲ2022得票作品

それをちゃんと理解してくれた人もいてとても嬉しい。

しかし、「上手くタイミングを見計らって接近戦をしかける」というゲームシステムを上手く機能させることが出来たのは「Stage1」だけで、 それ以外ではステージの内容を頭捻って考えるので精いっぱいで、「近接戦システムを上手く機能させよう」というところまでステージの内容を練り上げることが出来なかった。

スコア

当初は「最早スコアなんて不要だろ」と考えていて、要素として付けていなかったのだが、 知り合いにこのゲームを少し遊んでもらってみると「ただ敵の攻撃を避けながらショットを打ち続ければ良いタイプのSTGとはちょっと違うので、一体どういうプレイをすれば良いのか分からない」ようで、それを見てから考えを改め「初めてプレイする人にどのようなプレイが良いプレイなのか教える指標」、つまり「稼ぐもの」というよりは「機械学習エージェントに与える報酬」というスタンスでスコアを設計することにした。

参考作品

初期のゲームシステムを考えるうえで参考にした作品は「Hellsinker.」「らじおぞんで」「空飛ぶ赤いワイン樽」「神威」です。

どれも名作。

ヒトガタハッパ

Address1を作っている最中に「ヒトガタハッパ」というゲームと出会った。 自分は「シューティングゲームにおける接近戦って楽しいしそれに重点を置いたSTGを作ろう!」ぐらいのアイディアしか出なかったにも関わらず、 このゲームはあろうことか「自機を爆弾として敵にぶつけて攻撃する」というのが基本設計で。

しかもそのゲームコンセプトを活かすようなステージを最後まで練り上げることが出来ているし、なにより凄く面白い。 完全に負けたと思った。

このシステムは、「弾幕というものは接近を防ぐために張られるものであり、弾幕を避けきりなおかつ敵に直接打撃を入れてこそ、真に弾幕に勝利したと言える」という作者の主張を表現したものである。

(引用元: pixiv百科事典)

完敗としか言いようがない。

Penryn

元々狂ったようなゲームシステムにしようと思っていたのでキャラデザも狂った感じで。

ペンリン 2019年2月11日
ペンリン 2019年2月11日

Penryn 2019年11月27日
Penryn 2019年11月27日

脳みそがむき出しなのはなんでなのかはここを見てもらった方が早いと思う。(このゲームのシナリオには直接関わってこないことではあるけれど、主人公に「自分と同じコンプレックス」という呪いを与えて、その主人公が救われる物語を作ることで間接的に自分を救いたかった)

というかこういう考えなので、バッドエンドしかないゲームとか作れないんだよな。 どうしてここまで苦労して可愛がって作ったキャラクターに不幸な思いをさせることが出来ようかという気持ちになってしまう。

PenrynとMIA

「頑張って頑張っても目標に手が届かない」のと「頑張って頑張ってようやく目標に手が届いた瞬間にその目標の周囲を覆っていたメッキが剝げ落ち、”自分があれだけ追い求めていたものはこんなにも価値の無いものだったのか”」となるの、どちらが辛いんでしょうね。

ちなみにこのメッキですが、目標に向かって頑張り続けた期間が長ければ長いほどピカピカ輝きを増してゆくので剝がれた時の失望も目標に届かなかった時の失望も大きくなってしまうのが厄介な所だと思います。

PenrynとMerom

Merom 2023年6月15日
Merom 2023年6月15日
同じような生い立ちを持ち、同じ大切なものを持ち、それを(守るため|取り戻す為)に同じように身体改造を加えていった2人ですが それを(守るため|取り戻す為)に真逆の行動を取る2人。 2人の思考と肉体改造はどこか常軌を逸していて、きっと2人とも限界は近かったのでしょう。

Meromをあれだけ過剰に大きくしたのは 「大切なものをこの手で守りたい」という気持ちが過剰なまでになってしまったというメタファー(?)

GameOver時のテキスト

一応テキストの主体がPenrynともMIAとも取れるように書いたはずだけれど、 どれか一つだけPenrynが主体としか取れない文章が存在した記憶がある。

別に主体を私として取っても良いです。

Stage4クリア後メニュー画面のテキストの日本語訳

Menu5

Menu5
Menu5

まるで 肉食動物のように
世界は私に牙を向ける

まるで その獲物であるように
抵抗せずそれを受け入れる
抗っても意味がないことぐらい分かっているから

この身に湧き上がる絶望と痛み
その中でも自身を終わらせることが出来ない私は
一体何をこの世界にまだ望んでいるのだろう

制限され義務付けられた休養の中で
即時的な快楽にすがり全てを見失ってしまう前に
この世界の全てにささやかな反逆を
自らの存在に福音を
かつて確かにそこにあった

自らの存在の意義を

「制限され義務付けられた休養の中で 即時的な快楽にすがり全てを見失ってしまう前に」 というのは、

休日や終業と銘打ちながら「自己研鑽」を強いてくるアレと、 アルコールなどでなんとか毎日騙し騙しやっていきながら自分を見失っている私についての記述です。

というかこの文章自体が私の会社勤めに対するフラストレーションを綴っていますが、まあ許してやって下さい。

BGM

  1. プログラムでステージを作る。
  2. そのあと下表のような形で何分何秒に何が始まるのかを記録する。
  3. この表の中の大事なタイミングで曲調が変わるように曲を作る。(この時点ではだいたいのタイミングでよい)
  4. もう一度プログラムに戻り、曲調が変るタイミングと、大事な事が起こるタイミングがキッチリ合うようにパラメーターを調整する。
Stage4 ms frame diff
敵登場 13.6 0分13.6秒 13600 816 0
WARNING_Start 32.116666 0分32.11秒 32116.666 1926.99996 1110.99996
Merom_人間形態戦闘開始 43.48333333 0分43.48秒 43483.33333 2609
Merom_ロボ変形開始 148.1333333 2分28.13秒 148133.3333 8888 8072
Merom_ロボ変形終了 165.6166667 2分45.61秒 165616.6667 9937
MEROM_ロボ飛び上がり 235.3 3分55.3秒 235300 14118 13302
MEROM_ロボ爆発開始 291.4666667 4分51.46秒 291466.6667 17488 16672
MEROM_上半身形態開始 297.6833333 4分57.68秒 297683.3333 17861 17045
MEROM_上半身形態爆発開始 320.3833333 5分20.38秒 320383.3333 19223 18407
MEROM_上半身形態爆発終了 324.133333 5分24.13秒 324133.333 19447.99998 18631.99998
Kubrick_前で静止 352.65 5分52.65秒 352650 21159 20343
STAGE4END 382.2666666 6分22.26秒 382266.6666 22936 22120

Stage2の道中はかなり音ハメを頑張った(というか音ハメがメインのステージだった)んだけど、 パラメーターを調整するのが面倒で中途半端に投げ出してしまった。

アニメーション制作の現場では、動画と音の同期に関して「動画は音より2フレーム前にすると仕上がりが良い」という「動画先行の原則」が語られてきた。

(引用:映像と音の同期―「動画先行の原則」の根拠と応用)

こういうこともこの時知った。

反省

もっと高級なゲームエンジンを用いて開発を時短すべきだった。

プログラミングパートのほとんどの部分は「アルゴリズムをプログラムで記述すること」ではなく 「パラメーターを適切に調整すること」にあり、それをデフォルトでサポートしてくれるような開発環境(例えばUnityで言うところのInspectorのような機能)を用いるべきだった。 というか最終的にDXライブラリのような環境で開発することにしたとしても 「このコンセプトは最終的に面白いゲームになりえるか」を素早く判断出来るようにするために、プロトタイプだけでも高級なゲームエンジンを用いて素早く作ることが出来るようになっておいた方が良い気がする。

BGMは自作にこだわらず素材を利用してもよかった

作曲が苦手過ぎた。もう本当に曲を作るのが辛かった。 たまたま一曲だけいい曲が作れるだけでは全然ダメで、色々な場面にキッチリと合った曲を作ることが出来なければならない。 きつすぎる。 作曲に関してはいい思い出無いです。

自作にこだわったところで全体としてのクオリティが上がるわけでもないし。

ゲームの進行に合わせて変化するメニュー画面それぞれにBGMをつけたかった。

作曲難しい。

音ハメをもっと丁寧にしたかった。

IKUSAAAN!」とか「Hellsinker.のSegment8」の音ハメすごいよね。 いや~すごいわ。あそこまでやるだけの気力がない。

「敵に上手く近づいて接近戦をしかけるスタイル」を徹底すべきだった。

ステージの内容を頭捻って考えるので精いっぱいで、「近接戦システムを上手く機能させよう」というところまでステージの内容を練り上げることが出来なかった。

結局みんな「過去に遊んだどのゲームに似てるか」ぐらいにしか着目していなかった。

まあそりゃそうか。そりゃそうだよな。 何も知らないゲームの紹介なら「グラフィックが綺麗か」「過去に遊んだゲームの中でどれに似てるか」ぐらいにしか目がいかないよな。

開発者の思っている本質とユーザーの考える本質の間に差があった。

Steamでゲームを公開してから、ありがたいことにレビューやコミュニティハブ等で色々と反応が付いた。好意的な反応はもちろん、手痛い反応でさえもしっかりとプレイしてみた上での感想という感じでとても嬉しいものだった。

私は手痛い反応から「開発者の思っている本質とユーザーの考える本質の間に差がある」ということを教えられた。

ステージの冒頭にあるムービーが長すぎるというのは(開発者はこのゲームに慣れきっており一度でクリアできてしまい同じステージを何度も繰り返すことが無かったので)気が付くことが出来なかったし、開発者からしてみれば「冒頭のムービーのアイディアを考え、ちゃんと実装し上映できること」こそが本質で「ムービーのスキップ機能をつけること」はおまけのような非本質だと考えていたが、これをスキップできる機能はユーザーからしてみれば本質で。

チュートリアルが読みにくいというのも開発者からしてみれば「チュートリアルの内容を考え、それの英訳を作成し、正しくゲーム画面上で再生できること」こそが本質だと考えていたが、「チュートリアルが十分読み終えることが出来る分量&適切な文字送りのスピードか」というのはユーザーからしてみれば本質で。

でもそういうのって作ってる間はなかなか意識が向かないんだよなぁ。(私だけかもしれないが) アイディアを出すことやアイディアがバグを出さずに動いているかとか、そういった方面にばかり気がいってしまう。

一度開発者であることを捨て、全力でユーザーになってみなければ分からないことはとても多いと感じる。 (しかし開発者であることを捨てるのはなかなか難しいものだと痛感する。) (できれば他の誰かにプレイテストをしてもらうのが良いのだろうけど、人望の無い私にはそういう知り合いが居ないので...) (それにもし誰かにプレイテストをしてもらったとしても、そこでの手痛いフィードバックを素直に受け止めることが出来るだけの寛容さが私にあるとも思えない...)

周囲の反応集

フリゲ20XX得票

コンセプトを理解したうえで楽しんでくれて ここまで丁寧に遊んでもらえるとは思わなかったのでとても嬉しい。

merom686氏

https://merom686.hatenablog.com/entry/2023/05/27/152138

とても嬉しい。

MQ 7145氏

紹介中に別のゲームの話をされていたり、Hellsinker.にこういう武器使ってるキャラいたよねぐらいの紹介で無下にされている感は否めない。

discord

知らない外国人(しかも私の書いた絵がアイコン)からフレンド申請が来てて、「怖いなぁ」と思いつつとりあえず承認してみたら、 「I wante to tell you that i like your game」 というメッセージが届いて嬉しくなった。 (英語対応しておいて良かった)

総括

いろいろ嬉しい反応もありましたが、「これでmegabitconvention02の雪辱を晴らすことが出来たか」と問われると「駄目だったよ」というのが正直な所かもしれない。

4年かけて頑張ってみても結局私はこの程度だったということです。

逆に自分がどの程度なのかしっかり知ることが出来たのは良かったのかもしれない。

「Penrynに世界を用意してあげることが出来た。」 「物語を完成させることでPenrynを救うことが出来た。」 それでいいんだ。私程度の人間はそれで”足るを知る”べきなんだ。

今後

このゲームのキャッチコピーは

大切なあの記憶 もう一度だけ この体でもまだ そう思えるのなら

ですが,もはや私は

もう一度だけ なんてもう 思えない...

ので「もうゲーム作ることも無いかな」という気持ちです。 疲れ果てました。お疲れ様でした。

ネタバレ含 映画AWAKEの感想

awake-film.com

note.com

俺もやるか

感想

COM将面のツッコミどころ

まあ俺もAWAKE以後の人間なので細かいところは分かっていないんだけど....

  1. 駒が動くようになる前にalpha-beta実装するか?
  2. Bonanzaソースコード公開以前にKKPを用いたソースコード書いてませんでした?
  3. 「評価関数を作成して機械学習しよう」(KKP使ってただろ)
  4. LazySMPって当時あったっけ?(WCSC27ぐらいからだった気がするんだが)
  5. UIに流れるソースコード

作品としての感想

物語から作者の意図を読み取るなんて俺が一番苦手とするところだよ

低レベル読解力なので間違ってると思うがまあ思ったところを書くか

最後清田が浅川の甥っ子に将棋のアドバイス(?)をしてるシーンは (まあ清田は人間なんだけどコンピューター将棋代表みたいなものとして) 人間とコンピュータが敵同士ではなくて協力してより良い将棋を作り上げてほしいという意図と もっとプロとコンピューターが気軽に対局出来るようになってほしいみたいな意図があったのかなぁと思ったりした(しらんけど)

「2017年 佐藤 VS PONANZA 以降 コンピューターとの公式戦は行われていない」 で締めるのは攻めてるなぁと思った(しらんけど)

埴輪さんの相手を尊重する意味で投了というのは私には読み解けなくてなるほどと思った 確かに28角のシーンでの早すぎる投了と比べてみるとあそこはそういうことだよな。なるほど。

開発環境

良く使っているものに関して製作環境のメモを取っておこうと思う

------------3D
blender 2.8.0 2.7.9
https://www.blender.org/


------------DTM


FL Studio 20
https://www.image-line.com/fl-studio-download/

Studio One 5 Prime
https://www.mi7.co.jp/products/presonus/studioone/prime/


------------外部音源

(FT Studioから見たインストールされたVST一覧)

f:id:daruma3940:20201018132243p:plain



SGM-V2.01(サウンドフォント)
http://www.mediafire.com/file/zo8l3dgf2989266/SGM-V2.01.7z/file

Standard Guitar(サウンドフォント)
キースイッチでアーティキュレーションをつけることが出来、便利
https://unreal-instruments.wixsite.com/unreal-instruments/standard-guitar

TAL Dub Delay (VST 64bit)
(Dubみたいな感じのエコーをかけることが出来る)
https://tal-software.com/products/tal-dub

Ample Bass P Lite II(VST 32+64bit)
(ベース音源 無料音源なのでアーティキュレーションはほとんど使えないが、いい感じのエレキベース音が出る)
http://www.amplesound.net/en/download.asp

Nanotron(32bitVST)
(メロトロン音源)
https://vst4free.com/plugin/288/

sforzando(VST 32+64bit)
(サウンドフォントプレイヤー)
https://unreal-instruments.wixsite.com/unreal-instruments/installation-guide

Dexed (64bitVST)
(シンセ プリセットでいい感じのが入ってる)
https://asb2m10.github.io/dexed/

Synth1VST

https://daichilab.sakura.ne.jp/softsynth/

(Synth1VSTのプリセット)

f:id:daruma3940:20201018132230p:plain



------------フォント
Curves
https://www.dafont.com/curves.font

Marske
https://www.1001fonts.com/marske-font.html

アプリ明朝
https://flopdesign.com/blog/font/5852/


------------絵
Clip Studio Paint
https://www.clipstudio.net/

UIレイアウト
入門教室のおススメ
コンテンツID:1721631
https://assets.clip-studio.com/ja-jp/detail?id=1721631

 

・Aseprite

(ドット絵を描く用途(だいたい下書きはこれでして色塗りはClipStudioでしている))

・Paint.net

(ちょこちょこっと画像を弄る用途)
------------エフェクト作成
Effekseer
(ver150からUIが変更されかなり使いやすくなった)
https://effekseer.github.io/jp/download.html

 

------------プログラミング
Visual Studio 2019  
https://visualstudio.microsoft.com/ja/downloads/

DXライブラリ Ver3.21 
https://dxlib.xsrv.jp/

VSCode
https://azure.microsoft.com/ja-jp/products/visual-studio-code/