Slide 1

Slide 1 text

rayshader入門 2020/9/19 Tokyo.R#88 @yutannihilation

Slide 2

Slide 2 text

ドーモ! ● @yutannihilation ● 某メッセージングアプ リの会社でデータサイ エンティスト見習い ● 好きな言語: R、Rust、忍殺語

Slide 3

Slide 3 text

最近の趣味: 三次元と戯れる

Slide 4

Slide 4 text

WebGPU ● 3DグラフィックスAPI戦乱の世 ● OpenGL、Vulkan、Direct3D、Metal、 WebGL… ● portabilityと速度がそこそこ両立できる やつがほしい!ということでできたやつ

Slide 5

Slide 5 text

WebGPUで遊ぶには? ● wgpu: Mozilla陣営、Rust実装 ● Dawn: Google陣営、C++実装 ※「Web」とついてるけど別にウェブブ ラウザ専用ではない

Slide 6

Slide 6 text

Rustを覚えましょう! #[no_mangle] pub extern fn rev_slice(s: Slice) -> Slice { // convert from Slice to Rust slice let s = unsafe { std::slice::from_raw_parts_mut(s.data, s.len as _) }; let mut v = s.to_vec(); v.reverse(); let len = v.len(); let v_ptr = v.as_mut_ptr();

Slide 7

Slide 7 text

Rustを覚えましょう! #[no_mangle] pub extern fn rev_slice(s: Slice) -> Slice { // convert from Slice to Rust slice let s = unsafe { std::slice::from_raw_parts_mut(s.data, s.len as _) }; let mut v = s.to_vec(); v.reverse(); let len = v.len(); let v_ptr = v.as_mut_ptr(); という話はしません

Slide 8

Slide 8 text

(Rustに興味ある方はこちらを)

Slide 9

Slide 9 text

Rで三次元と戯れられます

Slide 10

Slide 10 text

rayshader ● 標高データをお手軽に3次元で可視化して くれるパッケージ ● 3D円グラフとかも描ける ● matrix形式のデータを渡す

Slide 11

Slide 11 text

基盤地図情報ダウンロードサービス からデータを入手

Slide 12

Slide 12 text

fgdrで読み込む r <- fgdr::read_fgd_dem( "(基盤地図情報からダウンロードした.xml)", resolution = 10, return_class = "terra" ) raster、stars、terra (GitHub版のみ)が選べる

Slide 13

Slide 13 text

どれを使えばいいの?? ● raster: 古くからある定番パッケージ。 rayshader には rastar_to_matrix() という関数 が用意されているので楽。 ● terra: rasterの後継。速い、けどまだ機能少ない ● stars: sf のラスタ版みたいな感じ? sf に慣れて いれば一番使いやすい気がする。

Slide 14

Slide 14 text

terraを使った場合 r <- project(r, "epsg:3857") ● そのままだと座標系が緯度経度になっている が、標高と縮尺を合わせたい(後述)ので、 単位がメートルな座標系に変換する

Slide 15

Slide 15 text

terraを使った場合 a <- as.array(r, transpose = TRUE) m <- a[,,1] m[m < 0] <- NA ● 行と列が逆になっている?ことに注意して array → matrix に変換 ● 標高がマイナスなところは欠測なのでNAに

Slide 16

Slide 16 text

rayshaderの基本関数 plot_3d( hillshade = <影や地図画像など>, heightmap = <標高の行列>, ) ここにあらかじめ計算した影の画像を指定する ことでリアルな感じに見える

Slide 17

Slide 17 text

あらかじめ影を計算 hillshade <- m %>% sphere_shade() ● 他にも ray_shade() とか ambient_shade() とかいろいろ種類がある ● texture に任意の画像を指定できるので地図を 重ねたりできる

Slide 18

Slide 18 text

プロット plot_3d(hillshade, m, theta = -120) ここはmをそのまま 渡せばOK 見る角度を調節する パラメータ

Slide 19

Slide 19 text

プロット plot_3d(hillshade, m, theta = -120)

Slide 20

Slide 20 text

プロット plot_3d(hillshade, m, theta = -120) 高すぎない...?

Slide 21

Slide 21 text

ラスタ画像の解像度は 1m x 1m とは限らない #> class : SpatRaster #> dimensions : 856, 1046, 1 (nrow, ncol, nlyr) #> resolution : 13.29884, 13.29884 (x, y) #> extent : 14847237, 14861148, 4220655, 4232038 #> coord. ref. : +proj=merc +a=6378137 +b=6378137 +lat_ #> data source : memory #> names : lyr.1 #> min values : -9999

Slide 22

Slide 22 text

プロット plot_3d(hillshade, m, theta = -120, zscale = res(r)[1]) xyがz軸の値に 対して何倍か ラスタの解像度を 取得する関数

Slide 23

Slide 23 text

プロット plot_3d(hillshade, m, theta = -120, zscale = res(r)[1])

Slide 24

Slide 24 text

その他 ● plot_gg()でggplot2を3Dにできる ● LiDARデータの可視化が面白そうだけど、 オープンデータはほぼ米国しかなさげ? ● どうもrglとWaylandの相性が悪い?のか 自分の環境ではうまく動かない関数も多い

Slide 25

Slide 25 text

その他 ● rayrender: 3Dお絵描きパッケージ

Slide 26

Slide 26 text

まとめ ● rayshaderパッケージを使うと標高データ を手軽にかっこよく可視化できる ● 標高データは日本のやつだと基盤数値情報 ダウンロードサービスから入手できる

Slide 27

Slide 27 text

出典・参考リンク ● 本スライドの図は基盤地図情報ダウンロードサービス の数値標高モデル10mメッシュを加工したものです https://fgd.gsi.go.jp/download/menu.php ● 東京都の古い地図の画像は Japanese Historical Maps, East Asian Library - UC Berkeley Collections によって提供されているものです http://japanmaps.davidrumsey.com/luna/

Slide 28

Slide 28 text

出典・参考リンク ● rayshader https://www.rayshader.com/ ● fgdr https://uribo.github.io/fgdr/ ● Rと3Dプリンターで八ヶ岳のミニチュアを作る。 - 株式会社ホクソエムのブログ https://blog.hoxo-m.com/entry/2019/12/19/080000 ●