You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R的RGL设备中用rayshader为3D绘图添加平面2D图像

解决RGL 3D绘图中添加平面2D图像的问题

问题根源是plot_gg会将ggplot中的所有元素(包括annotation_custom的grob)投射到3D表面,导致图像跟着场景变形。以下是可行的代码方案,通过rgl原生的2D叠加功能实现平面图像的固定显示:

完整代码

library(rayshader)
library(sf)
library(ggplot2)
library(grid)
library(magick)

# 读取图像并转为网格对象(grob)
image <- magick::image_read("image.png")
image_grob <- rasterGrob(image, interpolate = TRUE, 
                         width = unit(1.5, 'cm'),
                         x = unit(1, "npc"), y = unit(1, "npc"),
                         hjust = 1, vjust = 1)

# 读取地图并创建不含叠加元素的ggplot
map <- sf::st_read('map/map.shp', quiet = TRUE)
gg <- ggplot(map) +
  geom_sf() +
  geom_sf(aes(fill = AREA), linewidth = 0.7, colour = 'black') +
  scale_fill_gradient('Area', low = 'skyblue', high = 'dodgerblue4', na.value = 'white') +
  theme_bw() +
  theme(axis.line = element_blank(), axis.title = element_blank(),
        axis.ticks = element_blank(), axis.text = element_blank())

# 生成3D场景
plot_gg(gg, height = 8.5, width = 9, 
        multicore = TRUE, windowsize = c(1050, 600),
        offset_edges = TRUE)

# 关键:用rgl的overlay在2D层添加平面图像
rgl::overlay(rgl::currentSubscene(), {
  grid.newpage()
  grid.draw(image_grob)
})

原理说明

  • rgl::overlay()会在RGL设备的独立2D叠加层绘制元素,完全不受3D场景的透视、变形影响,图像会固定在窗口的指定位置(这里是右上角)。
  • 如果需要覆盖整个背景,也可以使用rgl::bgplot3d(),但overlay()更适合添加局部的logo、标注类图像。

内容的提问来源于stack exchange,提问作者Eriza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:10:37