IMPLEMENTATION SPECIFICATION · REV. 2

オービタルシミュレータ
実装方法の技術解説

量子化学の理論、3DCGによる曲面生成、Webアプリとしての実装を話題別に分け、現在の実装が生成している曲面を各層から記述する。 本文中の数値は概念例ではなく、実装で実際に用いている定数である。

対象:量子化学・計算化学・科学可視化・WebGL実装に関する基礎知識を持つ読者
Q1

水素原子軌道の理論的基礎

非相対論的な水素様1電子原子では、核と電子の相対運動に対する時間に依存しないSchrödinger方程式を解く。 電子と核の換算質量を μ\mu とすると、Hamiltonianと固有値方程式は、

H^ψ=Eψ,H^=22μ2e24πε0r\hat H\psi=E\psi,\qquad \hat H=-\frac{\hbar^2}{2\mu}\nabla^2-\frac{e^2}{4\pi\varepsilon_0r}

である。Coulombポテンシャルが球対称なので、固有関数は球座標で動径関数と球面調和関数へ変数分離できる。

ψnlm(r,θ,ϕ)=Rnl(r)Ylm(θ,ϕ),n=1,2,,l=0,,n1,m=l,,l\psi_{nlm}(r,\theta,\phi)=R_{nl}(r)Y_l^m(\theta,\phi),\qquad n=1,2,\ldots,\quad l=0,\ldots,n-1,\quad m=-l,\ldots,l

エネルギー固有値と縮退

換算質量に対応するBohr半径を aμ=4πε02/(μe2)a_\mu=4\pi\varepsilon_0\hbar^2/(\mu e^2) とすると、束縛状態のエネルギーは主量子数だけに依存する。

En=μe42(4πε0)22n2=22μaμ2n2E_n=-\frac{\mu e^4}{2(4\pi\varepsilon_0)^2\hbar^2n^2}=-\frac{\hbar^2}{2\mu a_\mu^2n^2}

スピン、微細構造、Lamb shiftを無視すれば、固定した nn に対する空間軌道の縮退度はl=0n1(2l+1)=n2\sum_{l=0}^{n-1}(2l+1)=n^2 である。多電子原子では電子間反発と遮蔽により、この ll に関する縮退は一般に解ける。

球面調和関数

複素球面調和関数は角運動量演算子の同時固有関数である。

L^2Ylm=2l(l+1)Ylm,L^zYlm=mYlm\hat L^2Y_l^m=\hbar^2l(l+1)Y_l^m,\qquad \hat L_zY_l^m=\hbar mY_l^mYlm(θ,ϕ)=(1)m2l+14π(lm)!(l+m)!Plm(cosθ)eimϕ(0ml)Y_l^m(\theta,\phi)=(-1)^m\sqrt{\frac{2l+1}{4\pi}\frac{(l-m)!}{(l+m)!}}\,P_l^m(\cos\theta)e^{im\phi}\quad(0\leqq m\leqq l)Ylm=(1)m(Ylm)Y_l^{-m}=(-1)^m\left(Y_l^m\right)^*

化学で用いる px,py,pzp_x,p_y,p_z や5つのd軌道、7つのf軌道は、通常 mmm-m の複素関数から作る実線形結合である。本シミュレータの角度多項式も、この実軌道と同じ対称性と節集合を持つ。

動径関数と陪ラゲール多項式

ρ=2r/(naμ)\rho=2r/(na_\mu) と置くと、規格化された動径関数は次式で表される。

Rnl(r)=(2naμ)3/2(nl1)!2n(n+l)!eρ/2ρlLnl12l+1(ρ)R_{nl}(r)=\left(\frac{2}{na_\mu}\right)^{3/2}\sqrt{\frac{(n-l-1)!}{2n(n+l)!}}\,e^{-\rho/2}\rho^lL_{n-l-1}^{2l+1}(\rho)

ここで LqαL_q^\alpha はラゲールの陪多項式であり、Rodrigues型の定義は、

Lqα(ρ)=ραeρq!dqdρq(eρρq+α)L_q^\alpha(\rho)=\frac{\rho^{-\alpha}e^\rho}{q!}\frac{d^q}{d\rho^q}\left(e^{-\rho}\rho^{q+\alpha}\right)

である。指数減衰、原点近傍の rlr^l、陪ラゲール多項式の零点が、それぞれ動径方向の外形と節を決める。

節の数

節の種類個数由来
動径節nl1n-l-1Lnl12l+1(ρ)=0L_{n-l-1}^{2l+1}(\rho)=0
角度節llYlm(θ,ϕ)=0Y_l^m(\theta,\phi)=0
全節数n1n-1(nl1)+l(n-l-1)+l

複素 YlmY_l^m の絶対値は ϕ\phi に依存せず、振幅の節は Plm(cosθ)P_l^{|m|}(\cos\theta) が与えるlml-|m| 個である。実線形結合では cos(mϕ)\cos(m\phi) または sin(mϕ)\sin(m\phi) に由来するm|m| 枚の方位角方向の節面が加わり、角度節の総数は ll となる。

以上が厳密な水素様原子軌道の基準である。次節から、この理論の対称性・節・位相をWebGLで比較しやすくするため、本シミュレータがどこを保持し、どこを模式化しているかを示す。
Q2

可視化モデルの位置づけ

本シミュレータは、水素様原子軌道の厳密な波動関数 ψnlm(r,θ,ϕ)=Rnl(r)Ylm(θ,ϕ)\psi_{nlm}(r,\theta,\phi)=R_{nl}(r)Y_l^m(\theta,\phi) を 直接等値面化したものではない。p・d・f軌道については実球面調和関数と同じ節構造を持つ斉次多項式を単位球面上で評価し、 その絶対値を方向依存半径へ写像する「振幅極座標曲面」を生成する。s軌道の動径節は同心球、3p・4p・4dの動径節は相似な角度曲面の入れ子で表す。

重要:曲面は ψ2=c|\psi|^2=c の等確率密度面ではない。角度対称性、節面、位相、軌道方向を比較するための模式的・決定論的な曲面である。
選択群表示数曲面種別動径節数
1s1s1s0
2s2s1s1
2p2p3p0
3s3s1s2
3p3p3p1
3d3d5d0
4s4s1s3
4p4p3p2
4d4d5d1
4f4f7f0
sp3sp^34hybrid
sp2sp^23hybrid
spsp2hybrid
dsp2dsp^24hybrid
d2sp3d^2sp^36hybrid
W1

技術構成

UIと状態管理はReact 19.2.6とTypeScript、ページ構造はNext.js 16.2.6互換環境、バンドルはVinext 0.0.50とVite 8.0.13で構成する。 3D描画はThree.js 0.185.1、数式組版はKaTeX 0.18.1、レイアウト・テーマ・ブレークポイントはCSSで実装する。

React 19.2.6TypeScript 5.9Three.js 0.185.1KaTeX 0.18.1Vite 8.0.13CSS
  1. State軌道群、テーマ、曲面の透過モード、ローブ形状、メッシュ精細度をReact stateとして保持する。
  2. Geometry選択状態から軌道定義を取得し、CPU側でThree.js BufferGeometryを生成する。
  3. Scene正位相・負位相メッシュ、xyz軸、照明、透視投影カメラをカードごとに構築する。
  4. InteractionOrbitControlsがカメラ姿勢と距離を更新し、WebGLRendererが既存メッシュを再描画する。
W2

TypeScriptデータモデル

「軌道群」と「構成軌道」を分離する。p軌道群は3構成、3d・4dは5構成、4fは7構成、混成軌道は方向ごとに2〜6構成を持つ。

type OrbitalComponent = {
  id: string;
  latex: string;
  kind: "s" | "angular" | "hybrid";
  angular?: AngularKey;
  radialNodes?: number;
  direction?: [number, number, number];
};

type OrbitalSet = {
  key: OrbitalKey;
  button: string;
  title: string;
  quantum: string;
  description: string;
  components: OrbitalComponent[];
};

angular は後述する多項式 F(x,y,z)F(x,y,z) のキー、radialNodes は表示する入れ子曲面数を決める整数、direction は混成軌道の主軸方向である。数式ラベルはLaTeX文字列として保持し、KaTeXでHTMLへ変換する。

Q3

実装されている全角度関数

角度評価点は単位球面上にあり、x2+y2+z2=1x^2+y^2+z^2=1 を満たす。実装は規格化係数を含まない実多項式を使うが、 軌道ごとに最大絶対値で再規格化するため、非零の全体定数倍は生成曲面に影響しない。

x=sinθcosϕ,y=sinθsinϕ,z=cosθx=\sin\theta\cos\phi,\qquad y=\sin\theta\sin\phi,\qquad z=\cos\theta
実軌道評価多項式 F(x,y,z)F(x,y,z)角度節 F=0F=0
ppxp_xxxx=0x=0
ppyp_yyyy=0y=0
ppzp_zzzz=0z=0
ddxyd_{xy}2xy2xyx=0    y=0x=0\;\cup\;y=0
ddyzd_{yz}2yz2yzy=0    z=0y=0\;\cup\;z=0
ddxzd_{xz}2xz2xzx=0    z=0x=0\;\cup\;z=0
ddx2y2d_{x^2-y^2}x2y2x^2-y^2x=y    x=yx=y\;\cup\;x=-y
ddz2d_{z^2}2z2x2y22z^2-x^2-y^22z2=x2+y22z^2=x^2+y^2
ffz3f_{z^3}z(2z23x23y2)z(2z^2-3x^2-3y^2)z=0    2z2=3(x2+y2)z=0\;\cup\;2z^2=3(x^2+y^2)
ffxz2f_{xz^2}x(4z2x2y2)x(4z^2-x^2-y^2)x=0    4z2=x2+y2x=0\;\cup\;4z^2=x^2+y^2
ffyz2f_{yz^2}y(4z2x2y2)y(4z^2-x^2-y^2)y=0    4z2=x2+y2y=0\;\cup\;4z^2=x^2+y^2
ffz(x2y2)f_{z(x^2-y^2)}z(x2y2)z(x^2-y^2)z=0    x=y    x=yz=0\;\cup\;x=y\;\cup\;x=-y
ffxyzf_{xyz}4xyz4xyzx=0    y=0    z=0x=0\;\cup\;y=0\;\cup\;z=0
ffx(x23y2)f_{x(x^2-3y^2)}x(x23y2)x(x^2-3y^2)x=0    x=±3yx=0\;\cup\;x=\pm\sqrt3y
ffy(3x2y2)f_{y(3x^2-y^2)}y(3x2y2)y(3x^2-y^2)y=0    y=±3xy=0\;\cup\;y=\pm\sqrt3x

p軌道

F=x,y,zF=x,y,z はそれぞれ原点を通る1枚の節平面を持つ。符号は対応軸の正負に一致するため、2つのローブは必ず逆位相となる。 2p、3p、4pは同じ角度関数を共有し、違いは後述する動径方向の入れ子数だけである。

d軌道

dxy,dyz,dxzd_{xy},d_{yz},d_{xz} は2枚の直交節平面、dx2y2d_{x^2-y^2}x=±yx=\pm y の2平面を持つ。dz2d_{z^2} の節は2z2=x2+y22z^2=x^2+y^2 の二重円錐であり、その内外が逆位相になるため、極方向の2ローブと赤道面付近の環状領域が現れる。

f軌道

7関数はいずれも3次斉次多項式であり、因数分解された各因子が節平面または節円錐を与える。fz3f_{z^3}fxz2f_{xz^2}fyz2f_{yz^2} は平面と二重円錐の組合せ、 残る4関数は3枚の節平面を持つ。表示順序は上段3、中央1、下段3となるようデータ配列を並べ替えている。

G1

描画曲面の厳密な媒介変数表示

球面格子の分割数はメッシュ精細度 mm から次式で決定する。

m{20,22,,120},Nθ=m,Nϕ=2round(14m19)m\in\{20,22,\ldots,120\},\qquad N_\theta=m,\qquad N_\phi=2\operatorname{round}\left(\frac{14m}{19}\right)

初期値 m=58m=58 では (Nθ,Nϕ)=(58,86)(N_\theta,N_\phi)=(58,86) となる。端点を含む標本角は次式である。

θi=iπNθ  (i=0,,Nθ),ϕj=2jπNϕ  (j=0,,Nϕ)\theta_i=\frac{i\pi}{N_\theta}\;(i=0,\ldots,N_\theta),\qquad \phi_j=\frac{2j\pi}{N_\phi}\;(j=0,\ldots,N_\phi)

j=0j=0j=Nϕj=N_\phi は幾何学的に同じ子午線だが、UV状の格子を閉じるため頂点を重複させる。各方向単位ベクトルは、

uij=(sinθicosϕj,  sinθisinϕj,  cosθi)\boldsymbol u_{ij}=(\sin\theta_i\cos\phi_j,\;\sin\theta_i\sin\phi_j,\;\cos\theta_i)

であり、選択軌道の多項式値と離散標本上の最大値を、

Fij=F(uij),M=max0iNθ,  0jNϕFijF_{ij}=F(\boldsymbol u_{ij}),\qquad M=\max_{0\leqq i\leqq N_\theta,\;0\leqq j\leqq N_\phi}|F_{ij}|

と定義する。球殻縮尺 sks_k における実装上の半径は、

ρij(k)(γ)=sk[0.045+1.32(Fijmax(M,104))γ],0.30γ3.00\rho_{ij}^{(k)}(\gamma)=s_k\left[0.045+1.32\left(\frac{|F_{ij}|}{\max(M,10^{-4})}\right)^{\gamma}\right],\qquad 0.30\leqq\gamma\leqq3.00

であり、BufferGeometryへ格納する頂点は、

rij(k)=ρij(k)uij\boldsymbol r_{ij}^{(k)}=\rho_{ij}^{(k)}\boldsymbol u_{ij}

である。したがって描画曲面は、連続表現では次の2枚の符号別媒介曲面とみなせる。

Sk+={ρk(θ,ϕ)u(θ,ϕ)F(u)0},Sk={ρk(θ,ϕ)u(θ,ϕ)F(u)<0}\mathcal S_k^{+}=\{\rho_k(\theta,\phi)\boldsymbol u(\theta,\phi)\mid F(\boldsymbol u)\geqq0\},\quad \mathcal S_k^{-}=\{\rho_k(\theta,\phi)\boldsymbol u(\theta,\phi)\mid F(\boldsymbol u)<0\}
定数0.045は節近傍の半径を完全な0にせずメッシュ境界を安定させるオフセット、1.32は全体寸法、指数γ\gamma はローブの横方向の太さを制御する視覚補正である。初期値は γ0=1.25\gamma_0=1.25。これらは物理定数ではない。

「ローブの太さ」スライダー

A=F/max(M,104)A=|F|/\max(M,10^{-4}) と置けば、節と極大方向を除く領域では 0<A<10<A<1 であり、 指数に対する感度は次式になる。

Aγγ=AγlogA<0(0<A<1)\frac{\partial A^{\gamma}}{\partial\gamma}=A^{\gamma}\log A<0\qquad(0<A<1)

ここで log\log は自然対数を表す。

したがって γ\gamma を大きくすると中間振幅方向の半径だけが縮み、ローブは細く鋭くなる。小さくすると同じ領域が膨らみ、太く丸くなる。 一方、主軸上の極大では A=1A=1 なので 1γ=11^{\gamma}=1、最大ローブ長は変わらない。節上もA=0A=0 のままなので、節集合そのものも変わらない。UIは 0.30γ3.000.30\leqq\gamma\leqq3.00 を0.01刻みで更新し、 p・d・f軌道のBufferGeometryを入力イベントごとに再生成する。s軌道と楕円体モデルの混成軌道にはこの指数を適用しない。 スライダーは左を「細い」、右を「太い」に統一するため表示方向を反転し、左端を γ=3.00\gamma=3.00、右端をγ=0.30\gamma=0.30 に対応させる。

規格化を軌道ごとに行うため、異なる軌道間の絶対振幅は比較できない。表示されるのは各軌道内部の角度分布と節構造である。

「メッシュ精細度」スライダー

スライダーは mm を2刻みで変更し、左端の 20×3020\times30 から右端の120×176120\times176 まで球面格子を再生成する。値を上げるほど輪郭と鏡面反射は滑らかになるが、頂点数と三角形数、および再生成時間は増加する。 特に大きな γ\gamma で細くしたローブは角度方向の変化が急になるため、高精細設定の効果が大きい。 同じ (Nθ,Nϕ)(N_\theta,N_\phi) をs軌道と混成軌道のSphereGeometryにも適用するため、全軌道で精細度が揃う。

G2

符号分離と三角形インデックス

1球殻・1位相につき頂点数は (Nθ+1)(Nϕ+1)(N_\theta+1)(N_\phi+1)。格子セル数はNθNϕN_\theta N_\phi、符号制約がなければ最大三角形数は 2NθNϕ2N_\theta N_\phi である。 初期値ではそれぞれ5133頂点、4988セル、9976三角形となる。

セル左上を a=i(Nϕ+1)+ja=i(N_\phi+1)+j とすると、他の頂点番号は、

b=a+Nϕ+1,c=b+1,d=a+1b=a+N_\phi+1,\qquad c=b+1,\qquad d=a+1

となる。各セルの候補三角形は (a,b,d)(a,b,d)(b,c,d)(b,c,d)。正位相メッシュでは3頂点すべてが

Fq0(q{a,b,d})orFq0(q{b,c,d})F_q\geqq0\quad(q\in\{a,b,d\})\qquad\text{or}\qquad F_q\geqq0\quad(q\in\{b,c,d\})

を満たす三角形だけを採用する。負位相メッシュでは不等号を Fq<0F_q<0 に置き換える。

節をまたぐ三角形を生成しないため、正負曲面は幾何学的に接続されない。頂点配列自体は両位相で同一サイズを持つが、index bufferだけが異なる。 法線は最終index設定後に computeVertexNormals() で面積加重平均から生成する。

for each cell (a, b, c, d):
  if samePhase(a, b, d): indices += [a, b, d]
  if samePhase(b, c, d): indices += [b, c, d]

positive phase: F >= 0
negative phase: F < 0
Q4

s軌道・動径節・球殻パラメータ

s軌道

s軌道は角度関数を用いず、同心SphereGeometryで表す。球殻数を N=nl=nN=n-l=n、内側からの番号をi=0,,N1i=0,\ldots,N-1 とすると半径は、

Ri=0.32+0.94i+1NR_i=0.32+0.94\frac{i+1}{N}

位相は内側を正として (1)i(-1)^i で交互に切り替える。実際の値は次表のとおり。

軌道NN内→外の半径内→外の位相半透明時のα
1s1s11.2601.260+0.920.92
2s2s20.790,  1.2600.790,\;1.260+,-0.38,  0.280.38,\;0.28
3s3s30.633,  0.947,  1.2600.633,\;0.947,\;1.260+,-,+0.48,  0.38,  0.280.48,\;0.38,\;0.28
4s4s40.555,  0.790,  1.025,  1.2600.555,\;0.790,\;1.025,\;1.260+,-,+,-0.58,  0.48,  0.38,  0.280.58,\;0.48,\;0.38,\;0.28

半透明時、単一球殻の1sは α=0.92\alpha=0.92。複数球殻ではコード上の式αi=0.18+0.10(Ni)\alpha_i=0.18+0.10(N-i) により内側ほど濃くする。実際の水素様s軌道の動径節位置とは一致しない。

p・d軌道の動径節

角度曲面の球殻数は N=nlN=n-l、すなわち動径節数 nl1n-l-1 に1を加えた値である。 内側からの縮尺は、

si=0.28+0.72i+1N,i=0,,N1s_i=0.28+0.72\frac{i+1}{N},\qquad i=0,\ldots,N-1
軌道群NN内→外の sis_i内→外の位相半透明時のα
2p2p11.001.00+0.940.94
3p3p20.64,  1.000.64,\;1.00+,-0.32,  0.600.32,\;0.60
3d3d11.001.00+0.940.94
4f4f11.001.00+0.940.94
4d4d20.64,  1.000.64,\;1.00+,-0.32,  0.600.32,\;0.60
4p4p30.52,  0.76,  1.000.52,\;0.76,\;1.00+,-,+0.32,  0.32,  0.600.32,\;0.32,\;0.60

位相色は球殻ごとに交換する。外側球殻を含む奇数番目の位相反転により動径方向の符号変化を表すが、球殻間の連続な関数値や真の零点半径は計算しない。 不透明モードではすべて α=1\alpha=1depthWrite=true とし、外側曲面が内側曲面を完全に隠す。

Q5

混成軌道の楕円体モデル

混成軌道は角度多項式を標本化せず、主軸が方向単位ベクトル d\boldsymbol d に一致する2楕円体で構成する。 このため、角度振幅 F|F| のべき指数である γ\gamma は混成軌道には定義されず、そのままでは太さを変更できない。 代わりに楕円体の軸方向半径を保ったまま、2本の垂直方向半径へ共通係数 λ\lambda_{\perp} を掛ける。 任意点 p\boldsymbol p、中心 c\boldsymbol c に対する変位ベクトル、軸方向のスカラー座標、垂直成分ベクトルを、それぞれ

q=pc,ξ=qdR,η=qξd\boldsymbol q=\boldsymbol p-\boldsymbol c,\qquad \xi=\boldsymbol q\cdot\boldsymbol d\in\mathbb R,\qquad \boldsymbol\eta=\boldsymbol q-\xi\boldsymbol d

と置くと、大ローブは次の楕円体である。

η2(0.4464λ)2+ξ20.97962=1,cL=0.78d\frac{\|\boldsymbol\eta\|^2}{(0.4464\lambda_{\perp})^2}+\frac{\xi^2}{0.9796^2}=1,\qquad \boldsymbol c_{\mathrm L}=0.78\boldsymbol d

これは半径0.62の球へ局所スケール (0.72λ,0.72λ,1.58)(0.72\lambda_{\perp},0.72\lambda_{\perp},1.58) を適用した値0.62(0.72λ,0.72λ,1.58)=(0.4464λ,0.4464λ,0.9796)0.62(0.72\lambda_{\perp},0.72\lambda_{\perp},1.58)=(0.4464\lambda_{\perp},0.4464\lambda_{\perp},0.9796) に対応する。逆位相の小ローブは、

η2(0.3024λ)2+ξ20.48302=1,cS=0.40d\frac{\|\boldsymbol\eta\|^2}{(0.3024\lambda_{\perp})^2}+\frac{\xi^2}{0.4830^2}=1,\qquad \boldsymbol c_{\mathrm S}=-0.40\boldsymbol d

であり、半径0.42、局所スケール (0.72λ,0.72λ,1.15)(0.72\lambda_{\perp},0.72\lambda_{\perp},1.15) に由来する。Three.jsのQuaternionはz^=(0,0,1)\hat{\boldsymbol z}=(0,0,1)d\boldsymbol d へ写す最短回転として生成する。

混成軌道の太さスライダー

混成軌道を選ぶとUIは形状指数 γ\gamma のスライダーを、横幅係数 λ\lambda_{\perp} のスライダーへ差し替える。 定義域は 0.35λ1.800.35\leqq\lambda_{\perp}\leqq1.80、初期値は λ=1.00\lambda_{\perp}=1.00 である。 値を増やすと大小両ローブが軸と垂直な方向だけに太くなり、減らすと細くなる。長軸半径、中心位置、方向ベクトル、相互角は変化しない。λ\lambda_{\perp} も物理定数ではなく、模式的な楕円体の視覚パラメータである。

方向ベクトルの全定義

混成方向単位ベクトル相互角
sp3sp^313(1,1,1),  13(1,1,1),  13(1,1,1),  13(1,1,1)\frac1{\sqrt3}(1,1,1),\;\frac1{\sqrt3}(1,-1,-1),\;\frac1{\sqrt3}(-1,1,-1),\;\frac1{\sqrt3}(-1,-1,1)cos1(1/3)=109.47\cos^{-1}(-1/3)=109.47^\circ
sp2sp^2(1,0,0),  (1/2,3/2,0),  (1/2,3/2,0)(1,0,0),\;(-1/2,\sqrt3/2,0),\;(-1/2,-\sqrt3/2,0)120120^\circ
spsp(1,0,0),  (1,0,0)(1,0,0),\;(-1,0,0)180180^\circ
dsp2dsp^2(±1,0,0),  (0,±1,0)(\pm1,0,0),\;(0,\pm1,0)90  (隣接),  180  (対向)90^\circ\;\text{(隣接)},\;180^\circ\;\text{(対向)}
d2sp3d^2sp^3(±1,0,0),  (0,±1,0),  (0,0,±1)(\pm1,0,0),\;(0,\pm1,0),\;(0,0,\pm1)90  (隣接),  180  (対向)90^\circ\;\text{(隣接)},\;180^\circ\;\text{(対向)}
この楕円体モデルは 2s+2px+2py+2pz2s+2p_x+2p_y+2p_z 等の規格化線形結合を評価した等値面ではない。dsp2dsp^2d2sp3d^2sp^3 も、それぞれ正方形平面型・正八面体型錯体の教科書的な結合方向を表す模式モデルであり、 配位子場分裂や分子軌道を計算していない。結合方向、大小ローブ、逆位相という特徴だけを符号付き幾何として実装する。
G3

位相色、材質、不透明度

正負位相は電荷ではなく波動関数の符号である。テーマごとの正位相色A・負位相色Bは次のとおり。

テーマ正位相 A負位相 B
MIDNIGHT#32E6FF#8B5CF6
ATLAS#2257A6#DF654F
GALLERY#55F3D5#F85BB6

全曲面にMeshPhysicalMaterialを用い、材質定数は以下で固定する。

roughness=0.32,metalness=0.02,clearcoat=0.50,clearcoatRoughness=0.22\mathrm{roughness}=0.32,\quad \mathrm{metalness}=0.02,\quad \mathrm{clearcoat}=0.50,\quad \mathrm{clearcoatRoughness}=0.22

emissive色は位相色をRGB空間で0.13倍したもの。不透明モードでは transparent=falseα=1\alpha=1depthWrite=true。半透明モードでは表のαを採用し、α0.82\alpha\leqq0.82 の曲面だけdepthWrite=false として内側球殻を見せる。両面描画のため side=DoubleSide とする。

単一角度球殻のαは0.94、混成軌道の大・小ローブは0.94と0.92であり、半透明モードでも深度を書き込む。 動径節の観察対象となる複数球殻だけが低αかつ深度非書込みになる。

G4

座標軸、照明、カメラ

xyz軸

各正軸は原点から長さ1.82のArrowHelperとして生成する。矢尻長0.14、矢尻幅0.065。軸ラベルspriteは2.00x^,2.00y^,2.00z^2.00\hat{\boldsymbol x},2.00\hat{\boldsymbol y},2.00\hat{\boldsymbol z} に置き、scaleは0.34である。 軸色はx #EF6461、y #57BD85、z #5D9CEC

カメラ

PerspectiveCameraの垂直視野角は34°、nearは0.1、farは100。共通視線方向は、

v^=(1.08,0.82,1.20)1.082+0.822+1.202(0.596,0.453,0.663)\hat{\boldsymbol v}=\frac{(1.08,0.82,1.20)}{\sqrt{1.08^2+0.82^2+1.20^2}}\approx(0.596,0.453,0.663)

であり、カメラ位置は c=Dv^\boldsymbol c=D\hat{\boldsymbol v}。upベクトルを (0,0,1)(0,0,1) に固定してz軸を画面上向きに投影する。

軌道群初期距離 DD
1s, 2s, 2p, 3s, 3p, 4s7.05
4p7.30
sp^3, sp^2, sp, dsp^2, d^2sp^37.35
3d, 4d7.80
4f8.30

OrbitControlsの最小距離は 0.5D0.5D、最大距離は 1.7D1.7D、回転速度0.72、ズーム速度0.82、 dampingFactorは0.075。パンは無効である。軌道群内では全カードが同一の視線方向・距離を使う。

照明と出力

  • HemisphereLight:sky #FFFFFF、ground #172036、強度1.5。
  • 主DirectionalLight:白、強度3.6、位置 (4,4,5)(4,4,5)
  • rim DirectionalLight:正位相色A、強度2.2、位置 (4,1,2)(-4,-1,2)
  • 出力色空間:sRGB。tone mapping:ACES Filmic。露出1.22。
  • device pixel ratio:min(devicePixelRatio,2)\min(\mathrm{devicePixelRatio},2)
W3

実行時計算、再生成条件、資源解放

角度関数とメッシュは毎フレーム計算しない。React effectの依存値は構成軌道、位相色A・B、透過モード、ローブ形状指数、混成軌道の横幅係数、メッシュ精細度、初期距離であり、 これらが変わったときだけシーンを破棄して再生成する。回転中のフレームループは次の2処理だけである。

function render() {
  controls.update();
  renderer.render(scene, camera);
  frame = requestAnimationFrame(render);
}

各角度球殻は正負2メッシュを持つ。初期設定では1メッシュ当たり5133頂点を確保し、全角度軌道群の生成量は次表のとおり。

軌道群カード数球殻数/カード総メッシュ数初期設定の総頂点スロット数
2p2p31630,798
3p3p321261,596
3d3d511051,330
4p4p331892,394
4d4d5220102,660
4f4f711471,862
Nvertex=NcardNshellNphase(Nθ+1)(Nϕ+1),Nphase=2N_{\mathrm{vertex}}=N_{\mathrm{card}}N_{\mathrm{shell}}N_{\mathrm{phase}}(N_\theta+1)(N_\phi+1),\qquad N_{\mathrm{phase}}=2

index bufferに採用される三角形数は各角度関数の符号領域によって異なり、1位相・1球殻当たりの上限 2NθNϕ2N_\theta N_\phi 未満となる。

cleanupではrequestAnimationFrameを停止し、ResizeObserverとOrbitControlsを解除する。scene graphを走査してGeometry、Material、 軸ラベルのCanvasTextureをdisposeし、最後にWebGLRendererをdisposeしてcanvasをDOMから除去する。

W4

レスポンシブ配置アルゴリズム

通常軌道群はCSS Gridの列数を構成軌道数へ設定する。d軌道では6仮想列を使い、上段2カードを各3列幅、下段3カードを各2列幅にする。 f軌道も6列を使い、上段と下段は各カード2列幅、中央カードは中央2列だけを占有する。6構成のd2sp3d^2sp^3 は広い画面で3列×2段とする。

d:  (3+3)/(2+2+2),f:  (2+2+2)/(0+2+0)/(2+2+2)d:\;(3+3)/(2+2+2),\qquad f:\;(2+2+2)/(0+2+0)/(2+2+2)
> 1180pxd=2+3、f=3+1+3、d2sp3d^2sp^3=3+3≤ 1180pxd・f以外を2列≤ 760pxd・fも2列≤ 560px全群1列

760px以下では特殊なgrid-column/grid-row指定を解除し、自動配置へ戻す。560px以下では1列へ落とすため、軌道カードを見るための横スクロールは発生しない。 各カードのcanvasはResizeObserverで実寸を取得し、カメラaspectとrenderer寸法を同期する。

Q6

物理的制約と、厳密化する場合の変更点

現実装が計算していない量を明示する。

  • 水素様動径関数 Rnl(r)R_{nl}(r) と陪ラゲール多項式。
  • Bohr半径、実効核電荷、遮蔽、軌道収縮に基づく長さ尺度。
  • 確率密度 ψnlm2|\psi_{nlm}|^2、電子密度、積分確率。
  • 複素球面調和関数の位相、磁気量子数基底、スピン軌道相互作用。
  • 混成軌道 ψh=csψ2s+cxψ2px+cyψ2py+czψ2pz\psi_h=c_s\psi_{2s}+c_x\psi_{2p_x}+c_y\psi_{2p_y}+c_z\psi_{2p_z} の係数規格化と重なり積分。
  • 多電子波動関数、SCF、Hartree–Fock、Kohn–Sham DFT、基底関数展開。

厳密な水素様軌道へ拡張する場合は、3次元格子上で ψnlm=RnlYlm\psi_{nlm}=R_{nl}Y_l^m を評価し、 位相付き等値面 ψ=+c\psi=+cψ=c\psi=-c をMarching Cubesで抽出する方法が自然である。 動径節は Rnl(r)=0R_{nl}(r)=0 から自動的に現れ、現行の相似球殻近似と置き換えられる。

現行曲面から定量的に読み取れるのは実装された多項式の対称性、節集合、符号領域、配置方向である。節半径、電子密度、軌道エネルギーは読み取れない。