Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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/

yutannihilation

September 19, 2020
Tweet

More Decks by yutannihilation

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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();

    View Slide

  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();
    という話はしません

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide