Vala プログラミング

WebGPU プログラミング

おなが@京都先端科学大

Julia Makie.jl によるメッシュ( mesh )の描画

 このブログでは、Julia言語のMakieパッケージを用いたメッシュの描画方法に
ついてまとめています。

1.Julia言語とMakieパッケージ
・Julia言語 https://julialang.org/
 ドキュメント
 https://docs.julialang.org/en/v1/
 https://hshindo.github.io/julia-doc-ja-v0.6/manual/introduction.html
・Makieパッケージ
 https://makie.juliaplots.org/stable/index.html
 https://github.com/JuliaPlots/Makie.jl
・MakieGallery
 https://github.com/JuliaPlots/MakieGallery.jl
(MakieGalleryはしばしばupdateされます。)

2.メッシュの描画
 メッシュの描画には、AbstractPlottingオブジェクトのmesh メソッドを
使用します。
meshメソッドの書き方は以下のようになります。
① mesh(x, y, z)、mesh(xyz)
② mesh(x, y, z, faces)、mesh(xyz, faces)
③ mesh(mesh_object)

以下、MakieGalleryのExamplesを参照して、メッシュメソッドの使い方を見て
いきます。
(1)Colored Triangle
 ① の書き方の例
実行結果
f:id:onagat12:20191016021218p:plain

プログラム
colored_triangle.jl

using Makie

scene = Scene(resolution = (600, 600))

scene = mesh!(scene,
      [(0.0, 0.0), (0.5, 1.0), (1.0, 0.0)],  color = [:red, :green, :blue],
      shading = false
)

・プログラムの編集・実行には、VSCodeを使用しています。
・Windowサイズの調節のため、Sceneの文を入れています。
・sceneの書き換えを行うので、mesh!メソッドを使っています。また、colorと
 shadingのアトリビュートを追加しています。

頂点座標は次のようになっています。
V1:(0.0, 0.0)、V2:(0.5, 1.0)、V3: (1.0, 0.0)

頂点座標の設定は、次のように書くこともできます。

x = [0.0, 0.5, 1.0]
y = [0.0, 1.0, 0.0]
z = [0.0, 0.0, 0.0]

scene = mesh!(scene,
      x, y, z, color = [:red, :green, :blue], shading = false
)

* zを追加して3次元表示をしないと、MethodErrorを起こします。

(2)Colored Mesh(Tetrahedron)
 ② の書き方の例
実行結果
f:id:onagat12:20191016021253p:plain

(座標軸を回転させています。)

プログラム
tetrahedron.jl

using Makie

scene = Scene(resolution = (600, 600))

x = [0, 1, 2, 0]
y = [0, 0, 1, 2]
z = [0, 2, 0, 1]
color = [:red, :green, :blue, :yellow]

# indices interpreted as triangles (every 3 sequential indices)
indices = [1, 2, 3,   1, 3, 4,   1, 4, 2,   2, 3, 4]

scene = mesh!(scene, x, y, z, indices, color = color)

頂点座標(x、y、z)は次のようになっています。
V1:(0, 0, 0)、V2:(1, 0, 2)、V3: (2, 1, 0)、V4: (0, 2, 1)
三角形を描画するための頂点番号は、indicesで設定します。

頂点座標の設定は、次のように書くこともできます。

xyz = [(0, 0, 0), (1, 0, 2), (2, 1, 0), (0, 2, 1)]
scene = mesh!(scene, xyz, indices, color = color)

(2)Textured Mesh
 ③ の書き方の例
実行結果
f:id:onagat12:20191016021311p:plain

プログラム
textured_mesh.jl

using Makie
using FileIO, GLMakie

scene = Scene(resolution = (500, 500))

catmesh = FileIO.load(GLMakie.assetpath("cat.obj"), GLNormalUVMesh)
mesh!(scene, catmesh, color = GLMakie.loadasset("diffusemap.tga"))

 catmeshがmesh_objectです。mesh_objectは、 HomogenousMesh型です。
println()でcatmeshを出力すると、以下のように表示されます。

HomogenousMesh(
      faces: 3954xGeometryTypes.Face{3,GeometryTypes.OffsetInteger{-1,UInt32}},
      texturecoordinates: 2248xGeometryTypes.TextureCoordinate{2,Float32},
     vertices: 2248xPoint{3,Float32},
     normals: 2248xGeometryTypes.Normal{3,Float32}, )

これは GLNormalUVMesh型のmesh_objectです。
・HomogenousMeshは、GeometryTypesパッケージで定義されています。
 (/src/types.jl)このmesh_objectを使用するときは、通常GeometryTypesの
 使用宣言をします。
・GLNormalUVMeshは、Makieの使用宣言だけで利用できます。
 (GLNormalUVMeshは、AbstractPlotting.jlの中でexport宣言されています。)
・HomogenousMeshから派生した様々なMesh型が、/src/typealias.jlで定義
 されています。
 SimpleMesh、NormalMesh、GLNormalMesh、GLNormalUVMeshなどが
 あります。