rayshader入門 / rayshader-tokyor88

rayshader入門 / rayshader-tokyor88

[出典]
本スライドの図は基盤地図情報ダウンロードサービスの数値標高モデル10mメッシュを加工したものです
https://fgd.gsi.go.jp/download/menu.php

東京都の古い地図の画像は Japanese Historical Maps, East Asian Library - UC Berkeley Collections によって提供されているものです
http://japanmaps.davidrumsey.com/luna/

[参考リンク]
- rayshader: https://www.rayshader.com/
- fgdr: https://uribo.github.io/fgdr/
- Rと3Dプリンターで八ヶ岳のミニチュアを作る。 - 株式会社ホクソエムのブログ: https://blog.hoxo-m.com/entry/2019/12/19/080000
- Some more notes about using Rust code in R packages | Wannabe Rstats-fu https://yutani.rbind.io/post/some-more-notes-about-using-rust-code-in-r-packages/

C95cdabc569dc4c7750d776687f66037?s=128

yutannihilation

September 19, 2020
Tweet

Transcript

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

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

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

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

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

  6. 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();
  7. 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(); という話はしません
  8. (Rustに興味ある方はこちらを)

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

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

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

  12. fgdrで読み込む r <- fgdr::read_fgd_dem( "(基盤地図情報からダウンロードした.xml)", resolution = 10, return_class =

    "terra" ) raster、stars、terra (GitHub版のみ)が選べる
  13. どれを使えばいいの?? • raster: 古くからある定番パッケージ。 rayshader には rastar_to_matrix() という関数 が用意されているので楽。 •

    terra: rasterの後継。速い、けどまだ機能少ない • stars: sf のラスタ版みたいな感じ? sf に慣れて いれば一番使いやすい気がする。
  14. terraを使った場合 r <- project(r, "epsg:3857") • そのままだと座標系が緯度経度になっている が、標高と縮尺を合わせたい(後述)ので、 単位がメートルな座標系に変換する

  15. terraを使った場合 a <- as.array(r, transpose = TRUE) m <- a[,,1]

    m[m < 0] <- NA • 行と列が逆になっている?ことに注意して array → matrix に変換 • 標高がマイナスなところは欠測なのでNAに
  16. rayshaderの基本関数 plot_3d( hillshade = <影や地図画像など>, heightmap = <標高の行列>, ) ここにあらかじめ計算した影の画像を指定する

    ことでリアルな感じに見える
  17. あらかじめ影を計算 hillshade <- m %>% sphere_shade() • 他にも ray_shade() とか

    ambient_shade() とかいろいろ種類がある • texture に任意の画像を指定できるので地図を 重ねたりできる
  18. プロット plot_3d(hillshade, m, theta = -120) ここはmをそのまま 渡せばOK 見る角度を調節する パラメータ

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

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

  21. ラスタ画像の解像度は 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
  22. プロット plot_3d(hillshade, m, theta = -120, zscale = res(r)[1]) xyがz軸の値に

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

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

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

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

  27. 出典・参考リンク • 本スライドの図は基盤地図情報ダウンロードサービス の数値標高モデル10mメッシュを加工したものです https://fgd.gsi.go.jp/download/menu.php • 東京都の古い地図の画像は Japanese Historical Maps,

    East Asian Library - UC Berkeley Collections によって提供されているものです http://japanmaps.davidrumsey.com/luna/
  28. 出典・参考リンク • rayshader https://www.rayshader.com/ • fgdr https://uribo.github.io/fgdr/ • Rと3Dプリンターで八ヶ岳のミニチュアを作る。 -

    株式会社ホクソエムのブログ https://blog.hoxo-m.com/entry/2019/12/19/080000 •