如何让rgl包的smooth=FALSE参数在RMarkdown中生效?
rgl包smooth=FALSE在RMarkdown中失效的问题解决
问题描述
使用R的rgl包绘制棋盘格曲面时,设置smooth=FALSE在本地rgl窗口(如XQuartz)中能正常显示无平滑的清晰棋盘格,但在RMarkdown编织文档或RStudio查看器中,却呈现模糊的默认平滑效果,smooth=FALSE参数未生效。
本地正常显示的代码及效果
library(rgl) # 创建x、y、z点集 set.seed(123) x <- sort(rnorm(10)) y <- sort(rnorm(10)) f <- function(x,y) {x + y} z <- outer(x,y,f) # 生成x、y轴网格 x.grid <- seq(min(x), max(x), length.out =10) y.grid <- seq(min(y), max(y), length.out =10) # 绘制棋盘格曲面 persp3d(x = x.grid, y = y.grid, z = z, xlab="x", ylab="y", zlab="z", col=rainbow(9), lit = FALSE, smooth = FALSE) # 本地窗口生效

RMarkdown中的问题代码及效果
```{r echo=F} library(rgl) set.seed(123) x <- sort(rnorm(10)) y <- sort(rnorm(10)) f <- function(x,y) {x + y} z <- outer(x,y,f) x.grid <- seq(min(x), max(x), length.out =10) y.grid <- seq(min(y), max(y), length.out =10) persp3d(x = x.grid, y = y.grid, z = z, xlab="x", ylab="y", zlab="z", col=rainbow(9), lit = F, smooth = F) # 此处参数未生效 rglwidget()
 ## 问题原因及解决方案 这不是rgl包的bug,而是`persp3d()`的`smooth`参数仅对桌面OpenGL窗口(如XQuartz)生效,而`rglwidget()`生成的WebGL交互式组件默认启用了多边形平滑渲染,需要单独配置关闭。 ### 解决代码 #### 方法1:修改rglwidget导出参数 通过`options`参数显式关闭多边形平滑: ```r ```{r echo=F} library(rgl) set.seed(123) x <- sort(rnorm(10)) y <- sort(rnorm(10)) f <- function(x,y) {x + y} z <- outer(x,y,f) x.grid <- seq(min(x), max(x), length.out =10) y.grid <- seq(min(y), max(y), length.out =10) persp3d(x = x.grid, y = y.grid, z = z, xlab="x", ylab="y", zlab="z", col=rainbow(9), lit = FALSE, smooth = FALSE) # 关键:导出WebGL时关闭平滑 rglwidget(options = list(polygonSmoothing = FALSE))
#### 方法2:直接设置材质属性 在`persp3d()`中指定`material`参数,确保WebGL识别平滑设置: ```r ```{r echo=F} library(rgl) set.seed(123) x <- sort(rnorm(10)) y <- sort(rnorm(10)) f <- function(x,y) {x + y} z <- outer(x,y,f) x.grid <- seq(min(x), max(x), length.out =10) y.grid <- seq(min(y), max(y), length.out =10) persp3d(x = x.grid, y = y.grid, z = z, xlab="x", ylab="y", zlab="z", col=rainbow(9), lit = FALSE, material = list(smooth = FALSE)) # 直接设置材质的smooth属性 rglwidget()
内容的提问来源于stack exchange,提问作者Mapache
相关产品推荐
相关产品推荐

