为什么你的渲染图看起来平淡?rayshader_portraits相机参数与高度夸张z值调优10个技巧
2026/8/22 14:29:19 网站建设 项目流程

为什么你的渲染图看起来平淡?rayshader_portraits相机参数与高度夸张z值调优10个技巧

【免费下载链接】rayshader_portraits项目地址: https://gitcode.com/gh_mirrors/ra/rayshader_portraits

用 R 的 rayshader 包做阴影浮雕地图时,很多人渲染出的图"平"得像一张平面图。其实 rayshader_portraits 这个仓库就是答案库——它收录了上百张美国国家公园与美国各州人口密度渲染图的完整代码。今天我们把作者调优相机参数(phi、theta、zoom)与高度夸张 z 值的 10 个技巧拆开讲,让你快速做出有立体感、有质感的渲染图。

先搞清楚:两个"z"不是同一个东西

新手最容易混淆的点,项目里其实有两个 z:

参数所在函数作用
z = 10~14elevatr::get_elev_raster()DEM 数据分辨率,越大越精细、越耗时
z = resrayshader::plot_3d()高度夸张系数,值越小高度越夸张

这个区分在 R/portraits/bryce_canyon/render_graphic.R 中写得非常清楚:数据下载时z <- 14是全量分辨率,而plot_3d中的z才是控制山"耸不耸"的旋钮。

技巧 1-3:迭代速度优先的 z 值策略

技巧 1:迭代期先用z = 10,出图再拉满

模板代码 R/templates/elevation/render_graphic.R 默认z <- 10。原因很实际:分辨率越高,矩阵越大,每次调整视角都要等更久。等构图满意了,再把 z 提到 14 渲染终稿。

技巧 2:用resize_matrix()压缩数据快速试参数

不想降 z 的话,作者给了另一个方案:

small <- resize_matrix(mat, .25)

数据缩小到 1/4,试相机角度时响应飞快,构图确定后再换回全量矩阵。

技巧 3:高度夸张用"相对值"而不是拍脑袋

看 R/portraits/zion/render_graphic.R 第 91-94 行,作者没有写死一个数字,而是从数据本身算夸张系数:

res <- mean(round(terra::res(zelev))) / 5 # 约为数据分辨率的 5 倍

z = res传入plot_3d(),夸张程度与地块范围自动匹配——换成任何地图都不用重调。想更夸张就把除数从 5 调小,想更自然就调大。

技巧 4-6:相机参数 phi、theta、zoom 的调法

render_camera()是整条流水线里最重要的一个函数,三个参数各司其职:

render_camera(phi = 80, zoom = 1, theta = 0)

技巧 4:用phi控制俯仰角——立体感的总开关

phi就是太阳角度般的俯仰角:

  • phi = 90:正上方俯视,标准"地图感"
  • phi越小:越接近侧视(0 = 完全侧面剖视),立体感越强

翻一翻仓库里的实战案例:拱门、锡安这类峡谷图用phi = 90保持地理可读性(见 R/portraits/arches/render_graphic.R);而阿拉斯加、加州这种想强调山势的图,直接把phi压到 35,配zoom = 0.95,地形立刻"站起来"了(见 R/portraits/california/render_graphic.R)。

技巧 5:用theta旋转构图,让边界更"顺眼"

theta = 0保持北朝上,但很多时候轻微旋转 10~20 度能让地图轮廓和画幅更贴合:

  • 亚利桑那:render_camera(phi = 60, zoom = .65, theta = 0)
  • 阿拉巴马:phi = 45, theta = -10
  • 加州:theta = 60,大胆旋转突出海岸线

技巧:旋转后配合zoom < 1防止地图顶出画面,这是仓库里几乎所有theta ≠ 0的图都遵守的搭配。

技巧 6:zoom是最后的构图微调旋钮

zoom只决定"地图占画面多大":0.5留出大量白边适合加文字,1是默认充满。作者常用zoom = 0.7(如 R/portraits/bryce_canyon/render_graphic.R 第 103 行)给标题和标注留空间,之后由markup.R补上文字。

技巧 7-8:灯光与阴影决定"高级感"

技巧 7:shadowdepth决定阴影落地的位置

shadowdepth是阴影"地面"的海拔,与数据同单位。作者的通用做法(见 zion 脚本第 89 行):

shadow_depth <- min(mat, na.rm = TRUE) - 500 # 最低点再往下 500 英尺

设得离数据太近,山体像"浮空";设得太远,阴影拖得过长、画面发灰。

技巧 8:HDR 环境光 +intensity_env+rotate_env

这是区分"平淡"和"出片"的关键一步。终稿渲染时关闭普通光源,改用 HDR 环境贴图:

render_highquality( outfile, samples = 300, light = FALSE, environment_light = "assets/env/phalzer_forest_01_4k.hdr", intensity_env = 1.5, # 调亮/调暗 rotate_env = -20 # 逆时针旋转光源 )

rotate_env相当于转"太阳"方向,阴影走向一变,山脊的明暗节奏完全不同——同一片地形,转 90 度就是另一张图。

技巧 9-10:终稿渲染与工程化收尾

技巧 9:长渲染前先写一张测试 PNG

render_highquality()跑起来可能要几个小时。作者的保险动作(zion 脚本第 163-165 行):先png::writePNG(matrix(1), outfile)测试输出路径能不能写,再正式渲染,避免几小时后才发现路径错了。另外samples = 300是作者验证过的下限,sobol 采样在 256 以上才稳定。

技巧 10:把调好的参数存进header.rds,文字交给markup.R

每调好一组参数,仓库的约定是立刻存档(map、调色板、z 值、输出文件名、坐标)到各地图目录的header.rds,例如 R/portraits/zion/header.rds。之后 R/portraits/zion/markup.R 读取这份配置,用{magick}叠加标题文字,并导出高清图与适配社交平台的小图两份。参数可追溯,改稿时不用重新盲调。

总结:一张速查表

症状调整方向
画面太平、没立体感降低phi(如 80 → 45)、缩小plot_3dz
山体过于夸张调大plot_3dz(如 res/5 → res/3)
构图拥挤zoom(0.7~0.85),或用theta旋转贴合画幅
阴影拖太长发灰减小shadowdepth与数据的距离
明暗没层次换 HDR 环境光,调rotate_envintensity_env
每次试参都慢迭代期用z = 10resize_matrix(mat, .25)

照着 R/templates/elevation/render_graphic.R 的模板起步,再对照 R/portraits/ 下上百个地图目录的实战参数,你会发现:一张"出片"的渲染图,本质就是 phi、theta、zoom 三个相机参数和 z 值夸张系数在反复迭代中找到了平衡点。

【免费下载链接】rayshader_portraits项目地址: https://gitcode.com/gh_mirrors/ra/rayshader_portraits

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询