- Published on
カラビ・ヤウ多様体を可視化
- Authors
- Name
- Eito YONEYAMA
- @ynym_8
NOTE
本記事には複数の PNG 画像や GIF アニメーションが含まれています. ファイルサイズの関係で, 読み込みに時間がかかったり, GIF の再生がスムーズでない場合がありますのでご了承ください.
方針
基本的に, Visualizing Calabi-Yau Manifolds に従ってカラビ・ヤウ多様体を描画する.
以下を満たす複素数 の集合を 次元空間に投影する.
を満たす は媒介変数 を用いて以下のように表現できる.
ここで,
また, は位相であり, 以下のように表現できる.
しかし, 現状では の集合は 次元であるため, の次元を削減し, 次元空間上の点
に投影する. ただし, .
実装
パッケージの読み込み及びフォント設定
using Plots
using LaTeXStrings
plot_font = "Computer Modern"
default(fontfamily=plot_font, linewidth=1, label=nothing, grid=true)
3次元空間上の点を計算
function coordinate(x, y, n, k1, k2, a)
z1 = exp(im * 2 * π * k1 / n) * (cos(x + im * y))^(2 / n)
z2 = exp(im * 2 * π * k2 / n) * (sin(x + im * y))^(2 / n)
return real(z1), real(z2), imag(z1) * cos(a) + imag(z2) * sin(a)
end
3次元空間に描画
次元空間への描画において, を頂点とする短形を描画することで曲面を描画する.
function calabi_yau(n, a)
dx = π / 100
dy = π / 100
x_vals = Float64[]
y_vals = Float64[]
z_vals = Float64[]
@inbounds for k1 in 0:n-1
for k2 in 0:n-1
for x in 0:dx:π/2
for y in -π/2:dy:π/2
x1, y1, z1 = coordinate(x, y, n, k1, k2, a)
x2, y2, z2 = coordinate(x + dx, y, n, k1, k2, a)
x3, y3, z3 = coordinate(x + dx, y + dy, n, k1, k2, a)
x4, y4, z4 = coordinate(x, y + dy, n, k1, k2, a)
push!(x_vals, x1, x2, x3, x4)
push!(y_vals, y1, y2, y3, y4)
push!(z_vals, z1, z2, z3, z4)
end
end
end
end
plot3d(x_vals, y_vals, z_vals, seriestype=:scatter, marker=false, legend=false, size=(800, 800))
end
実行
として実行する.
calabi_yau(3, π/2)

の場合を比較すると以下のようになる (ただし, ).
a = 1.95
cy1 = calabi_yau(2, a)
cy2 = calabi_yau(3, a)
cy3 = calabi_yau(4, a)
cy4 = calabi_yau(5, a)
plot(cy1, cy2, cy3, cy4, layout=4, title=[L"n=2" L"n=3" L"n=4" L"n=5"], dpi=300)

見づらい...
3Dモデル作成
WARNING
ここから先はほとんど Julia 関係ないです...
先ほどのコードを修正して, 3Dデータ (.obj
) を生成する.
Code (Solid)
using MeshIO
using FileIO
using GeometryBasics
function coordinate(x, y, n, k1, k2, a)
z1 = exp(im * 2 * π * k1 / n) * (cos(x + im * y))^(2 / n)
z2 = exp(im * 2 * π * k2 / n) * (sin(x + im * y))^(2 / n)
return real(z1), real(z2), imag(z1) * cos(a) + imag(z2) * sin(a)
end
function save_calabi_yau_to_obj(x_vals, y_vals, z_vals, filename)
points = [Point3f0(x, y, z) for (x, y, z) in zip(x_vals, y_vals, z_vals)]
faces = [QuadFace(i, i+1, i+2, i+3) for i in 1:4:length(points)-3]
mesh = GeometryBasics.Mesh(points, faces)
save(filename, mesh)
end
function calabi_yau(n, filename)
a = pi/2
dx = π / 100
dy = π / 100
x_vals = Float64[]
y_vals = Float64[]
z_vals = Float64[]
@inbounds for k1 in 0:n-1
for k2 in 0:n-1
for x in 0:dx:π/2
for y in -π/2:dy:π/2
x1, y1, z1 = coordinate(x, y, n, k1, k2, a)
x2, y2, z2 = coordinate(x + dx, y, n, k1, k2, a)
x3, y3, z3 = coordinate(x + dx, y + dy, n, k1, k2, a)
x4, y4, z4 = coordinate(x, y + dy, n, k1, k2, a)
push!(x_vals, x1, x2, x3, x4)
push!(y_vals, y1, y2, y3, y4)
push!(z_vals, z1, z2, z3, z4)
end
end
end
end
save_calabi_yau_to_obj(x_vals, y_vals, z_vals, filename)
end
calabi_yau(3, "calabi_solid.obj")
3Dホログラム作成
上記で生成した3Dデータ (calabi_solid.obj
) をもとに, Blender でホログラムを作成する. なお, 作成手順に関しては省略する.
3Dホログラム作成の様子



こんな感じの置物が欲しい... 誰か実機を作成してください.