雲海を見てみたい（Rのrayshaderを試してみる）

# はじめに

みたことありますか？雲海。

眼下に広がる壮大な雲の海。是非とも人生に一度は見てみたい光景ですよね。

気象条件が揃うと日本でもさまざまな場所で見られます。
北海道ならトマムや斜路湖周辺も雲海が見られるスポットとして有名です。
今年８月に会社の人たちと屈斜路湖行くことがあったので雲海を見られるか期待したのですが、残念ながら見事に地表面を拝む結果となりました。

![IMG_6961.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/b578e930-9ccc-ca52-fd4f-eed9040c4c1b.jpeg)
（綺麗に晴れ渡った屈斜路湖）


どうしても雲海を見たい。
そんな時に紹介したいのが、Rのライブラリ「[rayshader](https://www.rayshader.com/)」。
rayshaderは地形データの3D表現に長けたライブラリです　。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/b353c86c-fb6a-1e5b-6db2-d2066b20f704.png)



地形の立体表現のほか、影や雲の表現も可能なのです。
今回はrayshaderの使い方をまとめながら、屈斜路湖の雲海を再現してみたいと思います。

# マップの作成
```
library(rayshader)

localtif = raster::raster("dem.tif")

# マトリックスの作成
elmat = raster_to_matrix(localtif)

# 画像の出力
elmat %>%
  sphere_shade(texture = "desert",sunangle=0 ,zscale = 1) %>%
  plot_map()

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/4ee2c573-1ec0-3c35-b1c5-f1b65dcfc0aa.png)


# 水域の表現
```
elmat %>%
  sphere_shade(texture = "desert",sunangle=0 ,zscale = 1) %>%
  add_water(detect_water(elmat,zscale=1), color = "desert") %>%
  plot_map()

  ```


  

- sunangle：太陽の方位
- zscale：高さのスケール
- sphere_shadeのtextureとadd_waterのcolor：配色の指定。`imhof1`,`imhof2`,`imhof3`,`imhof4`,`desert`, `bw`,`unicorn`が使えます


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/1f41b508-c481-315b-4af5-875cbf5c0add.png)


# 影をつける
```
elmat %>%
  sphere_shade(texture = "desert") %>%
  add_water(detect_water(elmat), color = "desert") %>%
  add_shadow(ray_shade(elmat, sunaltitude=0,sunangle=200), 0.41) %>%
  plot_map()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/3b6bf3e2-3131-66ea-05fa-36f37191ab88.png)


# 3Dビューアーで表示
3Dビューアーで表示することで、マウスでグリグリ動かすことができるようになります。

```
elmat %>%
  sphere_shade(texture = "desert") %>%
  add_water(detect_water(elmat), color = "desert") %>%
  add_shadow(ray_shade(elmat, zscale = 3), 0.5) %>%
  plot_3d(elmat, zscale = 20,baseshape = "rectangle",fov = 0, theta = 135, zoom = 0.75, phi = 45, windowsize = c(300, 300))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/f609f29e-4ecf-0459-9258-595fc05fd283.png)

baseshapeは、`rectangle`、`circle`、`hex`から基盤の形状を変更できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/c6e3b6f5-a5b3-60fe-9249-26cf25145a8d.png)




# 雲表現
雲の表現は`render_clouds`で追加することができます。
```
elmat %>%
  sphere_shade(texture = "desert") %>%
  add_water(detect_water(elmat), color = "desert") %>%
  add_shadow(ambient_shade(elmat), 0) %>%
  plot_3d(elmat, zscale = 20,baseshape = "hex",fov = 0, theta = 135, zoom = 0.75, phi = 45, windowsize = c(300, 300))
render_clouds(elmat, zscale = 6, start_altitude = 100, end_altitude = 200, sun_altitude = 45, attenuation_coef = 2, offset_y = 200,cloud_cover = 0.45, frequency = 0.01, scale_y=3, fractal_levels = 32, clear_clouds = T,baseshape = "hex")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/8a179ba5-1cd3-af93-e243-39e037136bb9.png)



- zscale = 5
- start_altitude：雲の最下層高度
- end_altitude：雲の最上層高度
- sun_altitude：太陽高度（0〜90で指定）
- cloud_cover = 雲の多さ（0~1で指定）
- scale_y=3, fractal_levels = デフォルトは１６。値が高いほど構造が細かくなるが、計算に時間がかかります
そのほかのパラメータについてはドキュメントをご覧ください。

https://www.rayshader.com/reference/render_clouds.html


# 地図の装飾
```
# スケールバー
render_scalebar(limits=c(0, 5, 10),label_unit = "km",position = "W", y=50,scale_length = c(0.3,0.9))

#コンパス
render_compass(position = "N",altitude = 200)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/a202c5a9-ae0a-2acc-0264-d4b6d15bd25a.png)



以上、rayshader活用して、無事に屈斜路湖の雲海を拝むことができました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/982645e2-9520-fe49-d3ac-796afb743122.png)

めでたし、めでたし
（いつかはちゃんと本物の雲海を見てみたいな）