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

如何让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) # 本地窗口生效

本地RGL窗口正常效果

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()
![RMarkdown输出模糊效果](https://i.sstatic.net/ZJ34W4mS.png)

## 问题原因及解决方案
这不是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
相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 09:25:17